【コピペOK】CSS @keyframesの使い方|animationプロパティ一覧とサンプルコード

  • URLをコピーしました!

こんにちはrey( @reydesign8376) です
都内の勤務生活を辞めてWebデザイナーに。今は趣味のサーフィンなどしながら海沿いでのんびり暮らしています。

今回は、CSSアニメーションの基本「@keyframes」の使い方を解説します。書き方の基本から、animationプロパティの一覧、コピペで使えるサンプル、よくある「動かない!」の対処までまとめたので、保存して使ってみてください。

この記事でわかること

  • @keyframesの基本の書き方
  • animationプロパティの一覧とまとめ書き
  • コピペで使えるアニメーションのサンプル
  • ホバーやスクロールで動かす方法
  • 動かない・最後に戻ってしまうときの対処
目次

@keyframesとは?

@keyframesは、CSSでアニメーションの動きを定義するためのルールです。「最初はこの状態、最後はこの状態」と指定すると、その間をブラウザがなめらかにつないでくれます。

@keyframesのメリット

  • JavaScriptを使わず、CSSだけでアニメーションが作れる
  • @keyframes で動きを作り、animation プロパティで要素に当てる(2つでセット)
  • 色の変化、フェード、回転、バウンドなど、いろいろな表現ができる

基本的な書き方

基本的な書き方は以下のとおりです。

@keyframes アニメーション名 {
    0% {
        /* 開始時のスタイル */
    }
    100% {
        /* 終了時のスタイル */
    }
}

開始と終了だけなら、0% と 100% の代わりに from と to と書いても同じです。

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

途中の状態を指定したいときは、% で好きなだけ段階を足せます。

@keyframes changeColor {
    0%   { background-color: red; }
    50%  { background-color: yellow; }
    100% { background-color: blue; }
}

要素に当てる

作った動きは、animation プロパティで要素に当てます。

これで、divの背景色が2秒かけて赤→黄→青と変わり続けます。

div {
    width: 100px;
    height: 100px;
    background-color: red;
    animation: changeColor 2s ease-in-out infinite;
}

animationプロパティ一覧

animation は、下の8つのプロパティを1行にまとめて書ける「まとめ書き」です。

プロパティ意味よく使う値
animation-name使う@keyframesの名前fadeIn など
animation-duration1回にかかる時間0.5s、2s
animation-timing-function動きの速さの変化ease(初期値)、linear、ease-in-out
animation-delay始まるまでの待ち時間0.3s
animation-iteration-count繰り返す回数1(初期値)、3、infinite(無限)
animation-direction再生する向きnormal、alternate(行って戻る)
animation-fill-mode始まる前・終わった後の状態forwards(最後の状態で止める)、both
animation-play-state再生・一時停止running、paused

まとめ書きの順番

/* 名前 | 時間 | 速さの変化 | 待ち時間 | 回数 | 向き | 終わった後 */
animation: fadeIn 1s ease-out 0.3s 1 normal forwards;

順番はある程度自由ですが、**時間が2つあるときは「1つ目=再生時間、2つ目=待ち時間」**と決まっています。使わない項目は省略できるので、普段は animation: fadeIn 1s ease-out forwards; くらいで十分です。

timing-functionの違い

値動き
linear最初から最後まで同じ速さ。回転に向いている
easeゆっくり始まって速くなり、最後はゆっくり(初期値)
ease-inゆっくり始まって、だんだん速くなる
ease-out速く始まって、ゆっくり止まる。表示のアニメーションに向いている
ease-in-outゆっくり始まって、ゆっくり止まる
cubic-bezier(...)速さの変化を自分で細かく指定する

コピペで使えるサンプル

1. フェードイン(1回だけ表示)

ページを開いたときにふわっと表示させる、一番よく使う動きです。forwards で表示された状態のまま止めます。

