イージング

イージングについて

Startify-UIでは、アニメーションのイージングをデザイントークンの一環として定義しています。イージングは、アニメーションの速度や加速度を調整するための関数であり、アニメーションの挙動をより自然かつ美しいものにするために重要な要素です。

イージングのバリエーション

Startify-UIでは、よく使われる代表的なイージングを提供しています。これらのイージングはCSS変数として定義されており、簡単にイージングを適用することができます。

イージングは直線もしくは曲線のグラフとして表現され、その形状によってlinearやease、ease-inなどの挙動別に分けられます。曲線グラフを元にしたものは同じ挙動の中でも変化率の違いにより、sineやcircle、expoといった曲線タイプに細分化され、どのタイミングで加速・減速が強調されるかが決まります。

加速・減速のタイミングによるイージングの違い

加速・減速のタイミングによるイージングの違いは、以下のようになります。

linear 【等速】 開始から終了まで速度が変わらず、一定ペースで等速進行するイージング
ease 【加減速】 序盤はゆっくり、途中で加速し終盤で滑らかに減速するバランス型のイージング
ease-in 【加速】 動き出しは控えめで徐々に加速し、後半に勢いが増すイージング
ease-out 【減速】 序盤から素早く動き出し、終盤に向けて自然に減速して落ち着くイージング
ease-inout 【加減速】 動き出しは滑らかに加速し、中盤で最大速度に達した後、終盤で再び穏やかに減速するイージング
steps 【ステップ】 滑らかな動きではなく、指定した回数に分割して段階的に進む、コマ送りのようなイージング

加速度によるイージングの違い

等速・ステップ以外のイージングについては加速度を表現した曲線の種類により、どれだけ急激に加速・減速するかが変化します。以下は代表的な変化率ごとの特徴です。

sine 【変化率:弱】 正弦曲線に基づき、始まりと終わりが滑らかにつながる穏やかな変化率
quad 【変化率:中】 二次曲線に基づき、比較的柔らかい加速と減速を持つベーシックな変化率
cubic 【変化率:強】 三次曲線に基づき、quadよりもメリハリのある加速と減速を生む変化率
quart 【変化率:強】 四次曲線に基づき、開始直後と終了直前の加減速がさらに鋭くなる変化率
quint 【変化率:強】 五次曲線に基づき、非常に急峻な加減速で強いアクセントを付ける変化率
expo 【変化率:強】 指数関数曲線に基づき、序盤は極めて緩やかで終盤に向けて急激に変化する変化率
circ 【円弧】 円弧曲線に基づき、自然な弧を描きながら滑らかに加速し終盤で急制動する変化率
back 【反動】 戻りを伴う曲線に基づき、一度目標を行き過ぎてから柔らかく戻り、弾むような動きを生む変化率

イージング一覧

各イージングの変化率を表現した曲線グラフと、そのイージングを適用したアニメーションの挙動を確認することができます。

  • linear
  • ease
  • ease-in
  • ease-out
  • ease-inout
  • ease-in-sine
  • ease-out-sine
  • ease-inout-sine
  • ease-in-quad
  • ease-out-quad
  • ease-inout-quad
  • ease-in-cubic
  • ease-out-cubic
  • ease-inout-cubic
  • ease-in-quart
  • ease-out-quart
  • ease-inout-quart
  • ease-in-quint
  • ease-out-quint
  • ease-inout-quint
  • ease-in-expo
  • ease-out-expo
  • ease-inout-expo
  • ease-in-circ
  • ease-out-circ
  • ease-inout-circ
  • ease-in-back
  • ease-out-back
  • ease-inout-back
  • steps-2
  • steps-4
  • steps-5
  • steps-8
  • steps-10

イージング用CSS変数

Startify-UIで提供されているイージング用のCSS変数は、以下のとおりです。

