• CSSのtransitionは変えるプロパティと時間を分けて指定する

CSSのtransitionは変えるプロパティと時間を分けて指定する

公開日: 執筆:佐藤

CSSのtransitionは、ある状態から別の状態へCSSの値が変わる途中を滑らかに見せます。最初に決めるのは、何を変えるかを示すtransition-propertyと、何秒かけるかを示すtransition-durationです。

transitionを書いただけで要素が動き始めるわけではありません。通常の状態と:hoverや:focusなどの状態に異なる値があり、その値が変化したときに効果が始まります。

background-colorを0.2秒で変える

リンクの背景色を変える例です。

.button {
  background-color: #24547a;
  color: #fff;
  transition-property: background-color;
  transition-duration: 0.2s;
}

.button:hover,
.button:focus {
  background-color: #16344c;
}

通常時は#24547a、ポインターを重ねたときとキーボードで選んだときは#16344cです。transition-propertyが背景色を対象にし、transition-durationが変化に0.2秒かけることを示します。

transition-durationの初期値は0sです。時間を指定しなければ、値はすぐに切り替わり、途中の変化は見えません。負の時間は指定できません。

四つの指定は対象、時間、進み方、待ち時間を表す

transitionを構成する指定は、次の四つです。

指定 役割 初期値
transition-property 変化させるCSSプロパティ all
transition-duration 変化にかける時間 0s
transition-timing-function 途中の値が進む速さ ease
transition-delay 変化を始めるまでの待ち時間 0s

最初は対象と時間だけを指定し、意図したプロパティが変化するか確認します。進み方を変える必要があればlinear、ease-in、ease-outなどを比較します。待ち時間は、利用者の操作に対する反応を遅らせるため、理由がある場合だけ加えます。

短縮形では最初の時間がdurationになる

四つの指定はtransitionへまとめられます。

.button {
  transition: background-color 0.2s ease 0s;
}

順に、対象プロパティ、変化時間、進み方、待ち時間です。時間を二つ書いた場合、最初の時間がtransition-duration、二つ目がtransition-delayになります。

.button {
  transition: background-color 0.2s ease 0.5s;
}

この例は、0.5秒待ってから、0.2秒かけて背景色を変えます。待ち時間と変化時間を取り違えると、操作に反応しないように見えます。短縮形が読みにくい場合は、四つのプロパティへ分けて確認します。

allより変えるプロパティを明示する

transition-propertyの初期値はallですが、実装では変えたいプロパティを明示します。

.button {
  transition: background-color 0.2s ease;
}

allのままでは、後から幅、位置、余白などを変更したとき、それらもtransitionの対象になる可能性があります。背景色だけを意図しているならbackground-colorと書き、保守時に対象を増やさないようにします。

滑らかに変化させられるのは、途中の値を計算できるプロパティです。opacityや色、長さなどは途中の値を持てます。一方、display: noneとdisplay: blockの間には、途中の表示値がありません。表示と非表示を滑らかに見せたい場合は、displayだけで解決しようとせず、opacityなど別の状態を設計します。

複数の変化は同じ順番で対応させる

背景色とopacityへ異なる時間を指定する場合は、カンマで並べます。

.button {
  transition-property: background-color, opacity;
  transition-duration: 0.2s, 0.4s;
  transition-timing-function: ease, linear;
}

一番目のbackground-colorには一番目の0.2sとease、二番目のopacityには二番目の0.4sとlinearが対応します。対象と時間を別々に追加すると順番を取り違えやすいため、変更時は同じ位置を一組として確認します。

短縮形なら、一つの変化を一組にして並べられます。

.button {
  transition: background-color 0.2s ease,
              opacity 0.4s linear;
}

対象が増えるほど、どの変化が必要かを見直します。装飾上の効果を増やすことが目的ではなく、状態が変わったことを急なちらつきなく伝えるために使います。

hoverだけに指定せず通常の状態へ置く

transitionの指定を:hover側だけへ置くと、ポインターを重ねる方向と外す方向で使われる設定が変わります。通常の状態へ置けば、入るときと戻るときの両方へ同じ条件を使えます。

/* 通常の状態へ置く */
.button {
  transition: background-color 0.2s ease;
}

.button:hover,
.button:focus {
  background-color: #16344c;
}

ポインター操作だけを前提にせず、キーボードで:focusへ移った場合も確認します。色の変化だけで選択状態を伝える場合は、文字と背景の明暗差も通常時と変化後の両方で確認します。

効果がなくても操作できる状態を先に作る

transitionは見た目の途中を加える機能です。リンクを開く、ボタンを押す、入力欄へ移るという操作そのものを担わせません。対応しない環境やCSSを読み込めない状態でも、最終的な色や位置へ切り替わり、操作できるようにします。

確認するときは、通常、:hover、:focusの三状態を並べます。次に、短時間でポインターを出し入れし、途中で反転しても不自然な待ち時間が残らないかを見ます。最後に、transitionの宣言を一時的に無効にし、情報と操作が失われないことを確認します。

まず、一つのボタンについて、変えるプロパティを一つだけ選んでください。通常時と変化後の値を決め、transition-propertyとtransition-durationを分けて指定します。動作を確認してから、進み方や二つ目のプロパティを加えます。

戻る