使用 Linear() 加/減速函式在 CSS 中建立複雜的動畫曲線

隆重推出 linear()。這項 CSS 的加/減速功能會在點之間線性插入,以便您重新建立彈跳和彈簧效果。

CSS 中的加/減速設定

在 CSS 中為元素建立動畫或轉換時,您可以使用 animation-timing-functiontransition-timing-function 屬性控制加/減速函式,控制值的速率。

CSS 中有多種做為預設關鍵字,包括 lineareaseease-inease-outease-in-out。如要建立自己的加/減速曲線,請使用 cubic-bezier() 函式,或採用 steps() 加/減速功能,按照步驟進行。

只要正確使用,加/減速功能就能讓動畫元素產生權重,以提升動畫效果。

CSS 無法建立複雜的曲線 (例如彈跳或彈簧效果),但有了 linear(),您現在可以更自然地模擬這些曲線。

linear() 簡介

瀏覽器支援

  • 113
  • 113
  • 112
  • x

在 CSS 中定義加/減速的新方法是使用 linear()。這個函式接受多個停靠站,請以半形逗號分隔。每個停靠站都是從 0 到 1 之間的一個數字。在每個停靠站之間,內插都是以線性方式完成,藉此說明函式的名稱。

animation-timing-function: linear(0, 0.25, 1);

這些停靠站預設為平均分配。在上述程式碼片段中,表示 50% 的輸出值會使用 0.25 的輸出值。

linear(0, 0.25, 1) 的圖表顯示如下:

線性(0, 0.25, 1) 視覺化圖表。

如果您不希望停靠站繼續分散,可以選擇傳入停靠站長度。傳入一個值做為停靠站長度時,您可以定義其起點:

animation-timing-function: linear(0, 0.25 75%, 1);

在這裡,0.25 的輸出值不會用於 50% 標記,而是在 75% 處。

線性(0, 0.25 75%, 1) 的線性圖表。

將兩個值指定為停靠站長度時,需定義其起點和終點:

animation-timing-function: linear(0, 0.25 25% 75%, 1);

輸出值 0.25 會在 25% 到 75% 的時間內使用。

以線性方式呈現線性(0, 0.25 25% 75%, 1) 的圖表。

使用 Linear() 建立複雜曲線

雖然上述範例的加/減速非常簡單,但您可以使用 linear() 以非常簡單的方式重新建立複雜的加/減速函式,同時保有部分精確度。

這個跳出曲線是無法直接在 CSS 中表達的加/減速類型,使用 JavaScript 定義:

function easing(pos) {
  const t = 7.5625;
  const e = 2.75;
  return pos < 1 / e
    ? t * pos * pos
    : pos < 2 / e
    ? t * (pos -= 1.5 / e) * pos + 0.75
    : pos < 2.5 / e
    ? t * (pos -= 2.25 / e) * pos + 0.9375
    : t * (pos -= 2.625 / e) * pos + 0.984375;
}

雖然程式碼可能無法是什麼意思,但視覺呈現也許會更好。以下是以藍色曲線視覺化呈現的輸出內容:

一條藍色的平滑彈跳曲線。

只要在其中加入幾個停靠站,即可簡化曲線。這裡的每個綠點都代表一個停靠站:

藍色平滑的反光曲線,頂端有綠點。

傳遞至 linear() 時,結果是有點看起來像原始曲線,但邊緣的粗細。

簡化的曲線在原始平滑曲線頂端,以藍色呈現。

只要比較綠色的動畫方塊和藍色的方塊,就能判斷它不是那麼平滑。

不過,如果您新增的停靠站數量夠多,就能妥善估算原始曲線。以下是更新版本:

更新後的曲線,停靠站數量為兩倍。

只要把轉機次數增加一倍,就能得到平滑的結果。

用於建立動畫的程式碼如下所示:

animation-timing-function: linear(
  /* Start to 1st bounce */
  0, 0.004, 0.016, 0.035, 0.063 9.1%, 0.141, 0.25, 0.391, 0.563, 0.765, 1,
  /* 1st to 2nd bounce */
  0.891, 0.813 45.5%, 0.785, 0.766, 0.754, 0.75, 0.754, 0.766, 0.785, 0.813 63.6%, 0.891, 1 72.7%,
  /* 2nd to 3rd bounce */
  0.973, 0.953, 0.941, 0.938, 0.941, 0.953, 0.973, 1,
  /* 3rd bounce to end */
  0.988, 0.984, 0.988, 1
);

輔助工具

手動建立停靠站清單非常麻煩。幸好,JakeAdam 建立了工具,協助您將加/減速曲線轉換為 linear() 對應項目

線性加/減速產生器工具的螢幕截圖。
https://linear-easing-generator.netlify.app/ 實際運作的螢幕截圖。

這項工具會將 JavaScript 加/減速函式或 SVG 曲線做為輸入內容,並使用 linear() 輸出簡化的曲線。使用滑桿控制所需的停靠站數量和精確度。

你也可以在右上方選擇任一預設選項:彈簧、彈跳、簡易彈性尺寸或 Material Design 強調的加/減速設定。

開發人員工具支援

開發人員工具支援以視覺化方式呈現並編輯 linear() 的結果。按一下圖示,即可在停靠站周圍拖曳,展開互動式工具提示。

Chrome 開發人員工具「Linear()」編輯器的螢幕截圖。
Chrome 開發人員工具「Linear()」編輯器的螢幕截圖。

這項開發人員工具功能適用於 Chrome 114 的開發人員工具。

相片來源:Howie MapsonUnsplash 網站上