--su-easing-linear linearのイージングが適用されます
--su-easing-ease easeのイージングが適用されます
--su-easing-ease-in ease-inのイージングが適用されます
--su-easing-ease-out ease-outのイージングが適用されます
--su-easing-ease-inout ease-inoutのイージングが適用されます
--su-easing-ease-in-sine cubic-bezier(0.47, 0, 0.745, 0.715)のイージングが適用されます
--su-easing-ease-out-sine cubic-bezier(0.39, 0.58, 0.57, 1)のイージングが適用されます
--su-easing-ease-inout-sine cubic-bezier(0.445, 0.05, 0.55, 0.95)のイージングが適用されます
--su-easing-ease-in-quad cubic-bezier(0.55, 0.085, 0.68, 0.53)のイージングが適用されます
--su-easing-ease-out-quad cubic-bezier(0.25, 0.46, 0.45, 0.94)のイージングが適用されます
--su-easing-ease-inout-quad cubic-bezier(0.455, 0.03, 0.515, 0.955)のイージングが適用されます
--su-easing-ease-in-cubic cubic-bezier(0.55, 0.055, 0.675, 0.19)のイージングが適用されます
--su-easing-ease-out-cubic cubic-bezier(0.215, 0.61, 0.355, 1)のイージングが適用されます
--su-easing-ease-inout-cubic cubic-bezier(0.645, 0.045, 0.355, 1)のイージングが適用されます
--su-easing-ease-in-quart cubic-bezier(0.895, 0.03, 0.685, 0.22)のイージングが適用されます
--su-easing-ease-out-quart cubic-bezier(0.165, 0.84, 0.44, 1)のイージングが適用されます
--su-easing-ease-inout-quart cubic-bezier(0.77, 0, 0.175, 1)のイージングが適用されます
--su-easing-ease-in-quint cubic-bezier(0.755, 0.05, 0.855, 0.06)のイージングが適用されます
--su-easing-ease-out-quint cubic-bezier(0.23, 1, 0.32, 1)のイージングが適用されます
--su-easing-ease-inout-quint cubic-bezier(0.86, 0, 0.07, 1)のイージングが適用されます
--su-easing-ease-in-expo cubic-bezier(0.95, 0.05, 0.795, 0.035)のイージングが適用されます
--su-easing-ease-out-expo cubic-bezier(0.19, 1, 0.22, 1)のイージングが適用されます
--su-easing-ease-inout-expo cubic-bezier(1, 0, 0, 1)のイージングが適用されます
--su-easing-ease-in-circ cubic-bezier(0.6, 0.04, 0.98, 0.335)のイージングが適用されます
--su-easing-ease-out-circ cubic-bezier(0.075, 0.82, 0.165, 1)のイージングが適用されます
--su-easing-ease-inout-circ cubic-bezier(0.785, 0.135, 0.15, 0.86)のイージングが適用されます
--su-easing-ease-in-back cubic-bezier(0.6, -0.28, 0.735, 0.045)のイージングが適用されます
--su-easing-ease-out-back cubic-bezier(0.18, 0.89, 0.32, 1.28)のイージングが適用されます
--su-easing-ease-inout-back cubic-bezier(0.68, -0.55, 0.27, 1.55)のイージングが適用されます
--su-easing-steps-2 steps(3, jump-none)のイージングが適用されます
--su-easing-steps-4 steps(5, jump-none)のイージングが適用されます
--su-easing-steps-5 steps(6, jump-none)のイージングが適用されます
--su-easing-steps-8 steps(9, jump-none)のイージングが適用されます
--su-easing-steps-10 steps(11, jump-none)のイージングが適用されます

これらのCSS変数は、プロパティの値で使用したり、スクリプト側で値を参照することができます。

animation-timing-function: var(--su-easing-ease-in-sine);
const easingElement = document.getElementById('easing');
if (easingElement) {
  const easingValue = getComputedStyle(easingElement)
    .getPropertyValue('--su-easing-ease-in-sine')
    .trim();
  easingElement.style.animationTimingFunction = easingValue;
}

