🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

6392閲覧

続きを読むを文章量の違うものを想定して複数個実装するとき個別に高さを取得したいです

hass-o

総合スコア19

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/11/27 13:39

編集2020/11/27 14:12

ちょっとしたお知らせ一覧のページを作っています。
その中で本文が一定の行数を超えたら表示が切られ「続きを読む」が表示される機能を実装中つまずき質問させていただきました。
やりたいこととしては主に下記の3点です。

  • 本文が3行以上の場合は「続きを読む」を表示
  • 3行以下の場合は「続きを読む」を非表示
  • 全文表示後に「閉じる」ボタンを表示

https://dezanari.com/jquery-trim-line-height/
こちらのページを参考に「続きを読む」「閉じる」が複数個ある場合も個別で動作するところまではできたのですが、個々のテキスト全体の高さを取得する部分がどうしてもうまくいきません。
ソースは現在、一番最初の高さを取得してしまうため、1つ目の項目が3行以上の場合は以降の項目が短くても「続きを読む」が表示されてしまい、逆に本文が短いと以降も動作しないもしくは2番目以降で1番目より長いものがあると閉じるボタンにかぶさるように表示されてしまいます。

ソースの「var textHeight = $text.height();」の部分を個々に所得して動作させるにはどうしたらいいでしょうか?

js

1<script> 2$(document).ready(function(){ 3 // 続きを読む 4 var $text = $('.more_txt'); // 本文 5 var $txt_open = $('.txt_open'); // 続きを読む 6 var $txt_close = $('.txt_close'); // 閉じる 7 var lineNum = 3; 8 var textHeight = $text.height(); // テキスト全体の高さ取得 9 var lineHeight = parseFloat($text.css('line-height')); // line-height取得 10 var textNewHeight = lineHeight * lineNum; // 指定行数までの高さ取得 11 12 if (textHeight > textNewHeight){ // 指定行数以上で作動 13 $text.css({ 14 height: textNewHeight, 15 overflow: 'hidden', 16 }); 17 18 $txt_open.click(function(){ // 続きを読む 19 $(this).next($txt_close).css('display', 'block'); // 閉じるを表示 20 $(this).css('display', 'none'); 21 $(this).prev(".more_txt").css({ 22 'height': textHeight, 23 'overflow': 'visible', 24 }); 25 }); 26 27 $txt_close.click(function(){ // 閉じる 28 $(this).prev($txt_open).css('display', 'block'); // 続きを読むを表示 29 $(this).css('display', 'none'); 30 $(this).prev().prev(".more_txt").css({ 31 height: textNewHeight, 32 overflow: 'hidden', 33 }); 34 }); 35 } else { 36 $txt_open.hide(); // 3行以下は非表示 37 } 38}); 39</script>

html

1<div> 2 <div class="box"> 3 <div class="more_txt"> 4 本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。 5 </div> 6 <a href="javascript:void(0)" class="txt_btn txt_open">続きを読む<ion-icon name="chevron-down-outline"></ion-icon></a> 7 <a href="javascript:void(0)" class="txt_btn txt_close">閉じる<ion-icon name="chevron-up-outline"></ion-icon></a> 8 </div> 9</div> 10 11<div> 12 <div class="box"> 13 <div class="more_txt"> 14 本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。<br> 15 本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。<br>本文が入ります。 16 </div> 17 <a href="javascript:void(0)" class="txt_btn txt_open">続きを読む<ion-icon name="chevron-down-outline"></ion-icon></a> 18 <a href="javascript:void(0)" class="txt_btn txt_close d_none">閉じる<ion-icon name="chevron-up-outline"></ion-icon></a> 19 </div> 20</div> 21 22<div> 23 <div class="box"> 24 <div class="more_txt"> 25 本文が入ります。<br>本文が入ります。 26 </div> 27 <a href="javascript:void(0)" class="txt_btn txt_open">続きを読む<ion-icon name="chevron-down-outline"></ion-icon></a> 28 <a href="javascript:void(0)" class="txt_btn txt_close d_none">閉じる<ion-icon name="chevron-up-outline"></ion-icon></a> 29 </div> 30</div>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gpsoft

2020/11/27 13:59

JSの$(close)と$(open)のところでエラーが出ますが、 $txt_closeと$txt_openの間違いですかね?
hass-o

2020/11/27 14:12

すみません、そちら質問時に書き起こした際に間違えていたみたいです。 ご指摘ありがとうございます、ただいま修正しました。
guest

回答1

0

ベストアンサー

CSSとして

css

1.d_none { 2 display: none; 3}

を補いました。

また、最初の「閉じる」アンカーにd_noneクラスが足りなかったので、追加しました。

html

1<a href="javascript:void(0)" class="txt_btn txt_close d_none">閉じる<ion-icon name="chevron-up-outline"></ion-icon></a>

で、本題ですが、

ソースの「var textHeight = $text.height();」の部分を個々に所得して動作させるにはどうしたらいいでしょうか?

ここですよね。

javascript

1var $text = $('.more_txt'); // 本文

↑ここで、$textには、3つの.more_txtがセレクトされてるので、そのそれぞれに対して、「後続の処理(高さを取得したり、クリックイベントのハンドラを仕込んだり)」を繰り返せば良いです。

それには、each()を使います。

javascript

1$text.each(function(){ 2 3 // ※1 4 5});

3つの.more_txtの1つ1つに対して、「※1」が繰り返し実行されます。

よって、「※1」の部分に、「後続の処理」を書きます。今のコードの、var $txt_open = $('.txt_open');以降が、ほぼそのまま使えますよ。ただし、以下の点は手直しが必要です。

(1)$textの代わりに、$(this)を使う。

javascript

1var textHeight = $(this).height(); // テキスト全体の高さ取得

↑こんな感じです。each()の内部では、$(this)が、「3つの.more_txtのうちの、いま着目してる1つ」を指します。

(2)$txt_openは、$(this)を起点にして探す。

javascript

1var $txt_open = $(this).nextAll('.txt_open'); // 続きを読む

↑ここでもし、$txt_open = $('.txt_open')としてしまうと、3つの「続きを読む」がセレクトされてしまうので困ります。

(3)$txt_closeも、$(this)を起点にして探す。

javascript

1var $txt_close = $(this).nextAll('.txt_close'); // 閉じる

以上で、一応、動くと思いますので、
あとは、お好みでリファクタリングしてみて下さい。

投稿2020/11/27 14:45

gpsoft

総合スコア1323

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hass-o

2020/11/27 15:00

それぞれ個別で動くようになりました、ありがとうございます! cssの部分は実際使うソースにはあったのですが質問時に省いてしまい配慮が足りずすみません、こちらについても丁寧な解説ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問