1. ホーム
  2. Web制作
  3. CSS

[CSSチュートリアル】Pure CSSカスタム複数行抜け問題(原理から実装まで)

2022-01-21 10:56:07

テキストのオーバーフローをどのように表示するか、またそのニーズは何ですか?一行か複数行か?切り捨て、省略、カスタムスタイル、適応的な高さ?ここに答えがあります。複数行の省略を明らかにするために、原理から実装まで順を追って説明します。まずは、最もシンプルな1行のはみ出し省略である

ウォームアップ、一行抜け

これは、あまり魔法を使わない宇宙規模の統一解です

/* Principle: set text to not break lines, hide after overflow, truncate to show ellipsis */
.ellipsis {
  white-space: nowrap;
  text-overflow: ellipsis;
  overflow: hidden;
}

複数行の省略をどのように実装するか?まずは最も単純な line-clamp 始めましょう。

最もシンプルな複数行の省略、ラインクランプ

CSS属性で -webkit-line-clamp ブロックコンテナの内容を指定された行数に制限することができます。

.ellipsis {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

属性は -webkit プレフィックスは、物事が単純ではなさそうなことを教えてくれる。そう、それは webkit カーネルは、非常にモバイルフレンドリーです。Android 2.3+、IOS 5.0+の端末では上記のコードをそのまま放り込めば問題ないのですが、PCで使う場合は互換性の問題に注意する必要があります。

PCとの互換性の問題に加え line-clamp そのため、省略記号の後にテキスト、矢印、その他のカスタムスタイルを追加する必要がある場合は、フロートなど他のオプションを検討する必要があります。

魔法の浮き輪「フロート

えっ!フロートで複数行の省略も実現できるんですか?はい、ここでは3つのフロートボックスを使って複数行の省略をシミュレートしています。まず、右側にフロートする3つのボックス(テキストボックス、プレースホルダーボックス、カスタムスタイルの省略ボックス)を用意し、原理をわかりやすくするために、ボックスに異なる背景色を追加しています。

<div class="box">
  <! -- text box -->
  <div class="box__text"> Tencent enriches the lives of Internet users with technology. Through communication and social software WeChat and QQ, it facilitates users' connections and helps them connect to digital content and lifestyle services at the snap of a finger. </div>
  <! -- placeholder box -->
  <div class="box__placeholder"></div>
  <! -- Custom omitted boxes -->
  <div class="box__more">... Expand</div>
</div>

<style>
  .box__text {
    width: 100%;
    height: 60px;
    line-height: 20px;
    background-color: pink;
    float: right;
  }

  .box__placeholder {
    width: 60px;
    height: 60px;
    background-color: gray;
    opacity: 0.8;
    float: right;
  }

  .box__more {
    width: 60px;
    text-align: right;
    background: yellow;
    float: right;
  }
</style>

次に、テキストボックスの左外側のマージンをマイナスにして、位置の調整を開始します。これは、ちょうどプレースホルダーボックスの幅になります。

.box__text {
  margin-left: -60px;
}

これにより、プレースホルダー・ボックスのためのスペースが確保され、テキスト・ボックスと並んで左側にフロートすることになります。

上の画像では、テキストボックスの高さがプレースホルダーボックスの高さより低いため、1行目の高さはプレースホルダーボックスの高さとなり、1行目にはカスタム省略ボックスのためのスペースがなく、2行目にのみ配置することが可能です。テキスト ボックスの高さがプレースホルダー ボックスの高さより大きい場合(たとえば、テキストを 4 行で表示する場合)を想像してください。

1行目の高さはテキストボックスで押さえられ、1行目には省略されたボックスが入り込む余分なスペースができます。

すごーい! 次のステップは、プレースホルダーボックスと同じ行の右側に省略されたボックスを配置するだけです。

.box__more {
  position: relative;
  left: 100%;
  transform: translate(-100%, -100%);
}

背景色を削除し、コンテナをオーバーフロー非表示に設定し、省略されたボックスにテキスト色とグラデーションを追加して、少し修正します。

.box {
  position: relative;
  overflow: hidden;
}

.box__more {
  color: #1890ff;
  background-image: linear-gradient(to left, white 40%, rgba(255, 255, 255, 0.8) 70%, transparent 100%);
}

要約すると、これは実際にfloatとBFCの原理を利用しています。

外側のボックスは overflow: hidden BFCを作成する、フローティングボックスの領域がBFCと重ならない、フローティング要素がBFCの高さの計算に関与する、フローティングボックスが現在の行の先頭または末尾にフローティングする、いくつかの位置決め技術を使用すると、複数行の省略の効果をシミュレートすることができます。

フローティングソリューションの利点は明確である。

  • PC、モバイルの主要ブラウザに対応した高い互換性
  • グラデーションを用いたカスタムテキスト省略スタイルに対応

楕円の領域は基本的にフローティングボックスなので、重なりを防ぐためにここにグラデーションが必要です。複雑な背景色を持つ一部の領域や、より強いカスタム楕円のニーズ(楕円を矢印や画像として定義するなど)には、圧倒的に見えるようになってきています。

省略されたスタイルのフルカスタマイズを実現する他の方法はないのでしょうか?

はい、カスタム省略ボックスは開いたままにしてください。

では、どのように脇を固めるのか?それは line-clamp . その line-clamp 切り捨てられた省略記号 ... ちょうど、プレースホルダーに役立つように、どうにかしてデフォルトの省略記号を隠して、カスタムフローティングボックスに置き換えることができれば、うまくいくのではないでしょうか!?これが、次に取り上げるシナリオです。

フルカスタマイズ、フローティング+ラインクランプ

上記の考え方を整理してみると、以下の3つのポイントがあります。

の助けを借りて line-clamp デフォルトの省略記号、カスタム省略記号ボックスの位置を予約し、位置決め技術によって予約位置をカスタム省略記号ボックスで置き換えてデフォルトの省略記号を隠す方法を見つける。

それぞれを順番に見ていくと、まず予約位置である line-clamp デフォルトの省略記号の大きさは、フォントサイズによって決まります。 font-size そのため、フォントサイズを調整することで、予約位置の大きさを制御することができます。ここでは、省略記号の大きさがフォントサイズにのみ影響されるようにするため、行の高さとテキストの間隔をリセットするために

.box__text {
  position: relative;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  font-size: 60px;
  line-height: 0;
  letter-spacing: 0; /* Resets line height and text spacing to ensure that ellipsis occupancy is only affected by font size */
  color: red; /* For demonstration purposes, we give the ellipsis a color first */
}

これにより、テキストボックスのフォントサイズのみを調整することで、予約省略ボックスの位置の大きさを制御することができます。このため font-size は継承されるので、その後、子ボックスをインライン化してフォントサイズをリセットします。

<div class="box__text">
    <div class="box__inner">
      Tencent enriches the lives of Internet users with technology. Through its communication and social networking software WeChat and QQ, Tencent facilitates users' connections and helps them connect to digital content and lifestyle services at the snap of a finger.
    </div>
</div>

<style>
  .box__inner {
    font-size: 16px;
    line-height: 20px;
    color: #000;
    vertical-align: top;
    display: inline;
  }
</style>

次のステップでは、省略記号を隠す方法を探します。これは、透明度や色の透明度を設定することで比較的簡単に行うことができます。

.box__text {
  opacity: 0;
  color: transparent;
}

省略記号が予約されたので、カスタム省略記号ボックスを予約された位置に配置する方法を考えなければなりませんが、どうすればいいでしょうか?あるいはフロートさせるか。を設定するので -webkit-line-clamp テキストボックスの高さを保持できない原因となっている、テキストの余分なコピーをレンダリングして高さを保持することで、位置決めにフロートを使用することができます。

高さ対応テキストをレンダリングするためのコンテナとして、絶対位置のボックスを用意する。

<div class="box__abs">
    <div class="box__fake-text">
      Tencent enriches the lives of Internet users with technology. Through its communication and social networking software WeChat and QQ, it facilitates users' connections and helps them connect to digital content and lifestyle services at the snap of a finger.
    </div>
    <div class="box__placeholder"></div>
    <div class="box__more">... Expand</div>
</div>

<style>
  .box__abs {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
  }
</style>

次に、先ほどお話した3つのフローティングボックスを使って、複数行のはみ出し省略を実装します

.box__fake-text {
  width: 100%;
  margin-left: -60px;
  line-height: 20px;
  float: right;
  color: transparent; /* text is meant to brace the height, with float to achieve multi-line overflow omission */
}

.box__placeholder {
  width: 60px;
  height: 60px;
  float: right;
}

.box__more {
  position: relative;
  left: 100%;
  transform: translate(-100%, -100%);
  width: 60px;
  text-align: right;
  color: #1890ff;
  float: right;
}

なお、ここでのテキストボックスは高さを保持するためのもので、表示する必要はないので、色を透明に設定しています。さて、最後のステップでは、背景色を削除し、外側のボックスをオーバーフローさせて非表示にすることで、次のような最終的な結果が得られます。

line-clamp + 行の高さと文字間隔をリセットし、外側のボックスのフォントサイズを調整するだけです。 font-size エリプシスボックスを任意の矢印、画像、折り目、テキストに置き換えることができるので、もうUIガールが要求する心配はありません)。

今回は純粋なCSSカスタム複数行省略の問題点(原理から実装まで)についてご紹介しましたが、より関連するCSSカスタム複数行省略の内容はHouse of Scriptsの過去記事を検索するか、引き続き以下の関連記事を閲覧してください、今後ともHouse of Scriptsをよろしくお願いします!(`・ω・´)ゞ