Webアニメーション・ループする動き

繰り返す動きを作る@keyframes

transitionは「乗せたら変わる」動きでした。@keyframesを使うと、乗せなくても自動でループする動きが作れます。

transition:hoverなどきっかけがあって初めて動きました。今回学ぶ@keyframesは違います。ページを開いた瞬間から、自動で・繰り返し動かせます。

自動でふわふわ動くバッジ

カーソルを乗せなくても、勝手に動いています。

@keyframesの書き方

<div class="badge">NEW</div>
@keyframes float {
  0% { transform: translateY(0); }
  50% { transform: translateY(-10px); }
  100% { transform: translateY(0); }
}
  • @keyframes の後ろのfloat名前(自分で好きに決めてよい)
  • 0%50%100%は、動きのタイミング(0%=開始、100%=終了)
  • それぞれの{ }の中に、そのタイミングでの見た目を書く

0%は開始位置なので省略してfrom100%は終了位置なのでtoとも書けます。タイミングが2つだけならこちらもよく使われます。

animationプロパティで読み込む

台本を書いただけでは動きません。要素にanimation適用します。

<div class="badge">NEW</div>
.badge {
  animation: float 1.6s ease-in-out infinite;
}
部分役割
floatどの@keyframesを使うか(名前が対応)
1.6s1周にかける時間
ease-in-out動きのリズム(transitionと同じ考え方)
infinite繰り返す回数infiniteは無限ループ

infiniteの代わりに3のように数字を書くと、その回数だけ動いて止まります。

行って戻るはalternateにおまかせ

さきほどのfloatは、0%50%100%行って戻る台本を自分で書きました。じつは「行き」だけ書いて、帰りはブラウザにまかせる書き方もあります。それがalternate(オルタネート=交互)です。

<div class="badge">NEW</div>
.badge {
  animation: float 0.8s ease-in-out infinite alternate;
}
@keyframes float {
  from { transform: translateY(0); }
  to { transform: translateY(-10px); }
}

alternateをつけると、1周目はfromto、2周目はtofrom逆再生され、往復の動きになります。台本が半分で済むうえ、行きと帰りの動きが必ず対称になるのが利点です(1周の時間も半分の0.8sにしています)。

開始をずらすanimation-delay

複数の要素に同じ動きをつけると、全部がそろって動いて機械的に見えがちです。animation-delayで開始をずらすと、ぐっと生きた感じになります。

<div class="dot"></div>
<div class="dot dot--2"></div>
<div class="dot dot--3"></div>
.dot {
  animation: float 1s ease-in-out infinite alternate;
}
.dot--2 {
  animation-delay: 0.2s;
}
.dot--3 {
  animation-delay: 0.4s;
}

「読み込み中」を表す3つの点がぴょこぴょこ波打つあの動きは、この時間差で作られています。

もう1つ:回転し続けるスピナー

<div class="spinner"></div>
.spinner {
  animation: spin 1s linear infinite;
}
@keyframes spin {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

回転のような「同じ動きをずっと繰り返す」演出は、イージングをlinear(一定速度)にするのが定番です。easeだと毎回速度が変わって、つなぎ目でカクッとして見えてしまいます。

このレッスンのまとめ

  1. @keyframes 名前 { 0% {...} 100% {...} }で動きの台本を作る
  2. animation: 名前 時間 イージング 回数;で要素に適用する
  3. infiniteで無限ループ、alternateで往復、animation-delayで時間差
  4. 自動で繰り返す動きは@keyframes、反応する動きはtransition

よくある質問

@keyframesを書いたのに動かないのはなぜ?
いちばん多い原因は、@keyframesにつけた名前とanimationプロパティに書いた名前のつづりが合っていないことです。名前がずれていてもエラーは出ず、ただ動かないだけなので、まず両方のつづりを見比べましょう。
アニメーションを1回だけ動かして止めるには?
animationの回数にinfiniteではなく1を指定します(省略しても1回です)。終わったあとの見た目を最後のキーフレームのまま保ちたいときは、animation-fill-mode: forwards;を足します。