ラジオボタンをタブメニューに変える。先日、ラジオボタンで実装済みのUIを急遽タブメニューにしたいというご要望をいただき、CSSを利用してタブメニュー風のデザインとして見せることにしました。
ラジオボタンを元にCSSでタブメニューを作成する場合、JavaScriptが必要ないため動作も軽く、比較的簡単に実装することができます。欠点としては、擬似クラスや隣接セレクタなどを多用するため、残念ながらIE8以下のブラウザでは動作しません。

DEMO:

対応ブラウザ:
IE9〜FirefoxChormeSafariOperaiOSAndroid

HTML:

<div class="tabmenu">
	<label>
		<input name="tab" type="radio" checked>
		<em>MENU1</em><span>TEXT1</span>
	</label>
	<label>
		<input name="tab" type="radio">
		<em>MENU2</em><span>TEXT2</span>
	</label>
	<label>
		<input name="tab" type="radio">
		<em>MENU3</em><span>TEXT3</span>
	</label>
</div>

一部の環境ではlabelタグのfor属性がうまく動作しないため、ラジオボタン&タブ&内容をまとめてlabelタグで囲うのがポイントです。
デモでは1つ目のラジオボタンにchecked属性を指定していますが、他のラジオボタンに指定することで、デフォルトでアクティブなタブを変えることができます。
なお、labelタグはインライン要素ですので、ブロック要素を内包することができません。そのため、ここではemタグとspanタグを使用しています。

CSS:

.tabmenu{
	position: relative;
	width: 280px;
	height: 200px;
	font-size: 0;
}
.tabmenu span{
	position: absolute;
	top: 30px;
	left: 0;
	display: block;
	margin: 4px 0 0;
	padding: 10px;
	width: 100%;
	height: 140px;
	border: 1px solid #0ae;
	-webkit-border-radius: 0 6px 6px 6px;
	border-radius: 0 6px 6px 6px;
	font-size: 14px;
}
.tabmenu input[type="radio"]{
	display: none;
}
.tabmenu input[type="radio"] + em{
	position: relative;
	z-index: 100;
	display: inline-block;
	margin: 0 4px 0 0;
	padding: 4px 0 0;
	min-width: 80px;
	-webkit-border-radius: 6px 6px 0 0;
	border-radius: 6px 6px 0 0;
	background: #ddd;
	color: #000;
	text-align: center;
	font-size: 14px;
	font-style: normal;
	line-height: 30px;
	cursor: pointer;
}
.tabmenu input[type="radio"]:checked + em{
	background: #0ae;
	color: #fff;
}
.tabmenu input[type="radio"]:checked + em::after {
	position: absolute;
	left: 50%;
	display: block;
	margin-left: -9px;
	border: 9px solid transparent;
	border-top: 9px solid #0ae;
	content: "";
}
.tabmenu input[type="radio"] + em ~ span{
	display: none;
}
.tabmenu input[type="radio"]:checked + em ~ span{
	display: block;
}

Webkit系のブラウザの不具合を回避するため、ラジオボタンcheck時のスタイル指定の際は、隣接セレクタではなく間接セレクタを利用しています。
参考::checked擬似クラスの隣接セレクターのWebkit系での挙動とか

まとめ:

今回はラジオボタンを利用した、CSSだけで構築するタブメニューの作成方法をご紹介いたしました。
ちょっとしたシンプルなタブメニューが必要なときや、タブメニューだけのためにわざわざ新しいJavaScriptを追加したくないときに、手軽に設置できるCSSのタブメニューはいかがでしょうか。

この記事をシェアする:
※作成から3年前 (1305日経過)の記事です。 内容が古い可能性があります。

東日本橋の制作・開発会社 プレスマンのスタッフブログ