【技術分享】JQuery Mobile轉場分析

關於使用JQM(JQuery Mobile)看到不少人提出的第一句話就是性能不行,再問就是轉場閃屏等.這裏就分享下我對轉場的一些學習成果. 

css

JQM的轉場實際上利用的所有是CSS,只是簡單的一個addClass 和removeClass.下面是帶動畫轉場的函數 css3

Java script代碼   收藏代碼
  1. function css3TransitionHandler( name, reverse, $to, $from ) {  
  2.   
  3.     var deferred = new $.Deferred(),  
  4.         reverseClass = reverse ? " reverse" : "",  
  5.         viewportClass = "ui-mobile-viewport-transitioning viewport-" + name,  
  6.         doneFunc = function() {  
  7.   
  8.             $to.add( $from ).removeClass( "out in reverse " + name );  
  9.   
  10.             if ( $from && $from[ 0 ] !== $to[ 0 ] ) {  
  11.                 $from.removeClass( $.mobile.activePageClass );  
  12.             }  
  13.   
  14.             $to.parent().removeClass( viewportClass );  
  15.   
  16.             deferred.resolve( name, reverse, $to, $from );  
  17.         };  
  18.   
  19.     $to.animationComplete( doneFunc );  
  20.   
  21.     $to.parent().addClass( viewportClass );  
  22.   
  23.     if ( $from ) {  
  24.         $from.addClass( name + " out" + reverseClass );  
  25.     }  
  26.     $to.addClass( $.mobile.activePageClass + " " + name + " in" + reverseClass );  
  27.   
  28.     return deferred.promise();  
  29. }  



從中能夠看到,只有各類的樣式切換,除此之外別無它物.至於 $.Deferred()是JQuery提供的延遲處理的機制,這裏不作討論. 

簡單看看這個函數的4個參數,分別是轉場效果名稱、是否回退、前一頁面jq對象、目標頁面jq對象。處理的邏輯描述起來也很是簡單: 

1.是否存在前一個頁面,存在增長out 
2.爲目標頁面增長in和激活頁面樣式 
3.當頁面動畫完成刪除前一個頁面的激活頁面樣式和目標頁面轉場樣式 


接下來看看CSS部分,其實全部的東西均可以用一個transform(至於transform這裏也不作解釋)搞定,以slide爲例 web

Css代碼   收藏代碼
  1. .slide.out {  
  2.     -webkit-transform: translateX(-100%);  
  3.     -webkit-animation-name: slideouttoleft;  
  4. }  
  5.   
  6. .slide.in {  
  7.     -webkit-transform: translateX(0);  
  8.     -webkit-animation-name: slideinfromright;  
  9. }  
  10.   
  11. .slide.out.reverse {  
  12.     -webkit-transform: translateX(100%);  
  13.     -webkit-animation-name: slideouttoright;  
  14. }  
  15.   
  16. .slide.in.reverse {  
  17.     -webkit-transform: translateX(0);  
  18.     -webkit-animation-name: slideinfromleft;  
  19. }  



實際上就是經過-webkit-animation-name指定了一組動畫效果 promise

Css代碼   收藏代碼
  1. @-webkit-keyframes slideinfromright {  
  2.     from { -webkit-transform: translateX(100%); }  
  3.     to { -webkit-transform: translateX(0); }  
  4. }  
  5.   
  6. @-webkit-keyframes slideinfromleft {  
  7.     from { -webkit-transform: translateX(-100%); }  
  8.     to { -webkit-transform: translateX(0); }  
  9. }  
  10.   
  11. @-webkit-keyframes slideouttoleft {  
  12.     from { -webkit-transform: translateX(0); }  
  13.     to { -webkit-transform: translateX(-100%); }  
  14. }  
  15.   
  16. @-webkit-keyframes slideouttoright {  
  17.     from { -webkit-transform: translateX(0); }  
  18.     to { -webkit-transform: translateX(100%); }  
  19. }  



因此若是須要擴展本身的類型,只要按照約定新增本身的樣式表就能夠作到。 




另外關於JQM轉場閃屏的問題,其實能夠經過下面的樣式修正 ide

Css代碼   收藏代碼
  1. .ui-page {  
  2.     backface-visibility: hidden;  
  3.     -webkit-backface-visibility: hidden; /* Chrome and Safari */  
  4.     -moz-backface-visibility: hidden; /* Firefox */  
  5. }  



只須要在頁面元素增長背面不可見,來防止動畫發生的時候產生的閃屏.我在HTC G17 的真機環境下,沒有任何問題. 


PS:若是須要更改動畫速度,只須要更改下面的-webkit-animation-duration便可 函數

 

Css代碼   收藏代碼
    1. .in, .out {  
    2.     -webkit-animation-timing-function: ease-in-out;  
    3.     -webkit-animation-duration: 350ms;  
    4. }   

 

原文連接  http://peng-jiesi.iteye.com/blog/1457463性能

相關文章
相關標籤/搜索