上毛印刷株式会社

【JavaScript】クリックでカテゴリ別に表示を出し分け

【JavaScript】クリックでカテゴリ別に表示を出し分け

2023年09月12日
WEBサイト制作
  • #HTML
  • #css
  • #JavaScript
  • #tips

こんにちは!
上毛印刷WEB制作担当のソーヤです。

今回は多くの場面で活用できるカテゴリ別に表示を出し分ける方法をご紹介します。

実装例

  • カテゴリー1
    カテゴリー2
  • カテゴリー2
  • カテゴリー3
  • カテゴリー4
    カテゴリー3
  • カテゴリー1
  • カテゴリー1
    カテゴリー4
  • カテゴリー3
    カテゴリー1
  • カテゴリー3
  • カテゴリー3
    カテゴリー2
  • カテゴリー4
  • カテゴリー4
    カテゴリー1
  • カテゴリー4
    カテゴリー2


上部のボタンをクリックしてもらうとわかると思うのですが、
そのカテゴリ要素が入ったパネルだけ抽出されて表示されていると思います。

HTML例

<ul class="category-list">
    <li class="category-list-item">
        <button class="js-sort js-sort1" data-sort="js-cat1">カテゴリー1</button>
    </li>
    <li class="category-list-item">
        <button class="js-sort js-sort2" data-sort="js-cat2">カテゴリー2</button>
    </li>
    <li class="category-list-item">
        <button class="js-sort js-sort3" data-sort="js-cat3">カテゴリー3</button>
    </li>
    <li class="category-list-item">
        <button class="js-sort js-sort4" data-sort="js-cat4">カテゴリー4</button>
    </li>                
</ul>
<ul class="product-list">
    <li class="product-list-item">
        <span class="js-cat1">カテゴリー1</span>
        <span class="js-cat2">カテゴリー2</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat2">カテゴリー2</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat3">カテゴリー3</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat4">カテゴリー4</span>
        <span class="js-cat3">カテゴリー3</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat1">カテゴリー1</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat1">カテゴリー1</span>
        <span class="js-cat4">カテゴリー4</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat3">カテゴリー3</span>
        <span class="js-cat1">カテゴリー1</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat3">カテゴリー3</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat3">カテゴリー3</span>
        <span class="js-cat2">カテゴリー2</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat4">カテゴリー4</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat4">カテゴリー4</span>
        <span class="js-cat1">カテゴリー1</span>
    </li>
    <li class="product-list-item">
        <span class="js-cat4">カテゴリー4</span>
        <span class="js-cat2">カテゴリー2</span>
    </li>
</ul>

CSS例

ul{
    padding: 0;
    list-style: none;
}
.category-list{
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
}
.category-list-item{
    margin: 0 5px;
}
.js-sort{
    color: #fff;
    border:none;
    border-radius: 8px;
    padding: 5px 12px;
    display: block;
    background-color: rgb(54, 54, 54);
    transition: .4s;
    cursor: pointer;
}
.js-sort:hover{
    opacity: .7;
}
.js-cat1,
.js-sort1{
    background: #f04848;
}
.js-cat2,
.js-sort2{
    background: #4861f0;
}
.js-cat3,
.js-sort3{
    background: #2daf40;
}
.js-cat4,
.js-sort4{
    background: #d7d11d;
}
.product-list{
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
}
.product-list-item{
    width: calc(100% / 5);
    margin: 2px;
    border: 1px solid #aaa;
    padding: 10px;
}
.product-list-item span{
    font-size: 12px;
    color: #fff;
    padding: 5px;
    border-radius: 5px;
}

JavaScript例

window.addEventListener('DOMContentLoaded',function(){
    let sortBtn = document.getElementsByClassName('js-sort');
    let productItem = document.getElementsByClassName('product-list-item');
    let cat1 = document.getElementsByClassName('js-cat1');
    let cat2 = document.getElementsByClassName('js-cat2');
    let cat3 = document.getElementsByClassName('js-cat3');
    let cat4 = document.getElementsByClassName('js-cat4');
    
    for(let i = 0; i < sortBtn.length; i++){
        sortBtn[i].addEventListener('click',function(){
        let catBox = this.getAttribute('data-sort');
            for(let i = 0; i < sortBtn.length; i++){
                for(let a = 0; a < productItem.length; a++){
                    for(let b = 0; b < cat1.length; b++){
                        for(let c = 0; c < cat2.length; c++){
                            for(let d = 0; d < cat3.length; d++){
                                for(let e = 0; e < cat4.length; e++){
                                    switch (catBox){
                                        case 'js-cat1':
                                        productItem[a].style.display = 'none';
                                        cat1[b].parentNode.style.display = 'block';
                                        break;

                                        case 'js-cat2':
                                        productItem[a].style.display = 'none';
                                        cat2[c].parentNode.style.display = 'block';
                                        break;

                                        case 'js-cat3':
                                        productItem[a].style.display = 'none';
                                        cat3[d].parentNode.style.display = 'block';
                                        break;

                                        case 'js-cat4':
                                        productItem[a].style.display = 'none';
                                        cat4[e].parentNode.style.display = 'block';
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },false);
    }
});

switch文で記述しましたが、なんかごちゃごちゃしてしまいましたね・・・
もっとスマートに書けないかなぁ

まとめ

以前、jQueryで組んだものをVanilla.jsに置き換えてみました。
Vanilla.jsを使うとjQueryが本当に便利なものだったと痛感しますね・・・
それだけぬるま湯に浸っていたという証拠ですね。

WEB制作担当ソーヤ

ソーヤ

上毛印刷WEB制作担当
前職は東証プライム企業の本社WEB受託チームにてフロントエンドエンジニアを3年経験。


この記事に対するご意見・ご感想・ご質問等ありましたら、
ぜひ下記フォームにてお送りください。

    お名前必須
    メールアドレス必須
    お問い合わせ内容必須
    PAGE TOP