TOP > Article >

素のJavaScriptでタブメニューを作る

Engineer

|

Imai

素のJavaScriptでタブメニューを作る

公開日:2023/12/30

今回もjQueryを使用せずに素のJavaScriptのみを使用してタブメニューを実装していきます。

完成demはこちら。

まずはHTMLから書いていきます。

    <!-- タブメニュー -->
    <section class="tab">
        <ul class="tab__menu">
            <li class="tab__menu-item js-tab tab__active" data-id="test01">タブ1</li>
            <li class="tab__menu-item js-tab" data-id="test02">タブ2</li>
            <li class="tab__menu-item js-tab" data-id="test03">タブ3</li>
        </ul>
        <ul class="tab__content">
            <li class="tab__content-item js-content tab__active" id="test01"><img src="img/test01.webp" alt=""></li>
            <li class="tab__content-item js-content" id="test02"><img src="img/test02.webp" alt=""></li>
            <li class="tab__content-item js-content" id="test03"><img src="img/test03.webp" alt=""></li>
        </ul>
    </section>

次にcssを書きます。

/* タブメニュー */
.tab {
    width: 700px;
    margin: 0 auto;
    padding: 100px 0;
}

.tab__menu {
    display: flex;
    justify-content: center;
}

.tab__menu-item {
    width: 150px;
    text-align: center;
    padding: 15px 0;
    border-radius: 10px 10px 0 0;
}

.tab__menu-item + .tab__menu-item {
    margin: 0 0 0 -1px;
}

.tab__menu-item-link {
    display: block;
}

.tab__content {
    width: 700px;
    height: 400px;
}

.tab__content-item {
    display: none;
    width: 100%;
    height: 100%;
    padding: 10px 10px;
}

.tab__menu-item:not(.tab__active):hover {
    opacity: 0.5;
    transition: opacity 0.4s;
}

.tab__active {
    display: block;
    background: #333;
    color: #fff;
}
.test00 {
    margin-top: 1000px;
}
.test01 {
    width: 500px;
    height: 500px;
    background: gray;
}

次はJavaScriptを書いていきます。

    const tab = document.querySelectorAll('.js-tab');
    const tabContent = document.querySelectorAll('.js-content');
    tab.forEach(clicked => {
        clicked.addEventListener('click',() => {
            tab.forEach(item => {
                item.classList.remove('tab__active')
            });
            clicked.classList.add('tab__active')
            tabContent.forEach(item => {
                item.classList.remove('tab__active')
            })
            document.getElementById(clicked.dataset.id).classList.add('tab__active')
        })
    })

解説をしてきます。

// document.querySelectorAllを使用して.js-tabと.js-contentのクラスがついている全ての要素を取得します。 
// document.querySelectorだと複数要素があったとしても最初の要素しか取得できないので注意して下さい。
const tab = document.querySelectorAll('.js-tab');
const tabContent = document.querySelectorAll('.js-content');
    
// forEachを使用してdocument.querySelectorAllで取得した全ての要素を繰り返し処理を行います。
tab.forEach(clicked => {

   // clickedという引数(一つ一つの要素)に対してclickイベントを付与
    clicked.addEventListener('click',() => {

        tab.forEach(item => {
            // tabで取得した全ての要素に対してtab__activeというクラスを削除
            item.classList.remove('tab__active')
        });

        // クリックされた要素に対してtab__activeを付与
        clicked.classList.add('tab__active')

        // tabContentで取得した全ての要素に対して繰り返し処理
        tabContent.forEach(item => {
            // クリックされた要素に対してtab__activeを付与    
            item.classList.remove('tab__active')
        })
    })
})

ポイントとしては

  • document.qurySerectorAllを使用して対象の要素を全て全て取得する。
  • 取得した要素に対してforEachを使用して繰り返し処理
  • classList.removeを使用して一旦全てのtav__activeのクラスを削除
  • tav__activeのクラスを削除後、クリックした要素にtav__activeのクラスを付与

ちょっと複雑ですが一つ一つ処理を確認していけば、そんなに難しい事では無いです。

素のJavaScriptが使えるとReactやAstroといったフレームワークにも応用ができるようになるので、是非試してみて下さい。