No.060
TRANSITION CSSJS

Slide Panel Transition

タブをクリックするとパネルが横スライドで切り替わるトランジション。タブUI・オンボーディング・ステップフォームの画面遷移に。

DEMO

HOME
WORK
ABOUT

CODE

HTML
<div class="demo-stage spt-stage"><div class="spt-tabs"><button class="spt-tab active" data-i="0" type="button">HOME</button><button class="spt-tab" data-i="1" type="button">WORK</button><button class="spt-tab" data-i="2" type="button">ABOUT</button></div><div class="spt-window"><div class="spt-track"><div class="spt-panel">HOME</div><div class="spt-panel">WORK</div><div class="spt-panel">ABOUT</div></div></div></div>
CSS
.spt-stage { display:flex; flex-direction:column; align-items:center; gap:1.5rem; padding:2.5rem; background:#0F0F12; }
.spt-tabs { display:flex; gap:.5rem; }
.spt-tab { background:transparent; border:1px solid rgba(255,255,255,.2); color:#9A9A9A; font-family:'Oswald',sans-serif; letter-spacing:.15em; font-size:.72rem; padding:.5rem 1.1rem; cursor:pointer; border-radius:4px; transition:all .25s; }
.spt-tab.active { background:#E91B89; border-color:#E91B89; color:#fff; }
.spt-window { width:min(360px,82%); overflow:hidden; border-radius:14px; border:1px solid rgba(255,255,255,.08); }
.spt-track { display:flex; width:300%; transition:transform .5s cubic-bezier(.7,0,.2,1); }
.spt-panel { width:33.3333%; height:160px; display:flex; align-items:center; justify-content:center; color:#fff; font-family:'Oswald',sans-serif; font-size:2rem; letter-spacing:.1em; background:#1A1A1A; }
.spt-panel:nth-child(2) { background:#17171b; }
.spt-panel:nth-child(3) { background:#141417; }
JS
(function(){
  var track = document.querySelector('.spt-track');
  var tabs = document.querySelectorAll('.spt-tab');
  if(!track) return;
  tabs.forEach(function(tab){
    tab.addEventListener('click', function(){
      var i = parseInt(tab.dataset.i, 10);
      track.style.transform = 'translateX(-' + (i * 33.3333) + '%)';
      tabs.forEach(function(t){ t.classList.remove('active'); });
      tab.classList.add('active');
    });
  });
})();

AI PROMPT

Claude Cursor v0
PROMPT
タブをクリックするとパネルが横スライドで切り替わるトランジションを作って。横長トラック(.track, width:300%, display:flex)の中に3枚のパネル(各 width:33.3333%)を並べ、外側 .window は overflow:hidden。タブのclickで track.style.transform='translateX(-' + index*33.3333 + '%)' を設定し、.trackに transition:transform .5s cubic-bezier(.7,0,.2,1) を付けると滑らかにスライドする。アクティブタブにactiveクラスをトグル。タブUI・ステップフォーム・オンボーディングの画面遷移に。

BOOKS · PR · AMAZON

📖 なかしまぁ先生のCSSアニメーション入門 📖 UIデザインの教科書 新版 マルチデバイス時代のインターフェース設計 📖 Fundamentals of Web Animation with GSAP

※当サイトはAmazonアソシエイトプログラムの参加者です。リンクから商品をご購入いただくと、当方に紹介料が発生します。

学びを止めない · AMAZONサブスク

📚 Kindle Unlimited — 技術書・デザイン書が読み放題。30日無料体験 → 🎧 Audible — 移動中に耳で学ぶオーディオブック。30日無料体験 → 📦 Amazon Prime — Prime Reading・配送特典つき。30日無料体験 → 🎵 Music Unlimited — 作業用BGMに。1億曲が聴き放題・30日無料体験 →

※当サイトはAmazonアソシエイトプログラムの参加者です。リンクから商品をご購入いただくと、当方に紹介料が発生します。

スライドパネルトランジション(Slide Panel Transition)とは

タブをクリックするとパネルが横スライドで切り替わるトランジション。タブUI・オンボーディング・ステップフォームの画面遷移に。この効果は見た目をCSSで整えつつ、JavaScriptでクリックやスクロール・マウス移動などの操作を検知して動きを制御します。

使いどころ

ページ遷移・ギャラリーの切り替え・タブの内容差し替えなど、画面の入れ替え演出に向く。やりすぎると可読性や操作性を損なうため、目的のある一点に絞って使うのがコツです。

CSS実装のポイント

動きはGPUで処理されやすいtransformとopacityを軸に組み立てると、レイアウトの再計算(リフロー)を避けて滑らかに動きます。width・height・top/leftなど位置やサイズを直接変えるアニメーションは負荷が高いため避けるのが定石です。当サイトのコードはprefers-reduced-motionに対応しており、動きを減らす設定にしている利用者には自動でアニメーションを抑えるよう配慮しています。

CSSとJavaScriptの違い

CSSアニメーションは記述が簡潔で軽く、ブラウザ側で最適化されるため高パフォーマンスですが、操作に応じた複雑な分岐や数値計算は不得意です。一方JavaScriptはイベントに反応して動きを動的に組み立てられる反面、書き方を誤ると処理が重くなりがちです。この効果は見た目はCSS・制御はJavaScriptという役割分担で成り立っています。