CSSアニメーションの基本と実用エフェクト例
2025.10.21

CSSアニメーションの基本と実用エフェクト例
目次
- 1 CSSアニメーションの基本と実用エフェクト例
- 2 1. 基本:transition と transform / opacity の組み合わせ
- 3 2. 基本:@keyframes を使ったアニメーション
- 4 3. 実用エフェクト例(コード付き)
- 5 3-1. ボタンの押下感(微細なスケール)
- 6 3-2. フェード+スライドで読み込み時の登場アニメ(スタガー付き)
- 7 3-3. ローディング(スピナー)
- 8 3-4. カードの裏返し(3D フリップ)
- 9 3-5. CSSのみのトースト(簡易通知)出現・消失
- 10 4. アニメーションの設定項目(短いリファレンス)
- 11 5. アクセシビリティとユーザー設定
- 12 6. パフォーマンス最適化のポイント
- 13 7. よくある落とし穴と回避策
- 14 8. 実践Tips:JSと組み合わせた応用
- 15 9. まとめ
CSSだけで表現できるアニメーションは、UIに「動き」と「注目」を与え、操作感(UX)を高めます。本記事では、transitionと@keyframes(animation)の基本から、実務でよく使う実用的なエフェクト例、アクセシビリティとパフォーマンスの注意点までまとめて解説します。
1. 基本:transition と transform / opacity の組み合わせ
transitionは、プロパティの変化(状態遷移)にアニメーションを付ける際に使います。レイアウト(幅・高さ・margin)ではなく、transform と opacity を使うのがパフォーマンス面の基本です。
/* ホバー時に滑らかに色と位置を変える */
.btn-button {
display: inline-block;
padding: 0.5em 1.5em;
background-color: #2cb1dc;
color: #fff;
border-radius: 0.4em;
opacity: 1;
transition: transform 0.2s ease, opacity 0.5s, background 0.5s ease;
}
.btn-button:hover {
transform: translateY(-4px);
background: #ff0000;
opacity: 0.8;
}2. 基本:@keyframes を使ったアニメーション
@keyframes(および animation)は、複数ステップのアニメーションやループするエフェクトに向きます。
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
.fade-in-up {
animation: fadeInUp 1s ease infinite alternate forwards;
}3. 実用エフェクト例(コード付き)
3-1. ボタンの押下感(微細なスケール)
.btn-press {
display: inline-block;
padding: 0.5em 1.5em;
background-color: #2cb1dc;
color: #fff;
border-radius: 0.4em;
opacity: 1;
transition: transform 120ms cubic-bezier(.2,.8,.2,1);
}
.btn-press:active {
transform: scale(0.9);
}クリック/タップ時に縮むことで「押した感」を自然に出します。
3-2. フェード+スライドで読み込み時の登場アニメ(スタガー付き)
/* 共通アニメ */
@keyframes fadeSlide {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
.item {
opacity: 0;
transform: translateY(10px);
animation: fadeSlide 1.2s ease infinite alternate forwards;
}
/* スタガー(遅延)を付ける */
.item--delay-1 { animation-delay: 0.8s; }
.item--delay-2 { animation-delay: 1.6s; }
.item--delay-3 { animation-delay: 2.4s; }リストやカードの表示時に順番にフェードインさせると、視線導線が自然になり印象が良くなります。
3-3. ローディング(スピナー)
@keyframes spin {
to { transform: rotate(360deg); }
}
.spinner {
width: min(50px, calc(50 / 640 * 100vw));
aspect-ratio: 1 / 1;
background-color: #fff;
border: 4px solid rgba(0,0,0,0.2);
border-top-color: #3498db;
border-radius: 50%;
animation: spin 2s linear infinite;
}3-4. カードの裏返し(3D フリップ)
.flip {
perspective: 1000px;
}
.flip__inner {
position: relative;
width: 300px;
height: 180px;
transform-style: preserve-3d;
transition: transform 500ms cubic-bezier(.2,.8,.2,1);
}
.flip:hover .flip__inner {
transform: rotateY(180deg);
}
.flip__face {
position: absolute;
backface-visibility: hidden;
inset: 0;
}
.flip__face--back {
transform: rotateY(180deg);
}3D系は演出効果が高いですが、モバイルや低性能端末で重くなる場合があるため注意が必要です。
(サムネ・タイトルなど)を配置します。
3-5. CSSのみのトースト(簡易通知)出現・消失
.toast {
position: fixed;
bottom: 24px;
left: 50%;
transform: translateX(-50%) translateY(12px);
opacity: 0;
transition: opacity 0.4s ease, transform 0.4s ease;
background: #222;
color: #fff;
padding: 12px 16px;
border-radius: 8px;
}
.toast--visible {
opacity: 1;
transform: translateX(-50%) translateY(0);
}表示は JS でクラスを付け外ししますが、アニメーションは CSS で担保するとシンプルです。
4. アニメーションの設定項目(短いリファレンス)
transition: property duration timing-function delay;animation: name duration timing-function delay iteration-count direction fill-mode;- 代表的な
timing-function:ease,linear,ease-in,ease-out,cubic-bezier() fill-mode: forwardsはアニメ終了後も最終状態を保持する
5. アクセシビリティとユーザー設定
アニメーションは便利ですが、動くものに不快感を覚えるユーザーや、画面酔いをするユーザーもいます。prefers-reduced-motion による配慮は必須です。
@media (prefers-reduced-motion: reduce) {
.animated, .fade-in-up, .spinner {
animation-duration: 1ms !important;
transition-duration: 1ms !important;
}
}この設定により、動きをほぼなくして静的に表示するようにできます。
6. パフォーマンス最適化のポイント
- アニメーションはできるだけ transform(translate/scale/rotate) と opacity に限定する(レイアウトの再計算を避ける)
will-changeは頻繁に使わない。必要な要素に対して短時間だけ指定する- 大量のアニメーションを同時に走らせない(スタガーや遅延を活用)
- 低スペック端末ではアニメをオフにするフォールバックを用意する
7. よくある落とし穴と回避策
- レイアウトプロパティのアニメーション(width/height/margin)は避ける。これらはレイアウト計算(reflow)を発生させ、負荷が高い。
- アニメーションの過剰な使用でページがうるさくなる。目的を明確にして使う。
- 3D効果は美しいが、モバイルでカクつく場合あり。
will-changeやbackface-visibilityの活用で改善できることもある。
8. 実践Tips:JSと組み合わせた応用
CSSアニメーションは JS と組み合わせると効果的です。例:
- Intersection Observerで要素が見えたらクラス付与してアニメ開始
- トリガーは pointer events(ホバー)ではなくフォーカスやクリックにも対応する
- ユーザー設定(アニメON/OFF)を保存して、再訪時も反映する
9. まとめ
- 用途に応じて
transitionと@keyframesを選ぶ - パフォーマンス重視で
transformとopacityを中心にアニメを設計する prefers-reduced-motionでユーザー配慮を入れること
このページのコードはそのままコピペで試せます。実際に動作させてみて、UX を高める最適なアニメーションを見つけてください。






