HTMLとCSSだけでタブを作る

Last modified date

inputタグとcssを使ってタブ切り替えを実装する

jsを使わずにhtmlのinputタグとcssだけでタブの切り替えを行うぞ。


See the Pen
inputタグとcssだけでタブ機能
by 魔王 (@maou_frontend)
on CodePen.



タブのhtml構成

<div class="tabs-wrapper">
  
    <input type="radio" name="tab_list" id="btn-1" class="btn-1" checked >
    <label for="btn-1" class="btn" >メラ系呪文</label>
    <input type="radio" name="tab_list" id="btn-2" class="btn-2">
    <label for="btn-2" class="btn" >ギラ系呪文</label>
 
    <div class="tabs-container">
        <div class="tab-1">
            <p>メラ</p><p>メラミ</p><p>メラゾーマ</p>
        </div>          
        <div class="tab-2">
            <p>ギラ</p><p>ベギラマ</p><p>ベギラゴン</p>
        </div>
    </div>
</div>

CSS無しで見てみるとこんな状態であるぞ。

先にinputタグを用意して、該当するタブ内容を記述していく方法だ。

タブとタブの中身をセットで作るのではなく、タブはタブで用意して、タブ内容はタブ内容だけで用意する。

HTMLのみのタブ機能

タブ部分はinputタグで構成する

タブで使用するinputタグのname属性は任意の名前で問題ないぞ。注意すべきはid属性であり、これはlabelタグのforと同じものにする必要がある。

<input type="radio" name="tab_list" id="btn-1" class="btn-1" checked >
<label for="btn-1" class="btn" >メラ系呪文</label>
<input type="radio" name="tab_list" id="btn-2" class="btn-2">
<label for="btn-2" class="btn" >ギラ系呪文</label>

タブの中身はclassで分類する。

今回はタブを2つ作っているが、4つにしたい場合はtab-○とbtn-○を4つに増やして、cssも増やせばタブを増やすことができる。


tab-○のクラスを付与するのはdivタグでもsectionタグでも大丈夫だぞ。

<div class="tabs-container">
        <div class="tab-1">
            <p>メラ</p><p>メラミ</p><p>メラゾーマ</p>
        </div>          
        <div class="tab-2">
            <p>ギラ</p><p>ベギラマ</p><p>ベギラゴン</p>
        </div>
    </div>

タブのcss構成

考え方の大筋は、inputを非表示にし、ラベルをタブにして、チェックされたものを表示する。というものであるぞ。

注意すべきは「間接セレクタ」(兄弟セレクタ)の使い方くらいである。

.tabs-wrapper {
    width: 500px;
    padding: 10px;
    position: relative;
    margin: 20px auto;
}
 
.tabs-wrapper input {
    opacity: 0;
    display: none;
    visibility: hidden;
}
 
.btn {
    background: #eaeaea;
    color: #000;
    cursor: pointer;
    display: block;
    float: left;
    font-size: 13px;
    height: 40px;
    line-height: 35px;
    text-align: center;
    opacity: 0.8;
    transition: all 0.4s;
    width:50%;
    border-bottom:5px #7de4c9 solid;
    border-top-right-radius:4px;
	  border-top-left-radius:4px;
    box-sizing: border-box; 
}
 
 
.tabs-wrapper input:checked + label {
 	color: #000;
	background:#7de4c9;
}
 
.tabs-container {
    width: 100%;
    position: relative;
    float: left;
    background: #fff;
}
 
.tab-1 ,
.tab-2 {
    width: 100%;
    position: absolute;
    top: 0;
    left: 0;
    opacity: 0;
    visibility: hidden;
    transition: all 0.4s;
}
 
 
.btn-1:checked ~ .tabs-container .tab-1 ,
.btn-2:checked ~ .tabs-container .tab-2 {
    position: relative;
    visibility: visible;
    top: 0;
    left: 0;
    opacity: 1;
}

「間接セレクタ」(兄弟セレクタ)とは

間接セレクタとは、基準要素以下にある要素を指定するためのセレクタである。

「特定の要素」~「それ以下に存在する適用する要素」{color:red;}

日本人の感覚だと、「~」は範囲のイメージが強いが、間接セレクタの場合は、以下を指定することになる。

<p>1</p>
<p>2</p>
<p class="point">3</p>
<p>4</p>
<p>5</p>
.point ~ p { color: gold; }

上の場合は3にpointのクラスがあるので、その以下のpにスタイルが適用されることになるぞ。

今回のタブのCSSの場合、「.btn-1:checked」以下にある「.tabs-container .tab-1」と「.btn-2:checked」以下にある「.tabs-container .tab-2」にスタイルを適用することになる。

.btn-1:checked ~ .tabs-container .tab-1 ,
.btn-2:checked ~ .tabs-container .tab-2 {
    position: relative;
    visibility: visible;
    top: 0;
    left: 0;
    opacity: 1;
}

以上がinputタグとcssを使ってタブ切り替えを実装する方法であるぞ!

魔王様

コメントを残す

メールアドレスが公開されることはありません。

Post comment