yahooトップのタブのように、クリックしてもページ遷移しないタブを作りたい。
### jQueryとCSSで作る場合
index.html
– jqueryの制御は後から書きます。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="styles.css" type="text/css">
<script
src="https://code.jquery.com/jquery-3.5.1.js"
integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc="
crossorigin="anonymous"></script>
</head>
<body>
<div class="tab">
<ul class="tab-menu">
<li class="tab-item active">タブ1</li>
<li class="tab-item">タブ2</li>
<li class="tab-item">タブ3</li>
</ul>
<div class="tab-box">
<div class="tab-content show">コンテンツ1</div>
<div class="tab-content">コンテンツ2</div>
<div class="tab-content">コンテンツ3</div>
</div>
</div>
<script>
</script>
</body>
</html>
styles.css
* {
box-sizing: border-box;
}
ul, li {
padding: 0;
margin: 0;
}
li {
list-style: none;
}
.tab {
width: 500px;
max-width: 100%;
margin: auto;
}
.tab-menu{
display: flex;
}
.tab-item {
text-align: center;
padding: 10px 0;
cursor: pointer;
flex-grow: 1;
border-top: 1px solid skyblue;
border-left: 1px solid skyblue;
border-right: 1px solid skyblue;
}
.tab-item:not(:first-child){
border-left: none;
}
.tab-item.active {
background: red;
color: white;
}
.tab-box {
height:200px;
display: flex;
justify-content: center;
align-items: center;
border: 1px solid skyblue;
}
.tab-content {
display: none;
font-size: 40px;
}
.tab-content.show {
display: block;
}
jquery
– タブclick時にactiveとshowのclassをremoveして、clickされたタブのindexと同じindexにcontentのclassにshowを追加する
– タブとコンテンツの数、順番を一致させる必要がある
<script>
$(function(){
$('.tab-item').click(function(){
$('.active').removeClass('active');
$(this).addClass('active');
$('.show').removeClass('show');
const index = $(this).index();
$('.tab-content').eq(index).addClass('show');
})
})
</script>
### CSSのみで作る場合
index.html
<div class="tab">
<input id="menu1" class="tab-input" name="menu" type="radio" checked="checked">
<label for="menu1" class="tab-item">タブ1</label>
<div class="tab-content">コンテンツ1</div>
<input id="menu2" class="tab-input" name="menu" type="radio">
<label for="menu2" class="tab-item">タブ2</label>
<div class="tab-content">コンテンツ2</div>
<input id="menu3" class="tab-input" name="menu" type="radio">
<label for="menu3" class="tab-item">タブ3</label>
<div class="tab-content">コンテンツ3</div>
</div>
* {
box-sizing: border-box;
}
input[type="radio"]{
display:none;
}
.tab {
width: 500px;
max-width: 100%;
margin: auto;
display: flex;
flex-flow: wrap;
}
.tab-item {
display: block;
flex-grow: 1;
text-align: center;
padding: 10px 0;
cursor: pointer;
order: -1;
border-top: 1px solid skyblue;
border-left: 1px solid skyblue;
border-right: 1px solid skyblue;
}
.tab-item:not(:first-of-type){
border-left: none;
}
.tab-input:checked + .tab-item {
background: red;
color: white;
}
.tab-content {
width: 100%;
height: 200px;
display: none;
justify-content: center;
align-items:center;
font-size: 40px;
border: 1px solid skyblue;
}
.tab-input:checked + .tab-item + .tab-content {
display: flex;
}
input formとradioボタンで切り替えるってなんか違和感あるけど、うまく表示されますね。
思ったより簡単でワロタ。