3D回転するタブ切り替えを作る方法
3D回転するタブ切り替えを作る方法を紹介します。このサンプルでは、HTML・CSS・JavaScriptを使用し、クリックしたタブボタンだけが斜め方向へ立体的に回転しながら選択状態へ切り替わるタブUIを実装します。コンテンツ部分には回転を加えず、選択したタブの動きによって切り替わりを分かりやすく伝える構成です。
HTML・CSS・JavaScriptの各タブをクリックすると、選択中のタブが青色へ変わり、対応する説明文が表示されます。同時に、クリックしたタブへ3D回転アニメーションが適用されます。商品やサービスの特徴紹介、料金プラン、会員サイトの設定画面、管理画面の機能分類など、複数の情報を限られたスペースへ整理して表示したい場面に利用できます。
タブ名や表示内容はHTMLから変更でき、CSSではタブの色、余白、角丸、文字サイズ、回転角度、拡大率、アニメーション時間などを調整できます。JavaScriptではクリックしたタブの選択状態と対応するコンテンツの表示を切り替えています。画面幅640px以下では余白や文字サイズを調整しているため、スマートフォン・タブレット・PCで利用しやすい3Dタブ切り替えとして活用できます。
コードについて
本記事のコードはサンプルコードです。ご利用前に必ず動作確認を行ってください。
免責事項
本コードの利用により発生した損害について、当サイトは一切の責任を負いません。
デモ
3D回転するタブ切り替え
タブをクリックすると、選択したタブが斜め方向へ3D回転しながら切り替わります。
HTMLはWebページの構造を作るためのマークアップ言語です。
CSSは文字色やレイアウト、タブの3D回転アニメーションを設定します。
JavaScriptはクリックしたタブに合わせて表示内容を切り替えます。
HTML・CSS・JavaScriptの各タブをクリックすると、選択したタブだけが斜め方向へ3D回転し、対応する説明へ切り替わります。
コードをコピーして使おう!
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- 文字コード -->
<meta charset="UTF-8">
<!-- スマートフォン対応 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- ページタイトル -->
<title>3D回転するタブ切り替え</title>
<!-- CSSファイル -->
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- タブ切り替え全体 -->
<div class="rotate3d-tab-switch_wrap">
<!-- タイトル -->
<div class="rotate3d-tab-switch_title">
3D回転するタブ切り替え
</div>
<!-- 説明文 -->
<p class="rotate3d-tab-switch_text">
タブをクリックすると、選択したタブが斜め方向へ3D回転しながら切り替わります。
</p>
<!-- タブボタン -->
<div class="rotate3d-tab-switch_tabs" role="tablist" aria-label="使用技術">
<button
class="rotate3d-tab-switch_tab is-active"
id="rotate3d-tab-switch-html"
type="button"
role="tab"
aria-controls="rotate3d-tab-switch-panel-html"
aria-selected="true"
data-tab="html">
HTML
</button>
<button
class="rotate3d-tab-switch_tab"
id="rotate3d-tab-switch-css"
type="button"
role="tab"
aria-controls="rotate3d-tab-switch-panel-css"
aria-selected="false"
data-tab="css">
CSS
</button>
<button
class="rotate3d-tab-switch_tab"
id="rotate3d-tab-switch-js"
type="button"
role="tab"
aria-controls="rotate3d-tab-switch-panel-js"
aria-selected="false"
data-tab="js">
JavaScript
</button>
</div>
<!-- HTMLのコンテンツ -->
<div
class="rotate3d-tab-switch_panel is-active"
id="rotate3d-tab-switch-panel-html"
role="tabpanel"
aria-labelledby="rotate3d-tab-switch-html"
data-panel="html">
HTMLはWebページの構造を作るためのマークアップ言語です。
</div>
<!-- CSSのコンテンツ -->
<div
class="rotate3d-tab-switch_panel"
id="rotate3d-tab-switch-panel-css"
role="tabpanel"
aria-labelledby="rotate3d-tab-switch-css"
data-panel="css">
CSSは文字色やレイアウト、タブの3D回転アニメーションを設定します。
</div>
<!-- JavaScriptのコンテンツ -->
<div
class="rotate3d-tab-switch_panel"
id="rotate3d-tab-switch-panel-js"
role="tabpanel"
aria-labelledby="rotate3d-tab-switch-js"
data-panel="js">
JavaScriptはクリックしたタブに合わせて表示内容を切り替えます。
</div>
</div>
<!-- JavaScriptファイル -->
<script src="script.js"></script>
</body>
</html>
/* ページ全体 */
body{
margin:0; /* ブラウザ標準の外側余白を削除 */
padding:40px 20px; /* 上下40px・左右20px。値を大きくすると画面端との間隔が広がる */
background:#ffffff; /* ページ全体の背景色 */
color:#111827; /* ページ全体の基本文字色 */
font-family:sans-serif; /* ページ全体で使用するフォント */
}
/* タブ切り替え全体と内部要素 */
.rotate3d-tab-switch_wrap,
.rotate3d-tab-switch_wrap *{
box-sizing:border-box; /* paddingとborderを横幅や高さへ含める */
}
/* タブ切り替え全体 */
.rotate3d-tab-switch_wrap{
width:100%; /* 画面幅に合わせて横幅を縮小 */
max-width:700px; /* 最大横幅。値を大きくすると全体が横に広がる */
margin:40px auto; /* 上下40pxの余白を付けて左右中央へ配置 */
padding:32px; /* 内側の余白。値を大きくすると余白が広がる */
border:1px solid #e5e7eb; /* 全体を囲む枠線 */
border-radius:18px; /* 全体の角丸。値を大きくすると丸みが強くなる */
background:#f8fafc; /* タブ切り替え全体の背景色 */
}
/* タイトル */
.rotate3d-tab-switch_title{
margin:0 0 12px; /* 下側12pxの余白。値を大きくすると説明文との間隔が広がる */
font-size:22px; /* タイトルの文字サイズ。値を大きくすると文字が大きくなる */
font-weight:700; /* タイトルを太字にする */
line-height:1.5; /* タイトルの行間 */
text-align:center; /* タイトルを中央揃えにする */
}
/* 説明文 */
.rotate3d-tab-switch_text{
margin:0 0 24px; /* 下側24pxの余白。値を大きくするとタブとの間隔が広がる */
color:#4b5563; /* 説明文の文字色 */
font-size:16px; /* 説明文の文字サイズ */
line-height:1.8; /* 説明文の行間。値を大きくすると行間が広がる */
text-align:center; /* 説明文を中央揃えにする */
}
/* タブボタンを並べる領域 */
.rotate3d-tab-switch_tabs{
display:flex; /* タブボタンを横並びにする */
border-bottom:1px solid #d1d5db; /* タブ下部の境界線 */
perspective:1200px; /* 3D回転の奥行き。値を小さくすると遠近感が強くなる */
}
/* タブボタン */
.rotate3d-tab-switch_tab{
flex:1; /* 3つのタブを同じ横幅にする */
min-height:52px; /* タブの最小高さ。値を大きくすると高くなる */
padding:14px; /* タブ内側の余白。値を大きくするとタブが大きくなる */
border:1px solid #d1d5db; /* タブを囲む枠線 */
border-bottom:none; /* タブ下側の枠線を非表示 */
border-radius:12px 12px 0 0; /* 上側だけ12pxの角丸にする */
background:#ffffff; /* 通常時の背景色 */
color:#111827; /* 通常時の文字色 */
font:inherit; /* ページ全体と同じフォントを使用 */
font-size:16px; /* タブの文字サイズ */
font-weight:700; /* タブの文字を太字にする */
cursor:pointer; /* マウスを重ねたときに指の形へ変更 */
transform-style:preserve-3d; /* 子要素を3D空間で表示できるようにする */
backface-visibility:hidden; /* 回転時にタブの裏面を非表示にする */
transition:
background-color .3s ease,
color .3s ease;
/*
0.3秒で背景色と文字色を切り替える。
値を大きくすると遅くなり、小さくすると速くなる。
*/
}
/* 2つ目以降のタブボタン */
.rotate3d-tab-switch_tab + .rotate3d-tab-switch_tab{
margin-left:6px; /* タブ同士の間隔。値を大きくすると間隔が広がる */
}
/* 選択中のタブボタン */
.rotate3d-tab-switch_tab.is-active{
background:#0b6bff; /* 選択中の背景色 */
color:#ffffff; /* 選択中の文字色 */
}
/* 3D回転中のタブボタン */
.rotate3d-tab-switch_tab.is-rotating{
animation:rotate3d-tab-switch_rotate 1.2s cubic-bezier(.22,1,.36,1);
/*
1.2秒かけて3D回転する。
値を大きくするとゆっくり回転し、小さくすると速く回転する。
*/
}
/* キーボード操作でフォーカスしたタブ */
.rotate3d-tab-switch_tab:focus-visible{
position:relative; /* フォーカス枠を前面へ表示するための基準 */
z-index:1; /* フォーカス枠をほかのタブより前面へ表示 */
outline:3px solid rgba(11,107,255,.22); /* フォーカス枠の太さと色 */
outline-offset:2px; /* タブとフォーカス枠の間隔 */
}
/* タブに対応するコンテンツ */
.rotate3d-tab-switch_panel{
display:none; /* 選択されていないコンテンツを非表示 */
padding:24px; /* 内側の余白。値を大きくすると余白が広がる */
border:1px solid #d1d5db; /* コンテンツを囲む枠線 */
border-top:none; /* タブとの境界部分の枠線を非表示 */
background:#ffffff; /* コンテンツの背景色 */
color:#4b5563; /* コンテンツの文字色 */
font-size:16px; /* コンテンツの文字サイズ */
line-height:1.8; /* コンテンツの行間。値を大きくすると行間が広がる */
}
/* 選択中のコンテンツ */
.rotate3d-tab-switch_panel.is-active{
display:block; /* 選択中のコンテンツを表示 */
}
/* タブボタンの3D回転 */
@keyframes rotate3d-tab-switch_rotate{
/* 回転開始時 */
0%{
transform:rotate3d(1,1,0,-120deg) scale(.7);
/*
X軸とY軸を使って斜め方向へマイナス120度回転する。
-120degを変更すると回転角度が変わる。
scale(.7)を大きくすると開始時の縮小が弱くなる。
*/
}
/* 回転終了時 */
100%{
transform:rotate3d(0,0,0,0deg) scale(1); /* 通常の角度と大きさへ戻す */
}
}
/* 画面幅640px以下 */
@media(max-width:640px){
/* タブ切り替え全体 */
.rotate3d-tab-switch_wrap{
padding:24px 18px; /* スマートフォンでは内側の余白を小さくする */
}
/* タブボタン */
.rotate3d-tab-switch_tab{
min-height:48px; /* スマートフォンでのタブの最小高さ */
padding:12px 8px; /* スマートフォンでは内側の余白を小さくする */
font-size:14px; /* スマートフォンでは文字を小さくする */
}
/* 2つ目以降のタブボタン */
.rotate3d-tab-switch_tab + .rotate3d-tab-switch_tab{
margin-left:4px; /* スマートフォンではタブ同士の間隔を狭くする */
}
/* タブに対応するコンテンツ */
.rotate3d-tab-switch_panel{
padding:20px 16px; /* スマートフォンでは内側の余白を小さくする */
}
}
/* すべてのタブボタンを取得 */
const rotate3dTabSwitchTabs =
document.querySelectorAll(".rotate3d-tab-switch_tab");
/* すべてのコンテンツを取得 */
const rotate3dTabSwitchPanels =
document.querySelectorAll(".rotate3d-tab-switch_panel");
/* 各タブボタンへクリック処理を設定 */
rotate3dTabSwitchTabs.forEach(function(tab){
tab.addEventListener("click",function(){
/* 選択中のタブをクリックした場合は処理しない */
if(tab.classList.contains("is-active")){
return;
}
/* クリックしたタブに対応する値を取得 */
const target = tab.dataset.tab;
/* すべてのタブを未選択状態へ戻す */
rotate3dTabSwitchTabs.forEach(function(item){
item.classList.remove("is-active");
item.classList.remove("is-rotating");
item.setAttribute("aria-selected","false");
});
/* すべてのコンテンツを非表示にする */
rotate3dTabSwitchPanels.forEach(function(panel){
panel.classList.remove("is-active");
});
/*
ブラウザへ現在の状態を反映させる。
同じ回転アニメーションを繰り返し実行するために使用する。
*/
void tab.offsetWidth;
/* クリックしたタブを選択状態にして3D回転させる */
tab.classList.add("is-active");
tab.classList.add("is-rotating");
tab.setAttribute("aria-selected","true");
/* クリックしたタブに対応するコンテンツを表示 */
document
.querySelector('[data-panel="' + target + '"]')
.classList.add("is-active");
/* 回転終了後にアニメーション用クラスを削除 */
tab.addEventListener("animationend",function(){
tab.classList.remove("is-rotating");
},{once:true});
});
});
コードをコピーする場合
使用するコードのタブを選び、「このタブをコピー」をクリックすると、現在表示中のコードをコピーできます。
サンプル一式を取得する場合
HTML・CSSなどすべてのファイルが必要な場合は、「サンプル一式をダウンロード」をクリックしてください。
ファイル構成と設置方法
このサンプルはHTML・CSS・JavaScriptの3ファイルで構成されています。HTMLではタブボタンと切り替えるコンテンツを配置し、CSSではタブのレイアウトや色、3D回転アニメーションを設定します。JavaScriptではクリックしたタブを選択状態へ切り替え、対応するコンテンツを表示する処理を行います。3つのファイルを同じフォルダへ配置するだけで利用できるため、初心者でも導入しやすい構成です。
sample/
├── index.html
├── style.css
└── script.js
各ファイルの役割
index.htmlはタブボタンとコンテンツを配置するファイルです。タブ名や表示する文章を変更できます。
style.cssはタブの色、余白、角丸、文字サイズ、3D回転アニメーション、コンテンツのデザインを設定するファイルです。
script.jsはクリックしたタブを選択状態へ切り替え、対応するコンテンツを表示する処理を担当します。
設置方法・使い方
sampleフォルダへindex.html、style.css、script.jsを配置します。3つのファイルを同じ階層へ保存したあと、sample/index.htmlをブラウザで開いてください。表示されたタブをクリックすると、選択したタブが3D回転しながら切り替わり、対応するコンテンツが表示されます。
カスタマイズできる内容
index.htmlではタブ名や各コンテンツの文章を変更できます。
style.cssではタブやコンテンツの色、余白、角丸、文字サイズ、3D回転アニメーションの速度や回転角度を変更できます。
script.jsではクリック時の切り替え処理や初期表示するタブを変更できます。
数値調整
style.css
max-width:700px;
タブ全体の最大横幅です。値を大きくすると横に広がり、小さくするとコンパクトになります。
padding:32px;
タブ全体の内側余白です。値を大きくすると余白が広がり、小さくすると詰まった表示になります。
min-height:52px;
タブボタンの高さです。値を大きくするとボタンが高くなり、小さくすると低くなります。
border-radius:12px;
タブボタンの角丸です。値を大きくすると丸みが強くなり、0にすると四角になります。
perspective:1200px;
3D回転の奥行きです。値を小さくすると立体感が強くなり、大きくすると控えめになります。
animation: ... 1.2s ...
タブが3D回転する時間です。1.2秒を大きくするとゆっくり回転し、小さくすると速く回転します。
rotate3d(1,1,0,-120deg)
タブが回転を開始する角度です。-120degを変更すると回転量が変わります。
レスポンシブ対応
このサンプルはレスポンシブ対応です。style.cssのwidth:100%とmax-width:700pxにより画面幅に合わせてレイアウトが縮小されます。また、640px以下ではタブの高さや文字サイズ、余白を調整しているため、スマートフォン・タブレット・PCで利用できます。
コメント