わかりました、問題に対して別のアプローチをとるべきだと思います。
jQueryには基本的に2つの目的があります。
- HTML ページから 1 つ以上の DOM 要素を選択する
- 選択した要素を何らかの方法で操作する
jQuery関数は連鎖可能であるため、これは複数回繰り返すことができます(これは、関数の後に関数の後に関数を呼び出すことができることを意味します...)。
私があなたの問題を正しく理解していれば、あなたはブログ投稿のリストを作成し、それらのティーザーのみを表示しようとしています。
ユーザーが「続きを読む」ボタンをクリックすると、記事全体が展開されます。
覚えておいてください: jQuery は、CSS が行うのと非常によく似た要素を選択します。これにより、特定の要素に対するクエリを非常に簡単に作成できますが、フォーマット上の理由と同様に、適切な方法で HTML を構成する必要があります。
したがって、記事ごとにこの基本的なマークアップを使用することをお勧めします (注意してください、HTML5 が機能しています!)。
<article class="article">
<section class="teaser">
Hey, I am a incredible teaser text! I just introduce you to the article.
</section>
<section class="full">
I am the articles body text. You should not see me initially.
</section>
</article>
article
必要に応じて、要素とsection
要素を要素に置き換えることができdiv
ます。
このマークアップの CSS は次のとおりです。
/* In case you want to display multiple articles underneath, separate them a bit */
.article{
margin-bottom: 50px;
}
/* we want the teaser to stand out a bit, so we format it bold */
.teaser{
font-weight: bold;
}
/* The article body should be a bit separated from the teaser */
.full{
padding-top: 10px;
}
/* This class is used to hide elements */
.hidden{
display: none;
}
マークアップと CSS を作成した方法により、複数の記事を下に置くことができます。
お気づきかもしれませんが、「続きを読む」ボタンや「折りたたむ」ボタンを完全に省略しました。これは意図的に行われます。
誰かが JavaScript を無効にしてブログ サイトにアクセスすると (検索エンジンや JS をサポートしていない古い携帯など)、ロジックが壊れてしまいます。また、「続きを読む」や「折りたたむ」などの多くのテキスト スニペットは、実際には何も行わず、記事の一部ではない場合、関連性がありません。
hidden
css クラスをどこにも適用していないため、最初は記事の本文は隠されていません。それを HTML に埋め込んだとしても、本当に JavaScript を持っていない人は何も読めないでしょう。
jQuery マジックの追加
ページの下部では、Google CDN から jQuery ライブラリを埋め込んでいます。
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
これはベスト プラクティスであり、通常はページの読み込み時間が短縮されます。多くの Web サイトがこの URL を介して jQuery を埋め込んでいるため、既に訪問者のブラウザー キャッシュにある可能性が高く、再度ダウンロードする必要はありません。
http:
URL の先頭の が省略されていることに注意してください。これにより、ブラウザーはページの現在のプロトコルを使用するようになりhttp
ますhttps
。http
プロトコル経由で jQuery lib を Web サイトに埋め込もうとするとhttps
、一部のブラウザは安全でない接続からのファイルのダウンロードを拒否します。
jQuery をページに含めたら、ロジックをスクリプト タグに追加します。通常、ロジックを別のファイルに保存します (これもキャッシュとすべてではありません) が、今回はスクリプト ブロックで問題ありません。
最後にいくつかの JavaScript
full
ティーザーのみを表示したままにする必要があるため、最初は css-class を使用してすべての要素を非表示にします。これは jQuery を使用すると非常に簡単です。
$('.full').hide();
スクリプトの冒頭では、$('.full')
jQuery に次のように伝えています。CSS-class を持つすべての要素が必要full
です。次に、その結果に対して関数を呼び出しますが、そのhide()
目的は明らかです。
次のステップでは、すべてのティーザーの横に「続きを読む」ボタンを追加します。それも簡単な作業です。
$('.teaser').after('<button class="more">Read more</button>');
css-class ですべての要素を選択し、各要素にteaser
いくつかの HTML コードを追加しますafter()
- css-class でボタンmore
。
次のステップでは、この新しく作成されたボタンのすべてのクリックを監視するように jQuery に指示します。full
ユーザーがクリックしたら、クリックされたボタンの後にcss-class を持つ次の要素を展開したいと考えています。
$('.more').on('click', function(){
//"this" is a reference to the button element!
$(this).slideUp().next('.full').slideDown();
});
ふぅ、私たちはここで何をしましたか? まず、this
クリックされたボタンへの参照である を操作したいことを jQuery に伝えました。次に、そのボタンを (もう必要ないので) ゆっくりと非表示にするように jQuery に指示しましたslideUp()
。
すぐに、jQuery に何をすべきかを伝え続けました。next()
要素を ( css-class でfull
) 取り、 で下にスライドさせて表示しslideDown()
ます。
これが jQuery チェーンの力です。
再び隠れる
しかし、待ってください。記事を再び折りたたむことができるようにしたかったのです。そのため、「折りたたむ」ボタンも必要で、JavaScript もいくつか必要です。
$('.full').append('<button class="collapse">Collapse text</button>');
after()
注:このボタンを追加するために関数を使用しませんでしたが、ボタンをその隣ではなくappend()
、 css-class を持つすべての要素の内側に配置する関数を使用しました。full
これは、全文とともに折りたたみボタンも非表示にしたいためです。
ここで、ユーザーがこれらのボタンのいずれかをクリックしたときのアクションも必要です。
$('.collapse').on('click', function(){
$(this).parent().slideUp().prev('.more').slideDown();
});
さて、これは簡単でした: ボタン要素から始めて、そのparent()
要素 (全文を含む要素) にフォーカスを移動し、jQuery に で上にスライドさせてその要素を非表示にするように指示しslideUp()
ます。
more
次に、テキストを展開するときに非表示になっている展開ボタンであるcss-class を使用して、フルテキスト コンテナーから前の要素にフォーカスを移動します。を呼び出して、そのボタンを再びゆっくりと表示しますslideDown()
。
それだけです:) jsBin
に私の例をアップロードしました。