「さらに表示」ボタンによる複数行テキストの切り捨てに関する考察

「さらに表示」ボタンによる複数行テキストの切り捨てに関する考察

最近、たまたまこの小さな要件に遭遇しました。昔、JS を使用してこれを処理したことを覚えていますが、結局のところ、当時の私は若く無知でした。 切り替え操作は Checked 疑似クラスを使用して実装できます。これは少し安価です。重要なポイントは次のとおりです。

  1. 複数行のテキストは切り捨てられ、省略記号が表示されます
  2. 「もっと見る」ボタンはすべてのテキストを展開します
  3. テキストを展開すると、ボタンのテキストは「テキストを折りたたむ」になります。
  4. テキストが切り捨てられたときにボタンが表示されます (テキストが 1 行しかない場合は、表示する必要はありません :sweat:)

質問: テキストオーバーフロー: 省略記号は複数行の切り捨てをサポートしていません。 CSSでボタンのテキストを切り替えるには?ボタンが表示される条件を決めるには?以下で一つずつ説明します。

複数行テキストの切り捨て

既存の HTML 構造が次のようになっていると仮定します。

<div class="box">
  <p>テキストコンテンツ</p>
</div>

1 行を切り捨てる必要がある場合の一般的な方法は次のとおりです。

p {
  テキストオーバーフロー: 省略記号;
  オーバーフロー: 非表示;
  空白: ラップなし;
}

効果は以下のとおりです。

複数行のテキストでは、切り捨てられるテキストの行数を定義するために line-clamp が必要です。

p {
  ディスプレイ: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: 垂直;
  オーバーフロー: 非表示;
}

効果は以下のとおりです。

ボタンをクリックするとすべてのテキストが表示されます

HTML 構造は次のように変換されます。

<div class="box">
  <input type="checkbox" name="toggle" id="toggle" style="display: none;">
  <p>テキストコンテンツ</p>
  <label for="toggle">もっと見る</label>
</div>

ボタンのクリック動作を監視するには、この記事の冒頭で説明した Checked 疑似クラスを使用します。

入力[name="toggle"]:チェック済み{
 & + p {
   -webkit-line-clamp: 設定なし;
 }
}

このように、ユーザーがクリック(選択)すると、すべてのテキストが表示され、選択されていない場合はテキストが非表示になります。

動的ボタンテキスト

論理的に言えば、すべてのテキストが表示された後、ボタンのテキストは「Collapse Text」に切り替わる必要があります。CSS でテキストを変更するにはどうすればよいでしょうか? 実際には、content 疑似要素を使用するだけです。

HTML からテキストを削除し、CSS コントロールに置き換えます。

<label for="toggle"></label>

ラベル {
  &::後 {
    コンテンツ: "もっと見る";
  }
}

同様に、次のようになります。

入力[name="toggle"]:チェック済み{
  & ~ ラベル {
    &::後 {
      コンテンツ: "テキストを折りたたむ";
    }
  }
}

効果は以下のとおりです。

ボタンのスタイルが醜い場合は、自分で調整してください:汗:

ボタンが表示される条件

テキストが 3 行未満の場合、ボタンは不要なので表示されません。

大きな問題があります。インターネットをサーフィンした後、テキストが切り捨てられているかどうかを判断する疑似クラスがないことがわかりました。もしあれば、次のようにすることができます。

p {
 &:切り捨て{
   & + ラベル {
    表示: ブロック;
   }
 }   
}
ラベル {
  表示: なし;
}

切り捨ては切り捨てを意味します。

しかし、それでも、すべてのテキストを表示するとテキストが切り捨てられず、ボタンが消えてしまうため、目的を達成することはできません。

上記は JS で実現したシミュレーション効果です。ソースコードは次のとおりです。

リストを document.querySelectorAll("p");
オブザーバーを新しいResizeObserver(entries => {
  エントリ.forEach(item => {
    item.target.classList[item.target.scrollHeight > item.contentRect.height ? "add" : "remove"]("切り捨て");
  });
});

リスト.forEach(p => {
  オブザーバー.observe(p);
});

原則としては、テキスト要素のサイズ変更を監視し、切り捨てられたクラス名を動的に追加します: joy:

したがって、CSS 内の切り捨てられた疑似クラスは、切り捨てられたクラス:sweat: に変更する必要があります。

p {
 &.切り捨て{
   & + ラベル {
    表示: ブロック;
   }
 }   
}