非単調イージング

Startify-UIでは、単一の三次ベジェ曲線では実現できない複数関数の合成による非単調イージングも提供しています。非単調イージングは、速度が一方向に単調増減せず、途中で加速と減速が反転したり、行き過ぎや跳ね返りを伴うような挙動を表現します。

非単調イージングを採用することで、オーバーシュートや跳ね返りなど表情のある動きを自然に加え、演出の幅を広げることができます。

非単調イージングのバリエーション

Startify-UIでは下記の非単調イージングを提供しています。他のイージング同様に、加減速のタイミングが異なるin・out・inoutの3種類のバリエーションが提供されています。

elastic 【弾性】 伸び縮みする弾性挙動のような、目標を行き過ぎてから減衰しつつ複数回揺り戻す変化率
bounce 【反発】 地面での跳ね返りのような、接地ごとに振幅を減衰させながら何度か反発する変化率

非単調イージングの変化率を表現した曲線グラフと、そのイージングを適用したアニメーションの挙動イメージです。

  • ease-in-elastic
  • ease-out-elastic
  • ease-inout-elastic
  • ease-in-bounce
  • ease-out-bounce
  • ease-inout-bounce

非単調イージングのユーティリティクラス・CSS変数

Startify-UIで提供されている非単調イージング用のユーティリティクラスならびにCSS変数は、以下のとおりです。

.su-easing-ease-in-elastic CSS変数の--su-easing-ease-in-elasticの値がelasticのイージング変化率に対応した浮動小数値で更新されます。
0→1の立ち上がりでアンダーシュートし、減衰しながら複数回揺り戻して最終的に1へ収束します。
.su-easing-ease-out-elastic CSS変数の--su-easing-ease-out-elasticの値がelasticのイージング変化率に対応した浮動小数値で更新されます。
0→1を行き過ぎてオーバーシュートし、減衰しながら複数回揺り戻して最終的に1へ収束します。
.su-easing-ease-inout-elastic CSS変数の--su-easing-ease-inout-elasticの値がelasticのイージング変化率に対応した浮動小数値で更新されます。
前半は0→1でアンダーシュートし、後半は1をオーバーシュートして揺り戻し、両端で減衰しながら収束します。
.su-easing-ease-in-bounce CSS変数の--su-easing-ease-in-bounceの値がbounceのイージング変化率に対応した浮動小数値で更新されます。
0からスタートし、0で反発しながら上昇して複数回バウンドし、(時間反転のため)振幅を徐々に増やしつつ最終的に1へ収束します。
.su-easing-ease-out-bounce CSS変数の--su-easing-ease-out-bounceの値がbounceのイージング変化率に対応した浮動小数値で更新されます。
0→1へ向かって上昇後、1で反発して複数回バウンドし、振幅を減衰させながら最終的に1へ収束します。
.su-easing-ease-inout-bounce CSS変数の--su-easing-ease-inout-bounceの値がbounceのイージング変化率に対応した浮動小数値で更新されます。
前半(0→0.5)は0で反発してバウンドしながら上昇し、後半(0.5→1)は1で反発して複数回バウンド、いずれも振幅を減衰させながら最終的に1へ収束します。

非単調イージングは実装の特性上、ユーティリティクラスを付与したうえで、変化させたいプロパティの値にCSS変数の値を直接指定する必要があります。

<!-- 非単調イージングを適用する対象要素にユーティリティクラス(.su-easing-*****)を付与 -->
<div 
  class="example-element su-easing-ease-out-elastic"
>...</div>
/* 非単調イージングを適用する対象要素のプロパティにCSS変数(--su-easing-****)の値を直接指定 */
.example-element {
  transform: scale(var(--su-easing-ease-out-elastic)));
  /* animation-duration や animation-iteration-count は必要に応じて指定します */
  animation-duration: 10s;
  animation-iteration-count: infinite;
}