質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
jQuery

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

Q&A

解決済

2回答

10186閲覧

jQuery「もっと読む(ReadMore)」の「…(3点リーダー)」付アニメについて

r_iida

総合スコア99

jQuery

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

0グッド

0クリップ

投稿2015/06/26 12:18

jQeryでReadMoreを実装したく、プラグインや自作をしてみたのですが、理想に近いところまではいきつつ、どうしても完成におよばず、皆様のお知恵を拝借いただければ嬉しいです。

<実現したい動き>

  1. テキストのある程度の所(4行程度)以降を「…(3点リーダー)」で省略し、その下に「続きを読む」を表示。

  2. 「続きを読む」をクリックすると「…」が消え、続きのテキストがアニメーションで表示される(slideDownの動き)。その下に「閉じる」が現れる。

  3. 「閉じる」をクリックすると、SlideUpの動きで「1.」の状態に戻る。

<自作jQuery>
http://codepen.io/i_ryo/pen/PqEqmM
CSSのline-clamp(…)と、jQueryのanimationメソッドを組み合わせて書き、理想に近い動きが再現できたのですが、ネックになっているのがテキストの高さの指定です。
テキストによってボリュームが変わるため、実数で「height: "200px"」などと入れると、高さが合いません。ボリュームによる高さの取得する方法がわかればと思っていますが、うまくいかない状態です。

<その他、試したプラグイン>
自作する前に試したプラグインです。もしこちらに近道があれば、それでも解決になって嬉しいです。

・READMORE.JS
http://jedfoster.com/Readmore.js/
もっともシンプルかつ理想的な動きなのですが、「…」が付けられず。
http://stackoverflow.com/questions/536814/insert-ellipsis-into-html-tag-if-content-too-wide
こちらの質問にも「…」が実装ができない、というような回答が見られました。

・Collapser
http://www.aakashweb.com/demos/jquery-collapser/
いくつか用意されているモードの内、「characters(文字数)」モードは「…」が付くのですが、閉じる時にアニメーションになりませんでした。
「lines(行数)」モードはアニメは理想的な動きでしたが、「READMORE.JS」同様に「…」が付けられませんでした。

・jTruncSubstr
http://semooh.jp/jglycy/jquery-plugins/jtruncsubstr
「…」が付き、かつアニメーションという理想的な形でしたが、唯一残念なのは「続きを読む」で表示されるテキスト(class="truncate_more")のCSSがdisplay:blockになり、そこから改行になってしまう部分です。
.truncate_moreがdisplay:inlineになるようカスタマイズを試みたのですが、うまくいかず。

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

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

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

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

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

guest

回答2

0

ベストアンサー

animateする前にheightをautoに戻して実際の高さを取得後、再度高さを元に戻して
実際の高さにanimateするというのはいかがでしょうか。

但し.textで記述されているので.textが複数ある場合は$('.text')で指定せず
clickされた.moreの親から辿って該当の.textを探す必要はあるかと思います。

<自作jQuery>
http://codepen.io/i_ryo/pen/PqEqmM

変更部分

lang

1var h = $(".text").height(); 2$(".text").css({"display":"block","height":"auto"}); 3var hreal = $('.text').height(); 4$('.text').css({height:h+"px"}) 5.animate({ 6 height: hreal+"px" 7 },300);

複数の.textクラスの場合は親からその中の.textを探すバージョンです。

lang

1$(".more").click(function(){ 2 $(this).css("display","none"); 3 var close = $(this).parents('div').find('.close'); 4 close.css("display","block"); 5 var text = $(this).parents('div').find('.text'); 6 var h = text.height(); 7 text.css({display: "block", height: "auto"}); 8 var hreal = text.height(); 9 text.css({height: h+"px"}); 10 text.animate({ 11 height: hreal+"px" 12 },300); 13});

投稿2015/06/27 14:55

編集2015/06/27 15:21
packet1024

総合スコア342

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

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

r_iida

2015/06/29 06:26

ありがとうございます! 教えていただいた方法を試してみます。 またこちらにご報告いたします。
r_iida

2015/06/29 08:36

>複数の.textクラスの場合は親からその中の.textを探すバージョン 上記の方法にて、複数.textへの対応ができました。 ありがとうございました! http://codepen.io/i_ryo/pen/QbaQrE 各テキストのボリュームに対応しており、また、セレクタの指定先を変えることで、 画像付きや入れ子ブロック付きにも対応できそうです。(3つ目の試作) 本当にありがとうございました。
guest

0

こんな感じでいかがでしょうか?
http://codepen.io/anon/pen/Mwrjza

最初に全文の高さを取得し、その後で4行の...付きにする感じです。

投稿2015/06/27 05:02

rossi46hiro

総合スコア992

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

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

rossi46hiro

2015/06/27 05:05

あ、textをクラスにしてるってことは1ページ内で複数ある感じですかね だとこれだとダメですね
r_iida

2015/06/29 06:31 編集

ありがとうございます! ためしにテキストボリュームの違う3つに増やしたところ 高さになっていることを確認いたしました。 テキストの高さを取得する方法がわかり、嬉しく思います。 http://codepen.io/i_ryo/pen/aOEERp (一つ目の高さが基準になっている?) >あ、textをクラスにしてるってことは1ページ内で複数ある感じですかね おっしゃる通り、ニュースサイトやアマゾンレビューのようなイメージで、 記事が複数件が並んでおり、どのボリュームの記事も同じ高さで表示しつつ、 クリックするとページ推移なしに見たい記事だけ全文が表示される、 というような物を作りたく思っていました。 言葉が不足しており、失礼いたしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問