テキストが切り捨てられていないときにボタンが表示されないのではなく、切り替え時にボタンが常に表示されるようにしたいと考えています。したがって、テキスト要素のサイズ変更を常に監視する必要はありません。必要なのは初期値 (初期化時にテキストが切り捨てられるかどうか) だけです。つまり、監視するのは 1 回だけです。

エントリ.forEach(item => {
  //... 元のコード observer.unobserve(item.target); // モニターを削除します });

または、この API をまったく使用する必要はなく、ページが初期化されたときに 1 回だけ走査して判断するだけです。

リストを document.querySelectorAll("p");

リスト.forEach(項目 => {
  item.classList[item.scrollHeight > item.offsetHeight ? "add" : "remove"]("切り捨て");
});

このようにすると、ページが初期化されるときに、切り捨てられたクラス名を持つ P 要素が自動的に追加され、ボタンを常に表示できるようになります。

拡張機能

たとえば、ボタンのスタイルをカスタマイズしたり、下部に透明なグラデーション マスクを追加したり、切り替え時にトランジション効果を追加したりできます。

要約する

チェックされた疑似クラスは、JS を記述せずに多くのニーズを満たすことができるため、クラスの切り替えに関連するあらゆる操作に使用することを検討できます。

上記は、「詳細を表示」ボタンを使用した複数行テキストの切り捨てについてお伝えしたい内容です。お役に立てれば幸いです。ご質問がある場合は、メッセージを残していただければ、すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。
この記事が役に立ったと思われた方は、ぜひ転載していただき、出典を明記してください。ありがとうございます!

<<:  Docker 経由で Redis 6.x クラスターをデプロイする方法

>>:  このような大画面のデジタルスクロール効果が必要になる場合があります

推薦する

バックアップ データをインポートするときに innodb_index_stats がエラーを報告する場合の主キー競合の解決方法

障害の説明percona5.6、mysqldump フルバックアップ、バックアップデータのインポート...

MySQLで大きなテーブルをエレガントに削除する方法について簡単に説明します

目次1. 切り捨て操作1.1 MySQL truncate はどのような操作を実行しますか? 1.2...

MySQL トランザクション分離レベルの表示と変更の例

トランザクション分離レベルを確認するMySQL では、'%tx_isolation%'...

jsは多次元配列を1次元配列に変換し、それを並べ替えます

目次まず多次元配列の平坦化についてお話しましょう方法 1: flat()方法 2: 空の文字列を連結...

MySQL データベースで機密データの暗号化と復号化を実装する方法

目次1. 準備2. MySQL暗号化関数方式2.1 MySQL 暗号化2.2 MYSQL 復号化3....

データページング効果を実現する js オブジェクト

この記事の例では、データのページング効果を実現するためのjsオブジェクトの具体的なコードを参考までに...

Linux でプロセスを効果的に管理するための 8 つのコマンド

序文プロセス管理の役割:サーバーの健全性状態を判定する: プロセスの状態 (メモリ、CPU 占有率な...

CSS3でシャトル星空のアニメーションを実現

結果: html <canvas id="スターフィールド"><...

MySQL パフォーマンスの最適化: インデックスを効率的かつ正しく使用する方法

実践こそが真実をテストする唯一の方法です。この記事では、インデックスの全体的な使用法についてのみ説明...

Webデザインの経験:ナビゲーションシステムをシンプルにする

<br />友人と話し合っていたとき、フレームワークのレイヤー設計の中で最も核となるのは...

WeChatミニプログラムで検索キーワードを強調表示するサンプルコード

1. はじめにプロジェクトで要件に遭遇したら、データを検索してキーワードを強調表示します。要件を受け...

ウェブのさまざまなフロントエンド印刷方法: CSS はウェブページの印刷スタイルを制御します

CSS は Web ページの印刷スタイルを制御します。 CSS を使用して印刷スタイルを制御します。...

Vue コードの読みやすさに関するいくつかの提案

目次1. コンポーネントをうまく活用してコードを整理する1. UIコンポーネントを抽出する2. モジ...

Mysql で自動増分主キー ID を更新するときに問題が発生しました

目次自動インクリメント ID を更新する理由は何ですか?質問解決方法これは私が知っている問題ですが、...

レム適応の一般的なパッケージ3つについて

序文以前、rem適応についての記事を書きましたが、具体的なパッケージは紹介しませんでした。今日は、よ...