CSS アニメーションの達人になる! @keyframes をマスターして滑らかな動きを表現しよう


CSSの@keyframes at-ruleは、アニメーションの動きを定義するために使用されます。アニメーションの開始と終了状態、およびその間の経過点を指定することで、滑らかな動きのあるアニメーションを作成することができます。

基本構文

@keyframes animation-name {
  from {
    /* 開始状態のスタイル */
  }
  
  to {
    /* 終了状態のスタイル */
  }
  
  /* 中間地点のスタイル (オプション) */
  50% {
    /* ... */
  }
}

例:回転アニメーション

次の例では、要素を360度回転させるアニメーションを定義します。

@keyframes rotate {
  from {
    transform: rotate(0deg);
  }
  
  to {
    transform: rotate(360deg);
  }
}

このアニメーションを要素に適用するには、以下のスタイルを要素に追加します。

animation-name: rotate;
animation-duration: 2s;
  • アニメーションの繰り返し回数などは、animation-iteration-countanimation-direction などのプロパティで設定できます。
  • アニメーションの速度は、animation-duration プロパティで設定できます。
  • 中間地点のキーフレームは、アニメーションの経過点を定義します。キーフレームのタイミングは、0% から 100% の範囲でパーセンテージで指定します。
  • to キーフレームは、アニメーションの終了状態を定義します。
  • from キーフレームは、アニメーションの開始状態を定義します。
  • 各キーフレームには、アニメーションの特定の時点における要素のスタイルを定義する一連のCSSプロパティが含まれます。
  • @keyframes ルールには、アニメーションの名前を指定する必要があります。この名前は、アニメーションを要素に適用する際に使用されます。
  • アニメーションは、JavaScriptを使用して制御することもできます。
  • 複数のアニメーションを要素に適用することができます。
  • @keyframes ルールは、グローバルスコープを持つため、ページ内のすべての要素で使用できます。
  • パフォーマンスを考慮して、アニメーションを効率的に使用するようにしましょう。
  • @keyframes は、CSS3で導入された機能です。古いブラウザではサポートされていない場合があります。


フェードインアニメーション

このアニメーションは、要素を徐々に表示します。

@keyframes fadeIn {
  from {
    opacity: 0;
  }
  
  to {
    opacity: 1;
  }
}

.element {
  animation-name: fadeIn;
  animation-duration: 2s;
}

回転アニメーション

このアニメーションは、要素を回転します。

@keyframes rotate {
  from {
    transform: rotate(0deg);
  }
  
  to {
    transform: rotate(360deg);
  }
}

.element {
  animation-name: rotate;
  animation-duration: 2s;
}

スケールアニメーション

このアニメーションは、要素を拡大縮小します。

@keyframes scale {
  from {
    transform: scale(1, 1);
  }
  
  50% {
    transform: scale(1.5, 1.5);
  }
  
  to {
    transform: scale(1, 1);
  }
}

.element {
  animation-name: scale;
  animation-duration: 2s;
}

パルスアニメーション

このアニメーションは、要素を大きくしてから小さくします。

@keyframes pulse {
  from {
    transform: scale(1, 1);
  }
  
  50% {
    transform: scale(1.2, 1.2);
  }
  
  to {
    transform: scale(1, 1);
  }
}

.element {
  animation-name: pulse;
  animation-duration: 2s;
}

移動アニメーション

このアニメーションは、要素を横方向に移動します。

@keyframes move {
  from {
    transform: translateX(0);
  }
  
  to {
    transform: translateX(200px);
  }
}

.element {
  animation-name: move;
  animation-duration: 2s;
}

カラーチェンジアニメーション

このアニメーションは、要素の色を青から緑、そして赤に変更します。

@keyframes colorChange {
  from {
    background-color: blue;
  }
  
  50% {
    background-color: green;
  }
  
  to {
    background-color: red;
  }
}

.element {
  animation-name: colorChange;
  animation-duration: 2s;
}

これらの例はほんの一例です。@keyframes を使用して、様々な種類のアニメーションを作成することができます。創造性を発揮して、あなただけのユニークなアニメーションを作ってみてください。

  • 複数のアニメーションを組み合わせて、より複雑なアニメーションを作成することができます。
  • アニメーションの再生方向を調整するには、animation-direction プロパティの値を変更します。
  • アニメーションの繰り返し回数を調整するには、animation-iteration-count プロパティの値を変更します。
  • アニメーションの速度を調整するには、animation-duration プロパティの値を変更します。


CSS transition プロパティ

transition プロパティは、要素の状態が変化した際に滑らかなアニメーションを適用することができます。 @keyframes ほど複雑なアニメーションには対応できませんが、シンプルなフェードイン、フェードアウト、移動などのアニメーションであれば、簡単に記述することができます。

例:要素を1秒かけて不透明度を0から1に変更するアニメーション

.element {
  transition: opacity 1s;
  opacity: 0; /* 初期状態を透明にする */
}

.element:hover {
  opacity: 1; /* マウスホバー時に不透明度を1にする */
}

SVGアニメーション

SVGアニメーションは、SVGファイルを**<animate>タグを使用してアニメーションさせる方法です。複雑な動きやモーフィングなど、@keyframes` では表現が難しいアニメーションも実現できます。

例:円を回転させるSVGアニメーション

<svg width="100" height="100" viewBox="0 0 100 100">
  <circle cx="50" cy="50" r="40" fill="red">
    <animateTransform attributeName="transform"
                     type="rotate"
                     from="0 50 50"
                     to="360 50 50"
                     dur="2s"
                     repeatCount="indefinite" />
  </circle>
</svg>

JavaScriptライブラリ

GreenSockやAnime.jsなどのJavaScriptライブラリを使用すると、より高度なアニメーションを作成することができます。これらのライブラリは、@keyframes では実現できないような複雑な動きやインタラクティブなアニメーションを可能にします。

例:GreenSockを使用して要素をバウンスさせるアニメーション

const element = document.querySelector('.element');

const bounceAnimation = new TimelineLite()
  .to(element, 1, { y: 100, ease: Elastic.easeInOut })
  .to(element, 1, { y: 0, ease: Elastic.easeInOut });

bounceAnimation.play();

それぞれの方法の利点と欠点

方法利点欠点
transition記述が簡単複雑なアニメーションには不向き
SVGアニメーション複雑な動きやモーフィングが可能コードが煩雑になる場合がある
JavaScriptライブラリ高度なアニメーションやインタラクションが可能ライブラリの習得が必要

状況に応じて、最適な方法を選択することが重要です。シンプルなアニメーションであれば transition を、複雑なアニメーションであれば SVGアニメーションやJavaScriptライブラリを使用するのがおすすめです。