1. 程式人生 > >CSS3 timing-function: steps() 詳解

CSS3 timing-function: steps() 詳解

一、不堪回首的過往

在應用 CSS3 漸變/動畫時,有個控制時間的屬性 <timing-function> 。它的取值中除了常用到的 三次貝塞爾曲線 以外,還有個讓人比較困惑的 steps() 函式。在許多相關文章裡,關於這個函式的解釋都比較含糊其辭,比如:

steps() 第一個引數 number 為指定的間隔數,即把動畫分為 n 步階段性展示,第二個引數預設為 end,設定最後一步的狀態,start 為結束時的狀態,end 為開始時的狀態。

又如:

steps 有兩個引數

  1. 第一個肯定是分幾步執行完
  2. 第二個有兩個值
    • start 第一幀是第一步動畫結束
    • end 第一幀是第一步動畫開始

年少無知的我輕易就相信了大家的說法,每次應用 steps() 函式時都要先考慮一番:嗯,start 對應末態,end 對應初態,末態是 OOOO,初態是 XXXX……臥槽!跑起來不對!

shit

二、一探究竟

被坑得團團轉之後,只好向組織求助。於是查到了這樣的 規定 :

steps

Specifies a stepping function, described above, taking two parameters. The first parameter specifies the number of intervals in the function. It must be a positive integer (greater than 0). The second parameter, which is optional, is either the value ‘start’ or ‘end’, and specifies the point at which the change of values occur within the interval. If the second parameter is omitted, it is given the value ‘end’.

粗略翻譯如下: steps 函式指定了一個階躍函式,第一個引數指定了時間函式中的間隔數量(必須是正整數);第二個引數可選,接受 start 和 end 兩個值,指定在每個間隔的起點或是終點發生階躍變化,預設為 end。

這樣理解起來可能還是有點抽象,我們來個例項:

#demo {
  animation-iteration-count: 2;
  animation-duration: 3s;
}

這是一個 3s * 2 的動畫,我們分別對它應用 steps(3, start) 和 steps(3, end) ,做出階躍函式曲線如下:

1. steps(3, start)

steps(3,start)

steps() 第一個引數將動畫分割成三段。當指定躍點為 start 時,動畫在每個計時週期的起點發生階躍(即圖中 空心圓 → 實心圓

 )。 由於第一次階躍發生在第一個計時週期的起點處(0s),所以我們看到的第一步動畫(初態)就為 1/3 的狀態,因此在視覺上動畫的過程為 1/3 → 2/3 → 1 。如果翻譯成 JavaScript,大致如下:

var animateAtStart = function (steps, duration) {
var current = 0;
var interval = duration / steps;
var timer = function () {
current++;
applyStylesAtStep(current);
if (current < steps) {
setTimeout(timer, interval);
}
};
timer();
};

2. steps(3, end)

steps(3,end)

當指定躍點為 end,動畫則在每個計時週期的終點發生階躍(即圖中 空心圓 → 實心圓 )。 由於第一次階躍發生在第一個計時週期結束時(1s),所以我們看到的初態為 0% 的狀態;而在整個動畫週期完成處(3s),雖然發生階躍跳到了 100% 的狀態,但同時動畫結束,所以 100% 的狀態不可視。因此在視覺上動畫的過程為 0 → 1/3 → 2/3 (回憶一下數電裡的非同步清零,當所有輸出端都為高電平的時候觸發清零,所以全為高電平是暫態)。同樣翻譯成 JavaScript 如下:

var animateAtEnd = function (steps, duration) {
var current = 0;
var interval = duration / steps;
var timer = function () {
applyStylesAtStep(current);
current++;
if (current < steps) {
setTimeout(timer, interval);
}
};
timer();
};

如果這樣的解釋還是讓你覺得雲裡霧裡,可以參考這個互動 DEMO

三、實際應用

雖然寫了這麼多,但還是不得不說一句 timing-function: steps() 在實際設計中的應用少之又少,但是配合一些奇淫技巧還是能做出一些不錯的效果:

