今回のアコーディオン汎用パーツは、前回よりもコードを簡略化(短く効率がいい様に)させて実装しています。
読者の悩み
こういった疑問に答えます。
本記事の内容
この記事を書いている僕は、フロントエンドエンジニア歴が15年ほど。
web業界からゲーム業界まで数多くのwebサイトやアプリケーションを制作しています。
こういった僕が、分かりやすく解説していきます。
デモページを用意
デモページを用意してますので実際に動きが確認できます。
また、GitHubにも実際のソースコードをアップしているのでクローンできます。
サンプルコードを用意
サンプルコードで実際のコード[HTML / SCSS / jQuery]を確認できてコピペできます。
サンプルコードはSCSSですがCSSを見たい場合は、GitHubにコンパイルされてないCSSファイルがありますのでご覧ください。
デモページとソースコードを確認しながらご覧ください。
ではコードを見ていきます。
骨組みは以下の3つです。
thisの構文
$(this)はイベントの中でそのイベントが起こった要素を取得することができます。
$()の中でthisをクォーテーション('')で囲まないことに注意してください。
$(this)は非常に重要な概念なので覚えておきましょう。
$('.jc-accTrigger').on('click', function () {
$(this).toggleClass('js-active').next('.jc-accContent').slideToggle(400);
︙
});
thisはイメージしにくいので実際のコードで具体例を見てみましょう。
下記のように複数のCSSクラスjc-accTriggerにclickイベントが設定されていた場合、クリックされた時に実際にクリックされたCSSクラスjc-accTriggerにだけ処理を行いたい場合があります。
<div class="c-accordion_Trigger jc-accTrigger">
<div class="c-accordion_Trigger__title">アコーディオンの準備(1)</div>
︙
</div>
︙
<div class="c-accordion_Trigger jc-accTrigger">
<div class="c-accordion_Trigger__title">アコーディオンの準備(2)</div>
︙
</div>
︙
<div class="c-accordion_Trigger jc-accTrigger">
<div class="c-accordion_Trigger__title">アコーディオンの完成</div>
︙
</div>
このようなときはthisを用いて実際にイベントが起こったクラスを取得しましょう。
toggleClassメソッド
toggleClassメソッドは指定したクラス名のCSSがある場合は削除を行い、なければ追加するというメソッドです。
toggle(トグル)は「 同一の操作で二つの状態を交互に切り換えること 」を意味しているので、toggleClassメソッドはクラスの追加とクラスの削除を切り替える仕組みを持つメソッドというイメージです。
$('.jc-accTrigger').on('click', function () {
$(this).toggleClass('js-active').next('.jc-accContent').slideToggle(400);
$(this).next('.jc-accContent').toggleClass('js-active');
$(this).children('.jc-accTrigger_icon').toggleClass('js-active');
});
nextメソッド
jQueryオブジェクトで指定した要素の兄弟要素(同じ階層の要素)で「次の要素だけ」を選択します。
引数のセレクタを設定することで選択する要素を絞ることができます。
$(this).toggleClass('js-active').next('.jc-accContent').slideToggle(400);
$(this).next('.jc-accContent').toggleClass('js-active');
slideToggleメソッド
jQueryオブジェクトで指定した要素が表示されている時は(slideUpの演出で)隠し、隠れている時は(slideDownの演出で)表示します。
第1引数に期間を「ミリ秒」で設定することで、演出の速度を変更できます(期間を1000と設定すれば、1秒かけて要素を消します)。期間を設定しないと400ミリ秒で演出します。また、第2引数にfunctionを設定すると演出が完了した後に実行されます。
$(this).toggleClass('js-active').next('.jc-accContent').slideToggle(400);
1つの処理で「表示/隠す」処理ができるため、初心者にとって非常に便利なメソッドとなっています。
モバイルページでは比較的サイズの小さい画面で情報を効果的に見せる為に、UI/UXの一つとして展開式コンテンツ(アコーディオン)がよく使われます。
展開式コンテンツ(アコーディオン)は隠しコンテンツになるのか?という点について言えば、2019年7月以降、モバイルファーストインデックス (MFI) がデフォルトで適用され評価されるので、初期状態で隠れたコンテンツでも問題はないとGoogleからアナウンスされました。
なので現在は展開式コンテンツ(アコーディオン)でも評価が下がることがないので問題はないと思います。
Googleは特定の実装方法に対する言及はしていませんので、実装方法に関しては問題ないと思いますが、非同期で後からコンテンツを読み込む方法だとさすがのクローラーもスムーズに認識できないのではないかと思われます。
コンテンツが隠れているとクローラーに正しく認識されずインデックスされない(評価されない)のではないかと心配ならば、非同期の方法は避けた方がいいかもしれません。
初期状態では読み込まず、展開時にAjaxで非同期でコンテンツを読み込む方法ではなく、隠したいコンテンツ部分をCSSでdisplay:noneとする方法(jQueryのslideToggleやslideUp/slideDownやhide())が良いと思います。
今回は以上になります。
作成方法が不安な方は是非参考にしていただけると嬉しいです。