タブで切り替わるお知らせの実装方法

# 今回やりたいこと
お知らせ情報で、タブによって記事が切り替わるお知らせの表示をしたいと思います。（CSSで整えてないので分かりにくいですが:sweat_smile:）
![cgrbc-4dqu5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/52ef8d0f-b49f-b309-d8fa-443ccec93d22.gif)

今からやろうとしている実装は、一般的に**タブパネル**と呼ばれるそうです。
タブパネルの実装には、一般的には、以下の方法が用いられることが多いみたいですね:point_up:

:::note info
* HTML、CSSのみで実装
* HTML、CSS、JavaScriptで実装
:::

それぞれのやり方を簡単に調べてみました。
上記のやり方での実装はしてませんが所感は以下の通りです。

### HTML、CSSのみで実装する方法 所感:thinking::thought_balloon:
以下を参考にしました。
* [HTMLとCSSのみでWebサイト用のタブ切り替え（タブパネル作成）](https://www.bring-flower.com/blog/tab-panel-with-css/)

HTMLとCSSのみの場合、input要素、label要素の理解が必須になりそうなので、お問い合わせフォームなどを作れるくらいの知識がある場合、挑戦してみてもいいかもしれないなと思いました。
しかし、ラジオボタンとタブパネルを同階層に配置する必要があり、**HTMLの構造が不自然になる**ことや、選択されているタブ以外のコンテンツはdisplay: noneで非表示にする影響で、**検索エンジンがコンテンツの構造を理解しにくく**なるなどのデメリットがありそうです。

### HTML、CSS、JavaScriptで実装する方法 所感:thinking::thought_balloon:
以下を参考にしました。
* [素のJavaScriptでタブ切り替え（タブパネル作成）
](https://www.bring-flower.com/blog/tab-panel-with-js/)

切り替わりの動作のみ、JavaScriptで制御するみたいです。
JavaScriptの基本的な知識が必要と思います。JavaScriptを用いたときでは、HTMLの構造が不自然になるデメリットは、解消されます。しかし、選択されているタブ以外のコンテンツはdisplay: noneで非表示にする影響で、**検索エンジンがコンテンツの構造を理解しにくく**なるなどのデメリットは変わらなさそうです。


### どちらがいいかと言われれば
結論として、上記のどちらを採用したいかと言われれば、JavaScriptが無難かなと判断しました。参考サイトでも、JavaScriptで実装する方法を推奨していました。
しかし、今回は**a-blog cmsのモジュール機能を使った方法**で実装しようと思います。

### a-blog cmsのモジュール機能で実装する方法 所感:thinking::thought_balloon:
実際、仕事上でタブパネルを実装する場面があり、復習の意味でも記録しておこうと思います。
モジュールを使っていて便利なのは、**上記で述べたデメリットが解消される**こと、かな？と思います。
JavaScriptも触らなくていいし、コンテンツの構造も気にしなくていい（多分）ので安心してコーディングできます。そして、広汎的なので、表示させたいカテゴリーを変えたいな〜と思ったら、引数の指定で変更が効くのも良いところかと思います。
そして実際にやることは、**スニペットを貼り付けて、引数を指定する**という作業で完結するので、作業の意味を完全に理解するのは難しいけど、作業として覚えてしまえば簡単だなと感じました:relieved:。


## 難しかったなと思ったこと
「引数」と「階層」の指定の理解が難しかったです。
いまだに引数は謎が多いです。

# :white_check_mark:ではやってみよう!
具体的に何をするかを述べます。
a-blog cmsのビルトインモジュールの、以下2つを用いて、実装します。

カテゴリーリスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/3974c431-85a4-99d5-e939-ab15845522ed.png)

エントリーサマリー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/1dd58742-5be2-68e2-25c2-8bff2e3de022.png)

を用いて、各カテゴリーで出力させるエントリーを変更できるようにする。


## :zero:まず準備

カテゴリーの用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/03642be6-68f2-0ddc-4b47-acef16ec712e.png)
子カテゴリーの用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/16da2891-0c7c-d63b-ed4f-abbeb2e4ce9e.png)


カテゴリーに合わせたエントリーの用意。
各カテゴリーで2記事ずつを用意する。



# 手順:small_red_triangle_down:
## :one:テンプレートを用意
newsのディレクトリを作成する。utsuwaテーマのデフォルトのindex.htmlをこの中に複製。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/6d14c1c5-3cbd-794d-cebf-de113fa506a9.png)

index.htmlで、必要なところだけ残す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/5794cde1-23ea-716e-f7e4-4c05f5ff0521.png)
index.htmlの中身。デフォルトを追加変更したのが、赤い枠の箇所です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/564d9a48-0ded-43a5-1c3f-28a0d208a2cf.png)

そして、タブパネル用のカテゴリーリストのスニペットが書かれたファイルを用意して読み込ませ、記事一覧のエントリーサマリーは、いったんデフォルトのものを使い、モジュールIDは指定します。（cssで装飾する場合が多いと思うので、ファイルは別に用意することの方がいいと思いますが、今回は省略します。）


## :two:カテゴリーを切り替える用のモジュールを作成

カテゴリーリストを出力。引数と階層は、以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/3ba6bf28-2971-9855-bd80-6dbc89ca119a.png)

そうすると、以下のようなカテゴリーリストが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/02de7cac-af7c-1970-24e4-ed6108d0743b.png)




## :three:Entry_Summaryを使って、カテゴリーに沿ったエントリーを出力させる
そして、記事を出力するモジュールIDを設定します。
引数と階層は以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/e4d6306b-f0a3-c289-e3b3-b9c8cf75b506.png)

そうすることで、カテゴリーごとに、該当のカテゴリーに属したエントリーを出力させることが出来ます。

こんな感じで遷移します。

![cgrbc-4dqu5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/52ef8d0f-b49f-b309-d8fa-443ccec93d22.gif)


![384el-ot0t1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/cc31d6f5-cf89-a8f1-e4ca-cc385093a1d5.gif)


![016em-s4q08.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638020/f6abb44c-5f66-0369-35a9-0c23b7cbb707.gif)


あとは、見た目を整えれば、即席タブパネルの完成です:raised_hands:

# まとめ
引数への苦手意識がけっこうあるな〜と思いました。
でも、モジュールはすごく便利！:sparkles:
使ったことが無いモジュールにも手を出してみたいです。
一般的なタブパネルの作り方も、参考リンクを読んでいて勉強になりました。role="tab"とかrole="tablist"が理解不足なので、またの機会に勉強します。