第四十課:CSS3 transition詳解

W3C中對transition是這樣描述的:容許css的屬性值在必定的時間內平滑的過渡,也就是說,以動畫的效果改變css的屬性值。css

transition主要包含4個屬性值:transition-property:樣式名;transition-duration:持續時間;transition-timing-function:緩動公式;transition-delay:延遲多長時間才觸發。接下來咱們來詳細講下這四個屬性值。web

transition-property跨域

transition-property是用來指定當元素的哪一個屬性值變化時,就執行transition效果的。主要有如下幾個值:none(沒有屬性會得到過渡效果,也就是說設置了none,此元素不會有過渡效果,就跟沒設置transition同樣);all(只要元素的任何一個屬性改變,就會有過渡效果,這是默認值);property(具體的屬性名,能夠有多個,用逗號分開,好比:transition-property: width,height;);瀏覽器

transition-duration緩存

動畫持續的時間,單位能夠是s,也能夠是ms。咱們能夠多個持續時間值,好比:transition-duration:1s, 1500ms, 2s;transition-property:width,height,color。其中1s對應width屬性改變,1500ms對應height屬性的改變,2s對應color屬性的改變。默認值爲0.app

transition-timing-function框架

緩動公式,根據時間的推動,去改變屬性值的變換速度。它主要有6個值:函數

ease(逐漸變慢),默認值動畫

linear(勻速)spa

ease-in(加速)

ease-out(減速),跟ease的區別是,減速的變化程度不同。

ease-in-out(先加速,再減速)

cubic-bezier,容許你自定義一個時間曲線,經過cubic-bezier(x1,y1,x2,y2),此屬性值能夠模擬以上5個狀態,只要傳入相應的x1,y1,x2,y2給cubic-bezier(x1,y1,x2,y2)。這4個值必須在[0,1]之間,不然無效。

transition-delay

延遲多長時間,才進行變化,單位有s,ms。默認值爲0.

舉個例子來展現下transition如何使用:

<style>

  #move{

    position:absolute;

    left:0px;

    width:100px;

    height:100px;

    background:red;

    font-size:14px;

  }

  #move:hover{      //鼠標移動到move元素時,就會動態的改變它的三個屬性值background,font-size,left。

    background:green;

    font-size:26px;

    left:700px;

    transition: all 2s ease 0.3s;

    -moz-transition: all 2s ease 0.3s;

    -webkit-transition: all 2s ease 0.3s;

    -o-transition: all 2s ease 0.3s;     

  }

</style>

著名的Bootstrap的動畫就是基於transition的。另外,當上面的這個動畫(過渡效果)結束後,就會觸發一個transitionEnd的事件。此transitionEnd在不一樣瀏覽器下具備不一樣的寫法,好比:webkitTransitionEnd,oTransitionEnd等。那麼,咱們如何來取得這個可用的事件名呢?

第一種方法:動態建立一個元素與一個樣式表插入DOM樹中,而後改變目標樣式值,從而觸發回調,獲得事件的名字,最後把元素和樣式表從DOM樹中刪除。

(function(){

  var span = document.createElement("span");   //建立一個元素span

  span.id = "chaojidan";

  span.innerHTML = "test";

  var body = document.body || document.documentElement;

  var style = document.createElement("style");   //建立一個元素style

  body.appendChild(span);

  body.appendChild(style);   //添加到頁面中

  style.innerHTML = "#chaojidan{color:red;opacity:0;height:1px;overflow:hidden;-moz-transition:color 0.1s;-webkit-transition:color 0.1s;-o-transition:color 0.1s;}";     //設置元素span的樣式,只要改變span的color屬性值,就會觸發過渡動畫。

  "transitionend otransitionend oTransitionEnd webkitTransitionEnd".replace(/\w+/g,function(type){    //type就是每次正則匹配的值

    span.addEventListener(type,function(e){   //給元素span綁定過渡動畫結束後的觸發的事件,這裏綁定了4個。

      window.transitionEnd = e.type;     //瀏覽器支持哪一個名字,就會執行到這裏,而後把事件的類型,賦給window對象的transitionEnd。

    },false);

  });

  setTimeout(function(){span.style.color="black";});   //執行span元素的過渡動畫,用時100ms。

  setTimeout(function(){

    body.removeChild(span);

    body.removeChild(style);

  },1000); 

})();

第二種方法:從事件的構造器着手,若是把事件構造器的名字直接傳入到createEvent,不拋錯,就證實瀏覽器支持這種事件。

var getTransitionEnd = function(){

  var obj = {

    "TransitionEvent":"transitionend",

    "WebKitTransitionEvent":"webkitTransitionEnd",

    "OTransitionEvent":"oTransitionEnd",

    "otransitionEvent":"otransitionEnd"

  };

  var ret;

  for(var name in obj){

    try{

      var a = document.createEvent(name);

      ret = obj[name];

      break;

    }catch(){}

  }

  getTransitionEnd  = function(){   //重寫此方法,只須要檢測一次,下次直接返回緩存結果,這叫作惰性函數。

    return ret;

  }

  return ret;

}

最後,咱們用css transition實現一個動畫效果:

<style>

  #test{

    width:100px;height:100px;position:absolute;background:red;

    left:0;  

      transition: left 5s;

    -moz-transition: left 5s;

    -webkit-transition: left 5s;

    -o-transition: left 5s;     

  }

</style>

<script>

  var $ = function(id){

    return document.getElementById(id);

  }

  var el = $("test");

  $("run").onclick = function(){    //點擊run按鈕時,觸發過渡動畫效果,此動畫把元素test從0移動到700,用時5s。

    el.style.left = "700px";

  }

  $("stop").onclick = function(){  //點擊stop按鈕,將會中止過渡動畫。

    var left = window.getComputedStyle(el,null).left;   //獲得元素test的當前left的值

    el.style.left = left;   //當test元素在運動時,你點擊了stop按鈕的話,test元素會立刻中止。

    ["", "-moz-", "-o-", "-webkit-"].forEach(function(prefix){

      el.style.removeProperty(prefix +"transition");   //DOM2定義的style方法,低版本IE瀏覽器不支持。這裏只能刪除標籤上的style樣式值

    });

  }

</script>

上面的例子暴露出transition的弱點了,雖然咱們中止動畫時,能夠經過取當前的left值而後從新賦值的手段實現了,可是隻要transition這個樣式沒有沒清除掉,那麼,咱們後面每一次變更left這個樣式值,都會發生過渡動畫效果。而想移除這個transition樣式,只有當它寫在標籤的style屬性中時,咱們才能很好的刪除。若是它是定義在內部樣式(咱們例子中寫法)或外部樣式,那麼要刪除就比較麻煩了(能夠經過CSSStyleSheet對象刪除)。可是若是外部樣式是跨域獲取的,那麼刪除樣式規則這個手段就失效了,意思就是沒法刪除transition樣式值了。

所以,使用transition實現動畫效果,可控性太差,不適合做爲一個框架的動畫引擎的實現手段。

 

 

 

加油!

相關文章
相關標籤/搜索