@keyframes fadeUp {
    from {
        opacity: 0;
        transform: translateY(30px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.fade-up {
    animation: fadeUp 0.8s ease-out forwards;
}

2. フェードイン・フェードアウト(繰り返し)

@keyframes fadeInOut {
    0%   { opacity: 0; }
    50%  { opacity: 1; }
    100% { opacity: 0; }
}

div {
    animation: fadeInOut 3s ease-in-out infinite;
}

3. 回転

読み込み中のアイコンなどに使えます。速さを一定にするため linear を使います。

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

div {
    animation: rotate 5s linear infinite;
}

4. バウンド

@keyframes bounce {
    0%, 100% { transform: translateY(0); }
    50%      { transform: translateY(-20px); }
}

div {
    animation: bounce 1s ease-in-out infinite;
}

5. ホバーしたときだけ動かす

:hover に animation を書くと、マウスを乗せたときだけ動きます。ボタンに使うとかわいいです。

.btn:hover {
    animation: bounce 0.6s ease-in-out;
}

6. スクロールして見えたら動かす

CSSだけでは「画面に入ったら」を判定できないので、少しだけJavaScriptを使います。画面に入った要素に is-show クラスを付けて、アニメーションを開始します。

<div class="js-fade">スクロールすると表示されます</div>
.js-fade {
    opacity: 0;
}
.js-fade.is-show {
    animation: fadeUp 0.8s ease-out forwards;
}
const targets = document.querySelectorAll('.js-fade');

const observer = new IntersectionObserver((entries) => {
    entries.forEach((entry) => {
        if (entry.isIntersecting) {
            entry.target.classList.add('is-show');
            observer.unobserve(entry.target); // 1回だけ動かす
        }
    });
}, { threshold: 0.2 }); // 要素の20%が見えたら

targets.forEach((el) => observer.observe(el));

グラデーションの背景を動かす方法はこちら👇

うまく動かないときの対処 チェックリスト

動かない

アニメーションが動かない時は次の項目を上から順に確認してみてください。

  1. 名前が一致しているか。 @keyframes fadeIn と animation: fadein のように、大文字・小文字が違うだけでも動きません。
  2. 時間を書いているか。 animation-duration の初期値は 0s なので、時間を書かないと一瞬で終わってしまいます。
  3. 単位を付けているか。 animation: fadeIn 1 は無効です。1s や 500ms のように単位が必要です。
  4. inline要素にtransformを使っていないか。 span や a などはそのままでは transform が効きません。display: inline-block; を追加しましょう。
  5. パソコンの「視差効果を減らす」設定がオンになっていないか。 下で紹介する prefers-reduced-motion を入れていると、この設定の人には動きが止まります。

止まらない

最初の状態に戻ってしまう場合は、初期設定では、アニメーションが終わると元のスタイルに戻ります。
最後の状態で止めたいときは forwards を付けます。

.fade-up {
    animation: fadeUp 0.8s ease-out forwards;
}

animation-delay で待ち時間を入れたとき、待っている間に要素が一瞬見えてしまう場合は、both にすると最初の状態(透明)から始まります。

スムーズに動かない

width、height、top、left、margin を動かすと、ブラウザが毎回レイアウトを計算し直すため重くなります。動きはできるだけ transform(移動・拡大・回転)と opacity(透明度)で作ると、なめらかになります。

/* 重い */
@keyframes slideBad { from { left: -100px; } to { left: 0; } }

/* 軽い */
@keyframes slideGood { from { transform: translateX(-100px); } to { transform: translateX(0); } }

FAQ

transitionと@keyframes の違いは?

transition はホバーなどで「A→B」に変わるときの変化をなめらかにするもので、きっかけが必要です。@keyframes はきっかけがなくても動かせて、途中の状態や繰り返しも指定できます。ボタンの色変化など単純なものは transition、それ以外は @keyframes と覚えておくと便利です。

1つの要素に複数のアニメーションを付けられる?

はい。カンマで区切って書けます。

例:

animation: fadeUp 0.8s ease-out forwards, bounce 1s ease-in-out 0.8s infinite;

アニメーションを一時停止できる?

animation-play-state: paused; で止められます。例えば .slider:hover { animation-play-state: paused; } とすると、ホバー中だけ流れる動きを止められます。

WordPressでも使えますか?

もちろん使えます。CSSは「外観」→「カスタマイズ」→「追加CSS」に貼り、動かしたいブロックの「高度な設定」→「追加CSSクラス」に fade-up などのクラス名を入れればOKです。

@keyframesを使うと、要素の動きを自由にカスタマイズできるので、Webデザインの幅が広がります。

ぜひ実際にコードを書いて試してみてください!

今後もCSSのテクニックを紹介していくので、お楽しみに😊

ではまた〜👋

bkimg

この記事が気に入ったら
フォローしてね!

share me!
  • URLをコピーしました!

この記事を書いた人

Webデザインとコーディングを中心に、html、CSSなどの現場で役立つWeb制作テクニックを発信してます。
デザインのトレンドを実務で即使えるテクニックや装飾アイデアでわかりやすいコード付きで解説しています。

目次