CSS の動きは2種類ある

CSS でアニメーションを作る方法は大きく2つ。 まずここをしっかり区別しておこう。

  • transition(トランジション)
    ホバーなどをトリガーに「A の状態から B の状態」へなめらかに変化させる。 「ボタンにマウスを乗せたら色が変わる」みたいなやつ。
  • animation(アニメーション)
    @keyframes を使って「ループし続ける動き」や「複雑な動き」を作る。 ローディングスピナーや、ページ読み込み時のふわっと登場演出など。

まず transition から始めよう

transition はシンプルで、一番使う場面も多い。 書き方を覚えれば今日からすぐ使える。

transition の基本構文
transition: プロパティ名  時間  イージング  遅延;

/* 例:全プロパティを0.3秒でeaseアニメーション */
transition: all 0.3s ease;

/* 例:背景色を0.4秒、transformを0.2秒 */
transition: background 0.4s ease, transform 0.2s ease;

ボタンに transition を付けるとこうなる。ホバーしてみて!

▶ Live Demo — transition
このボタンの CSS
background: #7c3aed;
transition: background 0.3s ease,
            transform 0.2s ease,
            box-shadow 0.3s ease;

/* :hover 時 */
background: #6d28d9;
transform: translateY(-3px);
box-shadow: 0 10px 30px rgba(124,58,237,0.3);

イージング(timing-function)って何?

動きの「加速感」のこと。同じ時間でも、イージングが変わると印象がガラッと変わる。 下のバーがそれぞれ違うイージングで動いているよ。

▶ イージング比較
linear — 一定速度。機械的な印象。
ease — デフォルト。自然な動き。これが一番使いやすい。
ease-in — ゆっくり始まって加速。「飛び出す」感じ。
ease-out — 速く始まって減速。「着地する」感じ。
💡 現場の経験則
迷ったら ease-out を使おう。 要素が「落ち着く」感じになって、UIとして一番自然に見える。 ease-in は「飛び出していく」感じになるので、退場アニメーションに向いている。

次は @keyframes animation

transition がトリガーありの「A→B」なら、 animation は「ひとりでに動き続ける」演出に使う。

@keyframes の書き方
/* ① アニメーションの「型」を定義 */
@keyframes fadeInUp {
  0%   { opacity: 0; transform: translateY(20px); }
  100% { opacity: 1; transform: translateY(0); }
}

/* ② 要素に適用 */
.card {
  animation: fadeInUp 0.6s ease-out;
}

よく使うアニメーションパターンを3つ見てみよう。

▶ よく使うアニメーションパターン
fadeInUp
登場演出
spin
ローディング
pulse
通知・注目

animation プロパティの全オプション

プロパティ値の例意味
animation-namefadeInUp@keyframes の名前
animation-duration0.6s1回にかかる時間
animation-timing-functionease-outイージング
animation-delay0.2s開始までの遅延
animation-iteration-countinfinite / 3繰り返し回数
animation-fill-modeforwards終了後の状態(元に戻さない)
ページ読み込み時の「ふわっと登場」実装例
@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY(24px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* カードに適用。3枚それぞれ少しずつ遅らせる */
.card {
  animation: fadeInUp 0.6s ease-out forwards;
  opacity: 0; /* 初期状態を非表示に */
}
.card:nth-child(1) { animation-delay: 0s; }
.card:nth-child(2) { animation-delay: 0.1s; }
.card:nth-child(3) { animation-delay: 0.2s; }
⚠️ アクセシビリティに注意
アニメーションが苦手な人(前庭障害など)への配慮として、 prefers-reduced-motion メディアクエリも一緒に書こう。

@media (prefers-reduced-motion: reduce) {
  * { animation: none !important; transition: none !important; }
}

まとめ ― transition と animation の使い分け

  • ホバー・フォーカスなど「ユーザー操作がトリガー」なら transition。
  • ローディング・登場演出など「ひとりでに動く」なら @keyframes animation。
  • イージングは迷ったら ease-out。これが一番「自然」に見える。
  • animation-delay を少しずつずらすと「順番に登場」する演出が作れる。
  • prefers-reduced-motion で動きが苦手なユーザーへの配慮も忘れずに。