この記事の目次
CSS @keyframesとanimationの使い方とは
CSSアニメーションは、@keyframes で「動きの設計図」を作り、animation プロパティで要素に割り当てる仕組みです。CSS transition が「状態Aから状態B」の2点間なのに対し、@keyframes では途中の地点も自由に指定でき、無限に繰り返すこともできます。MDNでは、2015年9月から主要ブラウザで使える Baseline の機能とされています。
基本(構文・仕組み)
まず @keyframes に名前を付けて、各地点(from / to、または0〜100%)のスタイルを書きます。
@keyframes fade-up {
from { opacity: 0; transform: translateY(16px); }
to { opacity: 1; transform: translateY(0); }
}
次に、要素へ animation で割り当てます。
.card { animation: fade-up .6s ease-out both; }
主な個別プロパティは次のとおりです。
| プロパティ | 役割 | 例 |
|---|---|---|
| animation-name | @keyframes の名前 | fade-up |
| animation-duration | 1回にかける時間 | .6s |
| animation-timing-function | 速度の変化 | ease-out |
| animation-delay | 開始までの待ち時間 | .15s |
| animation-iteration-count | 繰り返し回数 | infinite |
| animation-fill-mode | 前後のスタイルを保持するか | both |
| animation-direction | 往復など再生の向き | alternate |
MDNによると、keyframe 内の !important は無視されます。また、補間できないプロパティも無視されます。
サンプルコード(実行結果つき)
フェードイン、回転するスピナー、拍動するドットの3つを1ページにまとめた例です。
@keyframes fade-up {
from { opacity: 0; transform: translateY(16px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.15); } }
.card { animation: fade-up .6s ease-out both; }
.card:nth-child(2) { animation-delay: .15s; }
.spinner {
width: 32px; height: 32px;
border: 4px solid #cbd5e1; border-top-color: #2563eb; border-radius: 50%;
animation: spin 1s linear infinite;
}
.dot { width: 20px; height: 20px; border-radius: 50%; background: #e11d48;
animation: pulse 1.2s ease-in-out infinite; }
@media (prefers-reduced-motion: reduce) {
.card, .spinner, .dot { animation: none; }
}
both を付けると、遅延中は最初の状態(opacity:0)を保ち、終了後は最後の状態を保ちます。付けないと、遅延中に一瞬完成形が見える「ちらつき」が起きることがあります。
動作確認(検証環境と結果)
- 環境: Windows 11、Microsoft Edge 154(Chromium系、headless)。ログは
C:Tempks2techtestscss-keyframes-animation.md。 - 実行:
render.ps1で描画し、document.getAnimations()で割り当てを確認しました。 - 結果: 4本のアニメーションが生成され、fade-up は duration=600ms・iterations=1・fill=both、2枚目の delay=150ms、spin と pulse は iterations=Infinity でした。fade-up を
finish()した後は、1枚目の opacity=1、transform はmatrix(1, 0, 0, 1, 0, 0)でした。 - 注意: headless の仮想時間では実時間のアニメーションが進まないため、動きの滑らかさは目視していません。
prefers-reduced-motion: reduceの無効化も、OS設定を切り替えての確認はしていません(未検証)。
CSS @keyframesとanimationの使い方の注意点
- 常時動く無限アニメーションは、読み取りの妨げになります。WCAG 2.2.2では、自動で始まり5秒を超えて続く動くコンテンツに、一時停止・停止・非表示の手段を求めています(動きが活動に不可欠な場合などは例外)。
- アニメーションさせるのは、
transformとopacityを優先します。 - 同名の
@keyframesが複数ある場合は、最後のものが使われます。名前の衝突に注意してください。 - スクロール連動の
animation-timelineは比較的新しい機能です。使う前に対応状況を確認してください。
CSS @keyframesとanimationの使い方でよくあるミス
animation-durationを書かず、0秒のまま動かない。- 終了後に元の位置へ戻る(
forwardsやbothを忘れる)。 transformをfromとtoで異なる関数の並びにして、期待どおりに補間されない。prefers-reduced-motionを考慮せず、前庭障害のある利用者に負担をかける。
ブラウザ対応・バージョン
基本の @keyframes と animation は、MDNの Baseline 表記で2015年9月から広く使えます。新しいプロパティは、MDNの互換性表で確認してください。古いコードに見られる -webkit- 付きの記述は、現在は不要になっています({{css-vendor_prefix}}参照)。
CSS @keyframesとanimationの使い方のチェックリスト
@keyframesの名前とanimation-nameが一致しているか。animation-fill-modeを目的に合わせて指定したか。- 無限アニメーションに、停止手段や
prefers-reduced-motionの対応があるか。 - 動かすプロパティは
transform/opacityか。
CSS @keyframesとanimationの使い方のFAQ(よくある質問)
Q. JavaScriptでアニメーションを制御できますか?
A. 可能です。element.getAnimations() や Web Animations API で、再生・一時停止・完了を制御できます。
Q. 1つの要素に複数のアニメーションを付けられますか?
A. カンマ区切りで animation: fade-up .6s both, pulse 1s infinite; のように書けます。同じプロパティを動かすものを重ねると、後ろのものが優先されます。
Q. 一時停止はどう書きますか?
A. animation-play-state: paused; を使います。ホバーで止める用途などに便利です。
筆者の見解(CSS @keyframesとanimationの使い方)
私見では、CSSアニメーションは「目的がある動き」に限るのが良いと考えます。読み込み完了の通知や、注意を引く最小限の拍動など、意味を持たせた使い方であれば効果的です。一方で、装飾だけで常時動かし続けるのは避けるべきでしょう。無効化を最初から用意するのが基本姿勢です。
CSS @keyframesとanimationの使い方の関連項目
- CSS transition
- ダークモード対応
- {{css-vendor_prefix}}
- CSSのz-indexプロパティによる重なり順は『箱』を基準に決まる
- ボタンデザイン
