動きを実現する仕組み
JavascriptでTabの質問コンテンツ作成
STEP1 HTMLコード
<section class="tab_section">
<div class="section_inner">
<h2 class="section_title">タブコンテンツの作り方</h2>
<p class="scrool_text mobile-only">横スクロールできます</p>
<div class="tab-container">
<div class="tab-buttons">
<button class="tab-btn active">タブ1タブ1</button>
<button class="tab-btn">タブ2タブ2タブ2</button>
<button class="tab-btn">タブ3</button>
<button class="tab-btn">タブ4タブ4</button>
<button class="tab-btn">タブ5</button>
<button class="tab-btn">タブ6タブ6タブ6</button>
</div>
<div class="tab-contents">
<div class="tab-content active">タブ1の内容</div>
<div class="tab-content">タブ2の内容</div>
<div class="tab-content">タブ3の内容</div>
<div class="tab-content">タブ4の内容</div>
<div class="tab-content">タブ5の内容</div>
<div class="tab-content">タブ6の内容</div>
</div>
</div>
</div>
</section>CSSでコーディング
STEP2 cssコード
@charset "utf-8";
/*---------------tabの設定-------------------------------*/
/* タブセクション全体のスタイル */
.tab_section {
width: 100%;
margin-block: 100px;
/* 必要に応じてmin-heightを調整 */
}
.section_inner {
width: 100%;
max-width: 1200px;
margin: 0 auto;
}
.section_title {
position: relative;
font-size: min(2.78vw, 40px);
font-weight: bold;
color: var(--text-color);
text-align: left;
margin-bottom: min(1.39vw, 20px);
padding-left: 15px;
}
.section_title::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 5px;
height: 100%;
background-color: var(--black--);
}
h3 {
font-size: min(1.3888888888888888vw, 20px);
font-weight: bold;
color: var(--text-color);
text-align: left;
margin-block: 20px;
padding-left: 15px;
}
/* スクロール案内テキスト */
.scrool_text {
font-size: 12px;
margin-top: 8px;
margin-bottom: 12px;
padding-right: 10px;
color: #555;
text-align: right;
}
.scrool_text::after {
content: "→";
font-size: 20px;
display: inline-block;
margin-left: 5px;
animation: scrollArrow 0.8s infinite alternate;
}
@keyframes scrollArrow {
0% {
opacity: 1;
transform: translateX(0);
}
100% {
opacity: 1;
transform: translateX(5px);
}
}
/*---------------タブ全体の設定--------------------*/
.tab-container {
width: 100%;
margin: 40px auto;
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
padding: 24px;
}
.tab-buttons {
display: flex;
gap: 8px;
margin-bottom: 16px;
}
.tab-btn {
/*幅を指定したい時はmin-widthかmax-widthを使用*/
flex: 1;
padding: 12px 0;
background: #f5f5f5;
border: none;
border-radius: 4px 4px 0 0;
font-size: min(1.1111111111111112vw, 16px);
font-weight: bold;
cursor: pointer;
transition: background 0.2s;
}
.tab-btn.active {
background: #4285f4;
color: #fff;
}
.tab-content {
display: none;
padding: 24px 8px;
border-top: 1px solid #e0e0e0;
font-size: min(1.1111111111111112vw, 16px);
}
.tab-content.active {
display: block;
}
@media screen and (max-width: 768px) {
.tab-container {
margin: 20px auto;
}
.tab-buttons {
display: flex;
gap: 8px;
margin-bottom: 16px;
overflow-x: auto;
white-space: nowrap;
scrollbar-width: thin; /* Firefox用 */
}
.tab-btn {
min-width: 140px;
padding: 12px 10px;
background: #f5f5f5;
border: none;
border-radius: 4px 4px 0 0;
font-weight: bold;
cursor: pointer;
transition: background 0.2s;
white-space: nowrap;
font-size: min(2.083333333333333vw, 16px);
}
.tab-content {
font-size: min(2.083333333333333vw, 16px);
}
}
@media screen and (max-width: 450px) {
.tab-btn {
min-width: 140px;
padding: 12px 10px;
font-size: min(3.111111111111111vw, 14px);
}
.tab-content {
font-size: min(2.666666666666667vw, 12px);
}
}
JSを実装
STEP3 jsコード
// タブ切り替え処理
document.addEventListener("DOMContentLoaded", function () {
const tabBtns = document.querySelectorAll(".tab-btn");
const tabContents = document.querySelectorAll(".tab-content");
tabBtns.forEach((btn, idx) => {
btn.addEventListener("click", function () {
tabBtns.forEach((b) => b.classList.remove("active"));
tabContents.forEach((c) => c.classList.remove("active"));
btn.classList.add("active");
tabContents[idx].classList.add("active");
});
});
});
コチラのサイトはコチラから