1. 定時遮罩

在CSS3 環形進度條這篇文章裡,我們曾用到 timing-function 來使半圓環定時顯示/隱藏:

$precent: 5; // 進度百分比
$duration: 2s; // 動畫時長
@keyframes toggle {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.progress-right {
// 初態為 opacity: 0; 動畫週期結束後為 opacity: 1;
opacity: 1;
animation: toggle ($duration * 50 / $precent) step-end; // step-end = steps(1, end)
}
.progress-cover {
// 初態為 opacity: 1; 動畫週期結束後為 opacity: 0;
opacity: 0;
animation: toggle ($duration * 50 / $precent) step-start; // step-start = steps(1, start)
}

這裡的關鍵是使用了 step-start 與 step-end 控制動畫,因為動畫只有兩個關鍵幀,參考上文可以得出:

step-start:動畫一開始就跳到 100% 直到週期結束

step-end:保持 0% 的樣式直到週期結束

>step-start, 顧名思意,“一步一步開始”,表現在動畫中就是一幀一幀播放、一頓一頓畫面

2. Sprite 精靈動畫

在CSS3 實現奔跑動畫這篇文章裡,我們使用 CSS3 Animation 來實現遊戲開發中的精靈動畫:

$spriteWidth: 140px; // 精靈寬度 
@keyframes run {
  0% {
    background-position: 0 0;
  }
  100% {
    background-position: -($spriteWidth * 12) 0; // 12幀
  }
}
#sprite {
  width: $spriteWidth;
  height: 144px;
  background: url("../images/sprite.png") 0 0 no-repeat;
  animation: run 0.6s steps(12) infinite;
}

其原理是:使用一張含有多幀靜態畫面的圖片,通過切換 background-position 使其變為連續的動畫。

相關推薦

CSS3 timing-function: steps()

一、不堪回首的過往 在應用 CSS3 漸變/動畫時,有個控制時間的屬性 <timing-function> 。它的取值中除了常用到的 三次貝塞爾曲線 以外,還有個讓人比較困惑的 steps() 函式。在許多相關文章裡,關於這個函式的解釋都比較含糊其辭,比如: steps() 第一個引數

animation-timing-functionsteps

span 動畫 info str 小鳥 slow OS pre mage W3C裏的定義: animation-timing-function 規定動畫的速度曲線。 這個屬性有很多取值, linear: 線性過渡。等同於貝塞爾曲線(0.0, 0.0, 1.0, 1.0)

css中animation屬性animation-timing-function知識點以及屬性值steps()

在animation中最重要的其實就是時間函式(animation-timing-function)這個屬性,他決定了你的動畫將以什麼樣的速度執行,所以最關鍵的屬性值也就是cubic-bezier(n,n,n,n),你平時用到的linear、ease、ease-out等都是基

CSS3中REM使用

前端學習 參考 瀏覽器 為什麽 pla 同時 寫法 子元素 comment 在頁面中設置字體,我們知道有常見的兩種,px 和 em. px 在Web頁面制作中,我們一般使用“px”來設置我們的文本,因為他比較穩定和精確。但是這種方法存在一個問題,當用戶在瀏覽器中瀏覽我們制作

CSS3 動畫及過渡

lan idt iteration count 以及 pla post run w3c   今天開始我們一起來學習有關於CSS3制作動畫的幾個屬性:變形(transform)、過渡(transition)和動畫(animation)等CSS3技術。   首先我們先來了解一下

CSS3內容溢出

屬性設置 滾動 http spl con cli -s plc 定義 CSS3內容溢出屬性在CSS中的每一個元素都視為一個盒子,這個盒子就是一個容器。容器就有大小之分,如果在樣式中指定盒子的寬度與高度,可能某些內容在盒子中就會容不下, 此時 就可以使用overflow 屬性

boost::function用法

