クリック時に初回だけ読み込むタブ切り替えを作る方法【HTML/CSS/JavaScript・サンプルコード付き】
タブ切り替え
2025.10.05
クリック時に初回だけ読み込むタブ切り替えを作る方法
HTML・CSS・JavaScriptを使って、クリックされたタイミングで初回のみコンテンツを読み込むタブ切り替えを作る方法を紹介します。このサンプルでは、最初は1つ目のタブだけを表示し、他のタブはクリックされた時点で内容を生成して表示します。一度読み込んだ内容は保持されるため、画像が多いページや大量のデータを扱う画面、初期表示を高速化したい場合に便利です。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
初回だけ読み込むタブ切り替え
最初は概要だけを表示し、他のタブはクリックされた時点で初回のみ読み込みます。
概要だけは最初から表示されています。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コードを指定 -->
<meta charset="UTF-8">
<!-- スマホ表示に対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>クリック時に初回だけ読み込むタブ切り替え</title>
<!-- CSSファイルを読み込み -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- タブ全体を囲むエリア -->
<div class="lazy-load-tab-switch_wrap">
<!-- タイトル -->
<div class="lazy-load-tab-switch_title">
初回だけ読み込むタブ切り替え
</div>
<!-- 説明文 -->
<p class="lazy-load-tab-switch_text">
最初は概要だけを表示し、他のタブはクリックされた時点で初回のみ読み込みます。
</p>
<!-- タブボタン一覧 -->
<div class="lazy-load-tab-switch_tabs">
<button class="lazy-load-tab-switch_tab is-active" type="button" data-tab="overview">
概要
</button>
<button class="lazy-load-tab-switch_tab" type="button" data-tab="image">
画像
</button>
<button class="lazy-load-tab-switch_tab" type="button" data-tab="video">
動画
</button>
<button class="lazy-load-tab-switch_tab" type="button" data-tab="document">
重い資料
</button>
</div>
<!-- 概要タブの内容 -->
<div class="lazy-load-tab-switch_panel is-active" data-panel="overview" data-loaded="true">
概要だけは最初から表示されています。
</div>
<!-- 画像タブの内容 -->
<div class="lazy-load-tab-switch_panel" data-panel="image" data-loaded="false"></div>
<!-- 動画タブの内容 -->
<div class="lazy-load-tab-switch_panel" data-panel="video" data-loaded="false"></div>
<!-- 重い資料タブの内容 -->
<div class="lazy-load-tab-switch_panel" data-panel="document" data-loaded="false"></div>
</div>
<!-- JavaScriptファイルを読み込み -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体の設定 */
body{
margin:0;
font-family:sans-serif;
background:#ffffff;
}
/* タブ全体を囲むエリア */
.lazy-load-tab-switch_wrap{
max-width:760px;
margin:40px auto;
padding:32px;
border:1px solid #e5e7eb;
border-radius:18px;
background:#f8fafc;
}
/* タイトル */
.lazy-load-tab-switch_title{
font-size:22px;
font-weight:700;
margin-bottom:12px;
text-align:center;
}
/* 説明文 */
.lazy-load-tab-switch_text{
margin-bottom:24px;
color:#4b5563;
text-align:center;
}
/* タブボタン一覧 */
.lazy-load-tab-switch_tabs{
display:flex;
border-bottom:1px solid #d1d5db;
}
/* タブボタン */
.lazy-load-tab-switch_tab{
flex:1;
padding:14px;
border:1px solid #d1d5db;
border-bottom:none;
border-radius:12px 12px 0 0;
background:#ffffff;
color:#111827;
font-weight:700;
cursor:pointer;
}
/* 2個目以降のタブボタン */
.lazy-load-tab-switch_tab + .lazy-load-tab-switch_tab{
margin-left:6px;
}
/* 選択中のタブボタン */
.lazy-load-tab-switch_tab.is-active{
background:#0b6bff;
color:#ffffff;
}
/* タブの内容 */
.lazy-load-tab-switch_panel{
display:none;
padding:24px;
border:1px solid #d1d5db;
border-top:none;
background:#ffffff;
}
/* 選択中のタブの内容 */
.lazy-load-tab-switch_panel.is-active{
display:block;
}
/* 画像表示 */
.lazy-load-tab-switch_image{
width:100%;
max-width:600px;
display:block;
margin:0 auto;
border-radius:12px;
}
/* 動画表示 */
.lazy-load-tab-switch_video{
width:100%;
aspect-ratio:16/9;
border:none;
border-radius:12px;
}
/* 重い資料表示 */
.lazy-load-tab-switch_document{
width:100%;
height:500px;
border:1px solid #d1d5db;
border-radius:12px;
}
// タブボタンをすべて取得
const lazyLoadTabSwitchTabs=document.querySelectorAll(".lazy-load-tab-switch_tab");
// タブの内容をすべて取得
const lazyLoadTabSwitchPanels=document.querySelectorAll(".lazy-load-tab-switch_panel");
// 初回クリック時に読み込む内容
const lazyLoadTabSwitchContents={
image:`
<img
class="lazy-load-tab-switch_image"
src="https://picsum.photos/900/500"
alt="サンプル画像">
`,
video:`
<iframe
class="lazy-load-tab-switch_video"
src="https://www.youtube.com/embed/dQw4w9WgXcQ"
allowfullscreen>
</iframe>
`,
document:`
<iframe
class="lazy-load-tab-switch_document"
src="https://mozilla.github.io/pdf.js/web/compressed.tracemonkey-pldi-09.pdf">
</iframe>
`
};
// 各タブボタンにクリックイベントを設定
lazyLoadTabSwitchTabs.forEach(function(tab){
tab.addEventListener("click",function(){
// クリックしたタブに対応する値を取得
const target=tab.dataset.tab;
// 表示対象のパネルを取得
const targetPanel=document.querySelector('[data-panel="'+target+'"]');
// まだ読み込んでいないタブだけ初回読み込みする
if(targetPanel.dataset.loaded==="false" && lazyLoadTabSwitchContents[target]){
targetPanel.innerHTML=lazyLoadTabSwitchContents[target];
targetPanel.dataset.loaded="true";
}
// すべてのタブボタンから選択中の状態を外す
lazyLoadTabSwitchTabs.forEach(function(item){
item.classList.remove("is-active");
});
// すべてのタブ内容を非表示にする
lazyLoadTabSwitchPanels.forEach(function(panel){
panel.classList.remove("is-active");
});
// クリックしたタブを選択中にする
tab.classList.add("is-active");
// 対応するタブ内容を表示する
targetPanel.classList.add("is-active");
});
});
ファイル構成と設置方法
このサンプルでは、HTML・CSS・JavaScriptをそれぞれ別ファイルに分けて使用します。index.html、style.css、script.js を同じフォルダに配置してください。
sample/
├── index.html
├── style.css
└── script.js
index.html をブラウザで開くと、クリック時に初回だけ読み込むタブ切り替えを確認できます。最初は概要だけが表示され、画像・動画・重い資料は各タブをクリックした時点で初回のみ読み込まれます。
クリック時に初回だけ読み込むタブ切り替えを作る方法【HTML/CSS/JavaScript・サンプルコード付き】
コメント