CSSアニメーション入門|@keyframesの使い方
こんにちは、「ぷろぐらの森」です🌱
この記事を読むと、CSSだけで「動く」Webページが作れるようになります。
「JavaScriptを使わなくても動かせるの?」そのとおりです!CSSには「アニメーション機能」が標準で備わっていて、コードを少し書くだけでキャラクターが登場したり、ボタンが光ったりする演出が作れます。
ゲームを例にしながら一緒に試してみましょう!
この記事でわかること
- CSSアニメーション(`@keyframes`)とトランジション(`transition`)の違い
- フェードイン・スライド・回転・拡大縮小など定番5種の書き方
- ゲームUIに使えるホバーボタンの作り方
- 実践:ゲーム風スコア表示アニメーション
- よくある失敗と解決策
「アニメーション」と「トランジション」は別物!
まず最初に、CSSには動きをつける方法が 2種類あります。
ここを混同すると「あれ?思い通りに動かない」と迷子になるので、先に整理しておきましょう!
| 種類 | プロパティ | 用途 | 自動再生 |
| アニメーション | @keyframes + animation | 複雑な動き・ループ・自動演出 | ✅ できる |
| トランジション | transition | ホバー時などの状態変化 | ❌ きっかけが必要 |
ゲームで例えると…
@keyframes
➡キャラクターの「登場シーン演出」
transition
➡ボタンに触れたときの「光るエフェクト」
というイメージです!
@keyframesアニメーションの基本
書き方の基本
@keyframes アニメーション名 {
0% { /* 最初の状態 */ }
100% { /* 最後の状態 */ }
}
/* ② 要素に適用する */
.要素 {
animation: アニメーション名 時間 タイミング;
}
たったこれだけです!「0%が始まり、100%が終わり」と覚えてください。
実践例①:ふわっと登場するHPゲージ
ゲームでよくある「画面が始まったらHPバーが下からふわっと出てくる」演出を作ってみましょう。
<!DOCTYPE html>
<div class="hp-bar">
<span>HP ████████ 100</span>
<link rel="stylesheet" href="style.css">
</div>
</html>
style.css <- ファイルの名前
/* ふわっと出てくるアニメーション */
@keyframes slideUp {
0% {
opacity: 0; /* 最初は透明 */
transform: translateY(20px); /* 少し下にある */
}
100% {
opacity: 1; /* 完全に見える */
transform: translateY(0); /* 元の位置に戻る */
}
}
.hp-bar {
animation: slideUp 0.8s ease-out; /* 0.8秒かけて再生 */
background: #2a2a2a;
color: #00ff88;
padding: 10px 20px;
border-radius: 8px;
font-family: monospace;
font-size: 1.2rem;
}
ease-outは「最初は速く、最後はゆっくり止まる」タイミングです。
ゲームのUIに自然な動きを出したいときに使います!
よく使うアニメーション効果5選
① フェードイン(opacity)
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
/* from/to は 0%/100% と同じ意味 */
② スライドイン(transform: translate)
@keyframes slideInLeft {
from { transform: translateX(-50px); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
③ 回転(transform: rotate)— ローディングに便利
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.loading-icon {
animation: spin 1s linear infinite; /* infinite = 無限ループ */
}
④ 拡大縮小(transform: scale)— ダメージ演出に
@keyframes damage {
0% { transform: scale(1); }
30% { transform: scale(1.2); color: red; } /* 瞬間的に大きくなる */
100% { transform: scale(1); }
}
⑤ 点滅(opacity の繰り返し)— 残りHPが少ないとき
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0.2; }
}
.hp-danger {
animation: blink 0.6s ease-in-out infinite;
color: red;
}
transitionでホバーアニメーション
「ホバーしたときだけ動かしたい」というケースには transitionが簡単です。
書き方
.ボタン {
transition: 変化させるプロパティ 時間 タイミング;
}
.ボタン:hover {
/* ホバー時の変化後の状態 */
}
実践例②:ゲームのスタートボタン
<!DOCTYPE html>
<button class="start-btn">▶ ゲームスタート</button>
<link rel="stylesheet" href="style.css">
</html>
style.css <- ファイルの名前
.start-btn {
background: #1a1a2e;
color: #e94560;
border: 2px solid #e94560;
padding: 14px 32px;
font-size: 1.1rem;
border-radius: 6px;
cursor: pointer;
/* ← ここがポイント!変化に0.25秒かける */
transition: background 0.25s ease, transform 0.2s ease, box-shadow 0.2s ease;
}
.start-btn:hover {
background: #e94560;
color: #fff;
transform: scale(1.06); /* 少し大きくなる */
box-shadow: 0 0 16px #e9456080; /* 光彩エフェクト */
}
.start-btn:active {
transform: scale(0.98); /* 押した瞬間に少し沈む */
}
マウスをのせると、ボタンが少し大きくなるアニメーションが加わります!
@keyframes vs transition 使い分けガイド
迷ったときはこの表で判断してください。
| やりたいこと | 使うもの |
|---|---|
| ページを開いたら自動で動かしたい | @keyframes |
| ループさせたい | @keyframes + infinite |
| 途中の状態(30%など)を細かく制御したい | @keyframes |
| ホバー・クリックで動かしたい | transition |
| 状態AからBへシンプルに変化させたい | transition |
💡 現役エンジニアのひとこと
現場でよく見るのは transitionの方が圧倒的に多いです。
ボタン・リンク・カード要素のホバー演出はほぼ transitionで足ります。
@keyframesを使うのはローディングスピナー、通知バナーの登場演出、ゲームUIなど『自動で動かすもの』に限定されます。
最初は transitionから覚えて、必要になったら @keyframesに進むのがおすすめです!
実践:ゲーム風スコア表示アニメーション
@keyframes と transition を組み合わせた応用例です。
<!DOCTYPE html>
<div class="score-board">
<p class="score-label">SCORE</p>
<p class="score-number" id="score">0</p>
<button class="add-btn" onclick="addScore()">+100ポイント</button>
</div>
</html>
style.css <- ファイルの名前
.score-board {
background: #0f0f1a;
color: #fff;
text-align: center;
padding: 30px;
border-radius: 12px;
font-family: 'Courier New', monospace;
width: 220px;
margin: 40px auto;
}
.score-label {
color: #aaa;
font-size: 0.85rem;
letter-spacing: 4px;
margin: 0;
}
.score-number {
font-size: 3rem;
font-weight: bold;
color: #00ff88;
margin: 8px 0 20px;
/* スコアが加算されたときのアニメーション */
transition: transform 0.1s ease;
}
/* スコア加算時にクラスを付与してポップさせる */
@keyframes pop {
0% { transform: scale(1); }
40% { transform: scale(1.25); }
100% { transform: scale(1); }
}
.score-number.popping {
animation: pop 0.3s ease-out;
}
.add-btn {
background: transparent;
border: 1px solid #00ff88;
color: #00ff88;
padding: 8px 20px;
border-radius: 4px;
cursor: pointer;
transition: background 0.2s;
}
.add-btn:hover {
background: #00ff8820;
}
javasc.js<- ファイルの名前
let score = 0;
function addScore() {
score += 100;
const el = document.getElementById('score');
el.textContent = score;
el.classList.remove('popping');
void el.offsetWidth; // ブラウザに「クラスが消えた」と認識させるおまじない。これがないと同じアニメーションが再発火しない
el.classList.add('popping');
}
アニメーション作りのよくある失敗と解決策
| 失敗パターン | 原因 | 解決策 |
|---|---|---|
| アニメーションが動かない | animationプロパティの綴りミス | Chrome DevTools で確認 |
| ループしない | infiniteを書き忘れ | animation: spin 1s linear infinite; |
| ホバーが効かない | transitionを:hoverの側に書いている | transitionは通常時のセレクタに書く |
| 動きがカクカク | left/topを動かしている | transform: translate()に変える(GPU最適化) |
💡 現役エンジニアのひとこと
left や top でアニメーションするとブラウザが毎フレームレイアウトを再計算するので重くなります。
スマホでカクつく原因の多くはこれです(´;ω;`)
transformと opacity に変えるだけでスムーズになることがほとんどです。
まとめ:CSSアニメーション 早見表
- 【自動で動かす】 @keyframes + animation
- ループ・ページ読み込み演出・ゲームUI
- 【操作で動かす】 transition
- ホバー・クリック・フォーカス
- 【パフォーマンス優先なら】transform / opacity を使う
- → left / top / width の変化は重い
CSSアニメーションをマスターすると、Webページの「印象」がガラッと変わります。
まずはホバーボタン(transition)から試してみて、慣れてきたら @keyframesで本格的なゲームUIに挑戦してみてください!
関連記事








もっと本格的にCSSを学びたい方へ
この記事でCSSアニメーションの楽しさが伝わったなら、ぜひ体系的にフロントエンドを学んでみてください。
独学で詰まりやすいポイント(FlexboxやGridとアニメーションの組み合わせ、レスポンシブ対応など)も、
プログラミングスクールなら現役エンジニアにすぐ聞ける環境で学べます。
まずは書籍から始めたい方はこちら






コメント