另一個 功能 構造函數 要求 first 不同類 blank 吸引 指向 要開始使用 Boost.Function, 就要包含頭文件 "boost/function.hpp", 或者某個帶數字的版本,從 "boost/function/function0.hpp" 到 "b

關於css3屬性選擇器

什麼是屬性選擇器 指對帶有指定屬性的HTML元素設定樣式,有以下幾種: 1.element[attribute]    2.element[attribute = "value"]  3.element[attribute ~= "value"]  4.ele

JavaScript引用型別Function例項

Function型別 函式是物件,函式名是指標:每個函式都是Function型別的例項。由於函式是物件,因此函式名是一個指向函式物件的指標,不會與某個函式繫結,一個函式可能會有多個名字。 function getSum(a, b) { return a +

CSS3 基礎(1)—— CSS3選擇器2

一、基本選擇器 CSS的基本選擇器 萬用字元選擇器 (* CSS2) 元素選擇器 (CSS1) 類選擇器 (CSS1) ID選擇器 (CSS1) 後代選擇器 (CSS2) CSS3新增層次選擇器 子元素選擇器 (這個準確的說應該是CSS2的) 相鄰

$.extend()方法和(function($){...})(jQuery)

1.    JS中substring與substr的區別 之前在專案中用到substring方法,因為C#中也有字串的擷取方法Substring方法,當時也沒有多想就誤以為這兩種方法的使用時一樣的。這樣就直接按照在C#中使用Substring的方式,直接在js中用了

logistic迴歸(二):損失函式(cost function

有監督學習 機器學習分為有監督學習,無監督學習,半監督學習,強化學習。對於邏輯迴歸來說,就是一種典型的有監督學習。 既然是有監督學習,訓練集自然可以用如下方式表述: {(x1,y1),(x2,y2),⋯,(xm,ym)} 對於這m個訓練樣本,每個樣本本身

CSS3 calc的用法

calc()對大家來說,或許很陌生,不太會相信calc()是css中的部分。因為看其外表像個函式,既然是函式為何又出現在CSS中呢?這一點也讓我百思不得其解,今天有一同事告訴我,說CSS3中有一個屬效能實現自適應的佈局,首先讓我想到的是box-sizing,但跟我說還可以計算,這讓我不得不想起calc()。因

css3屬性 濾鏡

  -webkit-filter是css3的一個屬性,Webkit率先支援了這幾個功能,感覺效果很不錯。下面咱們就學習一下filter這個屬性吧。 現在規範中支援的效果有: grayscale 灰度               值為0-1之間的小數 sepia 褐色         值為0-1之間的小數sa

Css3彈性盒模型

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xm

CSS3:漸變(gradient)用法

前言 演示下太老版本瀏覽器的漸變實現了[IE9-]; IE9以前,漸變都是通過濾鏡實現的,大體的寫法就是這樣; .testDiv { width:400px

CSS3中Transition屬性以及示例分享

1、transition-property的語法[css] transition-property :all(所有屬性改變) || [attr] (指定要運動的樣式)|| none(沒有屬性改變)   2、transition-property的屬性值   (1)

函式模板(function template)

模板(template) 詳解C++的模板(template)是泛型程式設計(generic programming)的基礎;面向物件程式設計 是 執行(run time)時 知道型別(type); 泛

CSS3:overflow屬性

1.Overflow overflow為溢位(容器),當內容超出容器時只需新增overflow屬性值為hidden, 就可以把超出容器的部分隱藏起來; 如果內容超出容器卻又不想其隱藏時可以將其屬性值設定為auto; overflow:auto 屬性如果超出就出現滾動條,沒有超出則不出現滾動條這樣就可以出現滾動

css3中animation屬性animation-timing-function知識點以及其屬性值steps()

跳過 知識點 lin 運動 需求 選擇 ati 信息 tails 在animation中最重要的其實就是時間函數(animation-timing-function)這個屬性,他決定了你的動畫將以什麽樣的速度執行,所以最關鍵的屬性值也就是cubic-bezier(n,n,n