
メニューのアクティブ状態にアニメーション効果を追加したい……



現在の選択状態をより魅力的に表示したい……
今回はこのようなお悩みをお持ちの方へ向けて
Web制作において必須のUI要素
メニューのアクティブ状態アニメーション
をご紹介します。
- スライド効果(スライドイン/アウト)
- フェード効果(フェードイン/アウト)
- スケール効果(スケールイン/アウト)
- ズーム効果(ズームイン/アウト)
- フリップ効果(フリップイン/アウト)



特にナビゲーションや選択状態の表示には、アクティブ状態アニメーションが非常に効果的です。この記事のコードをご活用いただきWeb制作の効率化に繋がれば何よりです。
なお、今回ご紹介するアニメーションはCSSとJavaScriptで実装できるので、基本的なコーディング知識があれば安心してご利用いただけます。
あわせて読みたい
アクティブ状態アニメーションとは
アクティブ状態アニメーションは、現在選択されている要素を視覚的に表現するアニメーション効果です。ユーザーに現在の位置を分かりやすく伝え、インタラクティブな体験を提供する効果的な手法です。
効果的な使用場面
適している場面
- ナビゲーションメニュー
- タブ選択
- ボタン選択
- フォーム選択
- リスト選択
避けるべき場面
- 即座に反応が必要な場面
- ユーザーが操作を中断できない場面
- アクセシビリティを重視する場面
実装方法の比較
アニメーション | 難易度 | 視覚的インパクト | パフォーマンス | ブラウザ対応 |
---|---|---|---|---|
スライド効果 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
フェード効果 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
スケール効果 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
ズーム効果 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
フリップ効果 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
スライド効果
① デモ
See the Pen アクティブ状態スライド by ケケンタ (@lgshifbg-the-looper) on CodePen.
- 動的なスライド表現
- 視覚的インパクトが高い
- スムーズなアニメーション
② HTML
<div class="nav-container">
<nav class="slide-nav">
<a href="#" class="nav-item active" data-tab="home">
<span class="nav-text">ホーム</span>
<div class="slide-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="about">
<span class="nav-text">概要</span>
<div class="slide-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="services">
<span class="nav-text">サービス</span>
<div class="slide-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="contact">
<span class="nav-text">お問い合わせ</span>
<div class="slide-indicator"></div>
</a>
</nav>
</div>
③ CSS
/* ナビゲーションコンテナ */
.nav-container {
max-width: 600px;
margin: 0 auto;
padding: 20px;
}
/* スライドナビゲーション */
.slide-nav {
display: flex;
background: #f8f9fa;
border-radius: 10px;
padding: 8px;
position: relative;
}
.nav-item {
flex: 1;
text-decoration: none;
color: #666;
padding: 12px 16px;
text-align: center;
position: relative;
transition: all 0.3s ease;
border-radius: 8px;
z-index: 1;
}
.nav-item:hover {
color: #333;
}
.nav-item.active {
color: #4CAF50;
}
/* スライドインジケーター */
.slide-indicator {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 3px;
background: #4CAF50;
transform: translateY(100%);
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 0;
}
.nav-item.active .slide-indicator {
transform: translateY(0);
}
/* スライドアニメーション */
@keyframes slideIn {
from {
transform: translateY(100%);
}
to {
transform: translateY(0);
}
}
@keyframes slideOut {
from {
transform: translateY(0);
}
to {
transform: translateY(-100%);
}
}
④ JavaScript
document.addEventListener('DOMContentLoaded', function() {
const navItems = document.querySelectorAll('.nav-item');
navItems.forEach(item => {
item.addEventListener('click', function(e) {
e.preventDefault();
// アクティブ状態の更新
navItems.forEach(nav => nav.classList.remove('active'));
this.classList.add('active');
// タブの切り替え処理(必要に応じて)
const tabName = this.getAttribute('data-tab');
console.log('Selected tab:', tabName);
});
});
});
⑤ カスタマイズ例
/* スライド方向の変更 */
.slide-indicator {
transform: translateY(100%);
}
.nav-item.active .slide-indicator {
transform: translateY(0);
}
/* スライド速度の調整 */
.slide-indicator {
transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
/* カラーテーマの変更 */
.nav-item.active {
color: #2196F3;
}
.slide-indicator {
background: #2196F3;
}
フェード効果
① デモ
See the Pen アクティブ状態フェード by ケケンタ (@lgshifbg-the-looper) on CodePen.
- スムーズな表示・非表示
- 視覚的に優しい印象
- 高パフォーマンス
② HTML
<div class="nav-container">
<nav class="fade-nav">
<a href="#" class="nav-item active" data-tab="home">
<span class="nav-text">ホーム</span>
<div class="fade-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="about">
<span class="nav-text">概要</span>
<div class="fade-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="services">
<span class="nav-text">サービス</span>
<div class="fade-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="contact">
<span class="nav-text">お問い合わせ</span>
<div class="fade-indicator"></div>
</a>
</nav>
</div>
③ CSS
/* フェードナビゲーション */
.fade-nav {
display: flex;
background: #f8f9fa;
border-radius: 10px;
padding: 8px;
position: relative;
}
.nav-item {
flex: 1;
text-decoration: none;
color: #666;
padding: 12px 16px;
text-align: center;
position: relative;
transition: all 0.3s ease;
border-radius: 8px;
z-index: 1;
}
.nav-item:hover {
color: #333;
}
.nav-item.active {
color: #FF9800;
}
/* フェードインジケーター */
.fade-indicator {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 3px;
background: #FF9800;
opacity: 0;
transition: opacity 0.4s ease;
z-index: 0;
}
.nav-item.active .fade-indicator {
opacity: 1;
}
/* フェードアニメーション */
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fadeOut {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
④ JavaScript
document.addEventListener('DOMContentLoaded', function() {
const navItems = document.querySelectorAll('.nav-item');
navItems.forEach(item => {
item.addEventListener('click', function(e) {
e.preventDefault();
// アクティブ状態の更新
navItems.forEach(nav => nav.classList.remove('active'));
this.classList.add('active');
// タブの切り替え処理(必要に応じて)
const tabName = this.getAttribute('data-tab');
console.log('Selected tab:', tabName);
});
});
});
⑤ カスタマイズ例
/* フェード効果の強度調整 */
.fade-indicator {
opacity: 0;
transform: scale(0.8);
}
.nav-item.active .fade-indicator {
opacity: 1;
transform: scale(1);
}
/* フェード速度の調整 */
.fade-indicator {
transition: all 0.6s ease;
}
スケール効果
① デモ
See the Pen アクティブ状態スケール by ケケンタ (@lgshifbg-the-looper) on CodePen.
- 拡大・縮小による動的表現
- 視覚的なインパクト
- モダンな印象
② HTML
<div class="nav-container">
<nav class="scale-nav">
<a href="#" class="nav-item active" data-tab="home">
<span class="nav-text">ホーム</span>
<div class="scale-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="about">
<span class="nav-text">概要</span>
<div class="scale-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="services">
<span class="nav-text">サービス</span>
<div class="scale-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="contact">
<span class="nav-text">お問い合わせ</span>
<div class="scale-indicator"></div>
</a>
</nav>
</div>
③ CSS
/* スケールナビゲーション */
.scale-nav {
display: flex;
background: #f8f9fa;
border-radius: 10px;
padding: 8px;
position: relative;
}
.nav-item {
flex: 1;
text-decoration: none;
color: #666;
padding: 12px 16px;
text-align: center;
position: relative;
transition: all 0.3s ease;
border-radius: 8px;
z-index: 1;
}
.nav-item:hover {
color: #333;
}
.nav-item.active {
color: #9C27B0;
}
/* スケールインジケーター */
.scale-indicator {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 3px;
background: #9C27B0;
transform: scaleX(0);
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 0;
}
.nav-item.active .scale-indicator {
transform: scaleX(1);
}
/* スケールアニメーション */
@keyframes scaleIn {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
@keyframes scaleOut {
from {
transform: scaleX(1);
}
to {
transform: scaleX(0);
}
}
④ JavaScript
document.addEventListener('DOMContentLoaded', function() {
const navItems = document.querySelectorAll('.nav-item');
navItems.forEach(item => {
item.addEventListener('click', function(e) {
e.preventDefault();
// アクティブ状態の更新
navItems.forEach(nav => nav.classList.remove('active'));
this.classList.add('active');
// タブの切り替え処理(必要に応じて)
const tabName = this.getAttribute('data-tab');
console.log('Selected tab:', tabName);
});
});
});
⑤ カスタマイズ例
/* スケール効果の強度調整 */
.scale-indicator {
transform: scaleX(0.5);
}
.nav-item.active .scale-indicator {
transform: scaleX(1.1);
}
/* スケール速度の調整 */
.scale-indicator {
transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
ズーム効果
① デモ
See the Pen アクティブ状態ズーム by ケケンタ (@lgshifbg-the-looper) on CodePen.
- 拡大・縮小による動的表現
- 視覚的インパクトが高い
- 注目を集める効果
② HTML
<div class="nav-container">
<nav class="zoom-nav">
<a href="#" class="nav-item active" data-tab="home">
<span class="nav-text">ホーム</span>
<div class="zoom-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="about">
<span class="nav-text">概要</span>
<div class="zoom-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="services">
<span class="nav-text">サービス</span>
<div class="zoom-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="contact">
<span class="nav-text">お問い合わせ</span>
<div class="zoom-indicator"></div>
</a>
</nav>
</div>
③ CSS
/* ズームナビゲーション */
.zoom-nav {
display: flex;
background: #f8f9fa;
border-radius: 10px;
padding: 8px;
position: relative;
}
.nav-item {
flex: 1;
text-decoration: none;
color: #666;
padding: 12px 16px;
text-align: center;
position: relative;
transition: all 0.3s ease;
border-radius: 8px;
z-index: 1;
}
.nav-item:hover {
color: #333;
}
.nav-item.active {
color: #E91E63;
}
/* ズームインジケーター */
.zoom-indicator {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 3px;
background: #E91E63;
transform: scaleX(0.8);
opacity: 0;
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 0;
}
.nav-item.active .zoom-indicator {
transform: scaleX(1);
opacity: 1;
}
/* ズームアニメーション */
@keyframes zoomIn {
from {
transform: scaleX(0.5);
opacity: 0;
}
to {
transform: scaleX(1);
opacity: 1;
}
}
@keyframes zoomOut {
from {
transform: scaleX(1);
opacity: 1;
}
to {
transform: scaleX(1.2);
opacity: 0;
}
}
④ JavaScript
document.addEventListener('DOMContentLoaded', function() {
const navItems = document.querySelectorAll('.nav-item');
navItems.forEach(item => {
item.addEventListener('click', function(e) {
e.preventDefault();
// アクティブ状態の更新
navItems.forEach(nav => nav.classList.remove('active'));
this.classList.add('active');
// タブの切り替え処理(必要に応じて)
const tabName = this.getAttribute('data-tab');
console.log('Selected tab:', tabName);
});
});
});
⑤ カスタマイズ例
/* ズーム効果の強度調整 */
.zoom-indicator {
transform: scaleX(0.3);
}
.nav-item.active .zoom-indicator {
transform: scaleX(1.2);
}
/* ズーム速度の調整 */
.zoom-indicator {
transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);
}
フリップ効果
① デモ
See the Pen アクティブ状態フリップ by ケケンタ (@lgshifbg-the-looper) on CodePen.
- 3D的な回転効果
- 視覚的インパクトが最大
- プレミアムな印象
② HTML
<div class="nav-container">
<nav class="flip-nav">
<a href="#" class="nav-item active" data-tab="home">
<span class="nav-text">ホーム</span>
<div class="flip-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="about">
<span class="nav-text">概要</span>
<div class="flip-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="services">
<span class="nav-text">サービス</span>
<div class="flip-indicator"></div>
</a>
<a href="#" class="nav-item" data-tab="contact">
<span class="nav-text">お問い合わせ</span>
<div class="flip-indicator"></div>
</a>
</nav>
</div>
③ CSS
/* フリップナビゲーション */
.flip-nav {
display: flex;
background: #f8f9fa;
border-radius: 10px;
padding: 8px;
position: relative;
perspective: 1000px;
}
.nav-item {
flex: 1;
text-decoration: none;
color: #666;
padding: 12px 16px;
text-align: center;
position: relative;
transition: all 0.3s ease;
border-radius: 8px;
z-index: 1;
}
.nav-item:hover {
color: #333;
}
.nav-item.active {
color: #607D8B;
}
/* フリップインジケーター */
.flip-indicator {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 3px;
background: #607D8B;
transform: rotateX(90deg);
transition: transform 0.6s ease;
transform-style: preserve-3d;
z-index: 0;
}
.nav-item.active .flip-indicator {
transform: rotateX(0deg);
}
/* フリップアニメーション */
@keyframes flipIn {
from {
transform: rotateX(90deg);
}
to {
transform: rotateX(0deg);
}
}
@keyframes flipOut {
from {
transform: rotateX(0deg);
}
to {
transform: rotateX(-90deg);
}
}
④ JavaScript
document.addEventListener('DOMContentLoaded', function() {
const navItems = document.querySelectorAll('.nav-item');
navItems.forEach(item => {
item.addEventListener('click', function(e) {
e.preventDefault();
// アクティブ状態の更新
navItems.forEach(nav => nav.classList.remove('active'));
this.classList.add('active');
// タブの切り替え処理(必要に応じて)
const tabName = this.getAttribute('data-tab');
console.log('Selected tab:', tabName);
});
});
});
⑤ カスタマイズ例
/* フリップ軸の変更 */
.flip-indicator {
transform: rotateX(90deg);
}
.nav-item.active .flip-indicator {
transform: rotateX(0deg);
}
まとめ
今回ご紹介した5種類のアクティブ状態アニメーションは、それぞれ異なる特徴と用途があります。
用途別おすすめ
- ナビゲーション: スライド効果・フェード効果
- タブ選択: スケール効果・ズーム効果
- プレミアムサイト: フリップ効果
実装のポイント
- パフォーマンスを考慮: アニメーションは軽量に
- ユーザビリティを重視: 現在位置が分かりやすく
- ブラウザ対応: 幅広いブラウザで動作するように
- アクセシビリティ: キーボードナビゲーション対応も考慮



アクティブ状態アニメーションは、ユーザーエクスペリエンスを向上させる重要な要素です。この記事のコードを参考に、プロジェクトに最適なアニメーションを実装してください!
あわせて読みたい
もっと効率的にWeb制作を学びたい方へ
Web制作の学習は楽しいものですが、一人で進めていると「これで合っているのかな?」と不安になることもありますよね。
僕も独学でWeb制作を学んできましたが、今思うと「もっと早く知りたかった」と思うことがたくさんあります。
特に以下のような方は、一度プログラミングスクールの利用を検討してみることをおすすめします。
- 学習の方向性に迷いがある方
- 効率的にスキルを身につけたい方
- 転職や副業でWeb制作を活用したい方
- 挫折経験がある方
忍者CODEなら、業界最安値で24時間サポート付きの学習環境が整っています。


コメント