タブのデザインはいろいろな方法があり、部位によって実装が違うものも多く、どれがいいのか迷いましたね。最終的な実装を紹介してしていきます。
cssだけでタブの切り替えのデザイン
このようなタブを作りたいです。
- 横幅いっぱいに広がる
- 角丸のタブをつくる
htmlとcss
<div class="tab-wrap">
<input id="tab-a" type="radio" name="tab" class="tab-switch" checked="checked" />
<input id="tab-b" type="radio" name="tab" class="tab-switch" />
<div class="tab-item-wrap">
<label class="tab-label tab-label-a" for="tab-a">タブa</label>
<label class="tab-label tab-label-b" for="tab-b">タブb</label>
</div>
<div class="tab-content tab-content-a">
<div class="tab-content-layout">
aです。
</div>
</div>
<div class="tab-content tab-content-b">
<div class="tab-content-layout">
bです。
</div>
</div>
</div>
.tab-wrap {
position: relative;
display: flex;
}
.tab-item-wrap {
display: flex;
flex: 1;
}
.tab-label {
display: inline-block;
flex: 1;
height: 100px;
font-weight: 600;
text-align: center;
cursor: pointer;
background: #bfbfbf;
border-radius: 24px 24px 0 0;
}
.tab-content {
position: absolute;
top: 30px;
left: 0;
width: 100%;
min-height: 100px;
background-color: #bfbfbf;
border-radius: 24px;
opacity: 0;
}
.tab-content-layout {
margin: 10px;
}
#tab-a:checked ~ .tab-item-wrap .tab-label-a,
#tab-b:checked ~ .tab-item-wrap .tab-label-b {
background-color: #aab828;
}
#tab-a:checked ~ .tab-content-a,
#tab-b:checked ~ .tab-content-b {
background-color: #aab828;
opacity: 1;
}
.tab-switch {
display: none;
}
解説
input、label、コンテンツとひとつづつ書いている人も結構いましたが、各々まとめることにしました。ややCSSが複雑になりますが、htmlはすっきりとします。
チェックボックスはdisplay:none;で消します。
コンテンツの中身も表示非表示はdisplay:none;もできますが、少しアニメーションをかけたい場合はopacityが融通がききます。
display:flexは内容量によって伸び縮みしてしまいます。
横幅いっぱい均等にするのには、子要素にflex:1;を指定するか、width;100%;を指定するかです。
flex:1;は余白を補完してくれるものです。厳密には、flex: 1 = flex-grow: 1, flex-shrink: 1, flex-basis: 0という意味です。flex-grow以外はデフォルト値なのでflex-growが変わると覚えるとよいでしょう。flex:1;は横幅を均等する以外にあまり使ったことないため、これ専用と覚えてしまってもいいかもしれません。
今回はflex:1;が入れ子構造にしてあります。ラベルはインライン要素のため ブロック要素display: inline-block;にしつつ、flex: 1;にしないと効かないです。
タブの中身はdisplay:none:で消すわけではありません。opacityです。文章がそこに存在するわけで、そのままだと透明にした文字量エリアが確保されて、後ろに書かれた文字下にさげってしまいます。そのため、position: absolute;で配置します。
最後に角丸を重ねるため、高さを若干調整します。
タブ内にリンクなどが含まれる場合、opacityはクリックできてしまいます。
pointer-events: none;とauto;の切り替えで制御します。
cssだけでタブの切り替えのデザイン(codepenサンプル)
気になるサンプルをピックアップしました。
やっぱ角丸がわりと好きですね。作り方は全然違います。inputすら使わずリンクでやっていますね。
JavaScriptを使ったもの。
参考ツイート
簡単なタブ切り替え機能の実装
— BOEL (@BOEL_Inc) January 19, 2018
ページ遷移などの操作がいらないタブ切り替えコンテンツ。
CSSとJSの制御、またCSSだけで作る簡単なタブ切り替えの実装方法をご紹介します。https://t.co/w9Ofiwq4PZ pic.twitter.com/xBwVwAblpM
display: none だけじゃなくて visibility: hidden も tab でフォーカスできなくなるのか…
— diescake (@diescake) July 28, 2019
これは opacity: 0 案件か。
コメント