CSS屬性的值從一個值變成另外一個值的過程叫作漸變,重點突出變化的過程。CSS3 transition系列屬性可控制這個變化過程,使得屬性值變化過程更加平滑。一個過渡應包含這幾個屬性:javascript
A:哪些屬性須要過渡?css
須要過分的CSS屬性(也就指定舊值和新值)
B:過渡多久完成?java
持續時間,即從舊值變成新值的過程持續的時間。這個時間不包含延遲時間。
C:過渡中間值如何計算?css3
隨着時間的推移,過渡過程當中屬性中間值計算方式。
D:多久後開始過分?web
延遲多久開始過分,即從屬性值改變到開始執行過渡的時間。
E:何時執行過渡?瀏覽器
當屬性值發生變化時執行過渡。這個由瀏覽器控制,不須要做者控制。
綜上所述若是把過渡做爲一個類型的話,則:<過渡> = <property-list, duration, timing-function, delay>app
CSS3經過tansition系列屬性(transition-property, transition-duration, transition-timing-function, transition-delay,transition)控制過渡。ide
用來指定哪些CSS屬性應用過渡,多個屬性用逗號隔開。函數
transition-property: none | <single-transition-property> [, <single-transition-property>]* <single-transition-property> = all | <ident> 默認值:all
從語法中能夠看到transition-property的取值要麼是none要麼是<single-transition-property>列表。兩種值不一樣共存的,而且"inherit","initial"也不能和<single-transition-property>列表共存。
none:工具
表示任何屬性都不該用過渡,而且none能夠終止正在執行的過渡。
all:
表示全部可動畫的屬性都應用過渡。注意all關鍵字是一種特殊的<single-transition-property>,他是表示全部屬性的簡潔寫法。因此他能夠和其餘屬性名共存,可是最好不要這樣作。
非all的<single-transition-property>:
屬性的名稱標識符。
A:
transition-property: width; transition-duration: 1s;
表示:with屬性應用一個持續時間爲1s的過渡,即<width, 1s, ease, 0s>
B:
transition-property: width, background-color; transition-duration: 1s, 2s;
表示:
with屬性應用一個持續時間爲1s的過渡,即<width, 1s, ease, 0s>
background-color屬性應用一個持續時間爲2s的過渡,即<background-color, 2s, ease, 0s>
C:
transition-property: width, background-color, height; transition-duration: 1s,2s;
表示:
with屬性應用一個持續時間爲1s的過渡,即<width, 1s, ease, 0s>
background-color屬性應用一個持續時間爲2s的過渡,即<background-color, 2s, ease, 0s>
height屬性應用一個持續時間爲1s的過渡,即<height, 1s, ease, 0s>
注意:
該例中並無顯示指定height屬性過渡持續時間。若是transition-property屬性指定值個數多於tansition-duration屬性(transition-timing-function, transition-delay也是這樣)指定的值個數,則會循環重複tansition-duration的值,即此例中transition-duration的值等價於:transition-duration: 1s, 2s, 1s。若是transition-duration的值指定的值個數多於transition-property屬性指定值格式,則多於的被忽略。
D:
transition-property: width, heighttt, background-color; transition-duration: 1s, 1.5s, 2s;
表示:
with屬性應用一個持續時間爲1s的過渡,即<width, 1s, ease, 0s>
heighttt屬性(雖然該屬性heighttt)應用一個持續時間爲1.5s的過渡,即< heighttt, 1s, ease, 0s>
background-color屬性應用一個持續時間爲2s的過渡,即<background-color, 2s, ease, 0s>
注意:
該例中有個非法屬性heighttt。tansition-property屬性列表中包含非法屬性或者非動畫的屬性也是會建立個過渡,同理也會佔用tansition-duration指定的值列表的一個值。
E:
transition-property: width, all, background-color; transition-duration: 2s, 5s, 0.5s;
表示:全部可動畫的屬性應用一個持續5s的過渡,即<all, 5s, ease, 0s>
注意:
該例中all和其餘屬性同存。all關鍵字會致使其餘指定的屬性被忽略,而且根據all的位置相應的肯定過渡其餘值。如該例中all在第二個位置,因此對應的持續時間是5s.
定義過渡的持續時間,即從過渡開始到過渡結束的時間。
transition-duration: <time> [, <time>]* 默認值:0s
見2.1
指定過渡過程當中屬性中間值的計算方式。CSS3提供兩種計算曲線:階梯函數(stepping function), 三次貝茲曲線(cubic-beizer)。
階梯函數由兩部分構成(見W3C):
步數:步數是經過一個整數指定,而且每步的時間長度同樣(即把持續時間等分,而且輸出值也是等分的)
什麼時間改變值:指定在每步的什麼時間點改變值,只支持兩個時間點:每步的開始和每步的結束。
CSS3提供的三次貝茲曲線由四個點構成(P0-P3),其中P0(0,0), P3(1,1)是固定的。做者只能控制p1,p2點的位置來控制貝茲曲線。
transition-timing-function: <single-transition-timing-function>[, <single-transition-timing-function>]* <single-transition-timing-function> = ease | linear | ease-in | ease-out | ease-in-out | step-start | step-end | steps(<integer>[, [ start | end ] ]?) | cubic-bezier(x1, y1, x2, y2) x1,y1, x2, y2 = <number>
ease: 平滑(先加速(加速時間短),後減速)
linear: 線性
ease-in: 加速
ease-out: 減速
ease-in-out: 先加速,後減速(加速、減速時間相等)
經過steps函數能夠自定義階梯函數,參數1指定步數,參數2指定改變值的時間點。start表示在每步的開始改變值,end表示在每步的結束改變值。參數2是可選的,缺省時取值end。
經過cublic-bezier函數自定義三次貝茲曲線。指定p1, p2點位置(p0, p3是固定值),其中x軸的取值範圍只能是[0, 1],而y軸的取值不受限制。更好了查看貝茲曲線效果參考http://cubic-bezier.com/
見參考Understanding CSS Timing Functions,裏面列舉了各類舉例。
指定過渡延遲執行的時間,即從DOM元素CSS屬性值發生變化(賦值個新目標值)到DOM元素開始執行過渡之間的時間。
transition-delay: <time>[, <time>]* 默認值:0s
延遲時間能夠爲負值,爲負值時會立馬執行過渡(就像沒有延遲同樣),可是起始值是過渡執行一段時間(延遲時間的絕對值)時的值。換句話說,負值延遲時間X表示當屬性值發生變化時延遲已經在X時間前完成了,而且已經執行過渡X時間了。實際用戶看到的過渡時間比實際執行事件少了X事件。好比-2s,表示在屬性值發生變化時已經執行過渡2s了,而且當前的屬性的起始值應該是執行過渡2s時的值。
A:
transition-property: width; transition-duration: 1s; transition-timing-function: linear; transition-delay: .5s;
表示:
width屬性應用一個持續1s, 延遲0.5s,時間函數爲linear的過渡,<width,1s, linear, 0.5s>
B:
transition-property: width; transition-duration: 1s; transition-timing-function: linear; transition-delay: -.5s; /* 延遲時間爲負值 */
表示:
width屬性應用一個持續1s, 延遲-0.5s,時間函數爲linear的過渡,<width,1s, linear, -0.5s>,用戶體驗的過渡時間應該是0.5s.
A:負值延遲時間會影響實際過渡執行的時間。
transition是其餘transition-屬性的簡潔方式。
transition: <single-transition>[, <single-transition>]* <single-transition> = [ none | <single-transition-property> ] || <time> || <single-transition-timing-function> || <time>
注意在tansition屬性中有兩個<time>類型的值(持續時間,延遲時間),規定前面的時間是持續時間,後面的表示延遲時間。
A:
transition: none;
表示:全部屬性都不該用過渡,等價於transition-property: none;
B:
transition: width 2s
表示: width屬性應用一個持續2s的過渡,即<width, 2s, ease, 0s>
當一個可動畫的屬性的計算值發生變化時,瀏覽器就根據tansition系列屬性的值決定給該屬性應用什麼樣的過渡。
過渡過程當中tansition屬性發生變化並不會影響本次過渡,除了tansition-property的none取值(會終止當前過渡)
終止當前過渡,並根據新的值應用一個新的過渡。
display: none
後當即使用過渡, 元素將視爲沒有開始狀態,始終處於結束狀態。簡單的解決辦法,改變屬性前用 window.setTimeout() 延遲幾毫秒。過渡完成後會觸發TransitionEvent事件。過渡取消不會觸發該事件。
var transitionProperty = (function() { var t, el = document.createElement('surface'), transitions = { 'transition': { eventName: 'transitionend', cssName: 'transition' }, 'OTransition': { eventName: 'oTransitionEnd', cssName: '-o-transition' }, 'MozTransition': { eventName: 'transitionend', cssName: '-moz-transition' }, 'WebkitTransition': { eventName: 'webkitTransitionEnd', cssName: '-webkit-transition' } } for(t in transitions){ if( el.style[t] !== undefined ){ return transitions[t]; } } })()
哪些屬性能夠應用transition:只能是可動畫的CSS屬性能夠應用。
見:
http://caniuse.com/#search=tr...
https://developer.mozilla.org...
W3C: https://www.w3.org/TR/css3-tr...
MDN:https://developer.mozilla.org...
W3C+:http://www.w3cplus.com/conten...
cubic-beizer詳解:http://www.candoudou.com/arch...
Understanding CSS Timing Functions【High】:https://www.smashingmagazine....
【工具】
緩動函數(更直觀的查看過渡動畫):http://easings.net/zh-cn
在線繪製貝茲曲線【High】:http://cubic-bezier.com/