1. 程式人生 > >CSS transitions深入理解

CSS transitions深入理解

到底css transition是什麼,我們來看w3c的解釋:

CSS Transitions allow property changes in CSS values to occur smoothly over a specified duration. This smoothing animates the changing of a CSS value when triggered by a mouse click, focus or active state, or any changes to the element (including even a change on the element’s class attribute).

翻譯為中文就是:css transition允許css屬性值的變化在一個時間段內平滑完成,變化的快慢可以有對應的函式來指定。這個平滑展現css值的變化過程可以由很多事件來觸發,比如滑鼠點選,focus,hover等。

a.foo {
  padding: 5px 10px;
  background: #9c3;
  -webkit-transition-property: background;
  -webkit-transition-duration: 0.3s;
  -webkit-transition-timing-function: ease;
  }
a.foo:hover {
  background
: #690; }

從上面的程式碼中,我們可以看到和transition相關的幾個屬性:

transition-property: 指定對哪個屬性值的變更來執行對應transition動畫過程;

transition-duration: 這個transition動畫從開始到完成的時間段落

transition-timing-function:指定transition經由時間軸變更的節奏快慢(ease, linear, ease-in, ease-out,ease-in-out, cubic-bezier)

所有可以被transtion的css屬性列表:

通過程式動態新增class來觸發transition

在上面的例子中,我們都是通過在元素class中設定transition屬性,在sudo class中設定變更的屬性值來實現的。有的時候,我們不光需要sudo class能夠實現transition的觸發,有什麼辦法嗎?

這時我們可以通過javascript來動態地增加或者刪除class來實現transition的觸發:

/* CSS */
.element {
  opacity: 0.0;
  transform: scale(0.95) translate3d(0,100%,0);
  transition: transform 400ms ease, opacity 400ms ease;
}

.element.active {
  opacity: 1.0;
  transform: scale(1.0) translate3d(0,0,0);
}

.element.inactive {
  opacity: 0.0;
  transform: scale(1) translate3d(0,0,0);
}

// JS with jQuery
var active = function(){
  $('.element').removeClass('inactive').addClass('active');
};

var inactive = function(){
  $('.element').removeClass('active').addClass('inactive');
};

看上面的程式碼,我們將獲得兩種不同的transitions, 元素當activated的時候slide up,而當deactivated時fade out.所有javascript乾的活兒就是切換了兩個class: active和inactive

hardware acceleration

transition一些屬性,比如left, margin會使得瀏覽器在每一個frame時都重新計算styles,這是非常昂貴的計算,會導致不必要的re-paints,特別是如果在螢幕上有非常多的元素時更是如此。一個可行的方案是使用GPU。

transform: translate3d(0,0,0);