2011-12-23 79 views
1

我最近開始一個新項目,這是一個CSS3/jQuery翻書(點擊翻頁,或點擊&拖動右頁)。提高jQuery拖動動畫的性能

看到它live hereplay with the fiddle

問題:

我怎樣才能提高速度拖動頁面的時候?

似乎在Chrome和Safari確定,但它是在Firefox慢/「steppy」和歌劇

BTW(在上一個Mac OS X雪豹最新版本的測試)..我真的很可怕米仍然清理代碼/我試圖刪除旋轉,但它似乎並沒有改變任何東西。

我有這樣的抱怨在Chrome/MAC表現太(似乎「OK」對我來說)一個少數測試..

任何幫助/批評/提示表示讚賞。

下面是移動頁面(見小提琴整個代碼)

function startMove() { 
    $('#flipwrap.movable').on('mousemove', function(e) { 
     e.preventDefault(); 
     thisX = parseFloat((e.pageX - offsetX - 190), 10); 
     thisY = parseFloat((e.pageY - offsetY - 270), 10); 
     positionX = parseFloat((((thisX - 55) * -1) + 310), 10); 
     positionY = parseFloat(((thisY + 100)/10), 10); 
     rotateZ = parseFloat((((positionX - 350) * positionY)/900).toFixed(2) * -1, 10); 

     if ($('.page.flipit').hasClass('movable')) { 
      $('.page.flipit').stop(true, true); 
      $('.page.removeit').stop(true, true); 
      $('.page.flipit').removeClass('css-animation').css({ 
       width: 116 - thisX/2.1, 
       height: 345 - thisX/8, 
       top: -13 + thisX/16, 
       left: thisX + 155 
      }); 
      $('.page.flipit').css('-webkit-transform', 'rotate(' + rotateZ + 'deg) ').css('-o-transform', 'rotate(' + rotateZ + 'deg) ').css('-moz-transform', 'rotate(' + rotateZ + 'deg) '); 
      console.log(' pX = ' + positionX + ' pY = ' + positionY + ' rZ = ' + rotateZ + ' tX = ' + thisX + ' tY = ' + thisY); 
      $('.page.removeit').css({ 
       width: 40 + thisX/1.6 
      }); 
     } 
    }); 
} 
+0

得到了說,這對我來說非常笨重的Chrome,太(最新版本,Win7的)。除此之外,它看起來不錯,但。 – 2011-12-23 11:59:36

+0

也許你可以將它與原來的http://jsfiddle.net/pixelass/PXZwf/3/進行比較,它使用翻譯進行定位..(在這個例子中,mouseup上的動畫等完全關閉)..它是隻是拖動時捲曲/拖動部分的動畫平滑度 – pixelass 2011-12-23 12:49:02

回答

1

鼠標移動被稱爲數十次/ hunderds每次您移動鼠標的代碼,緩存你的選擇,即

$('#flipwrap.movable').on('mousemove', function(e) {} 
    var pageFlipIt = $('.page.flipit'); 
    $('#flipwrap.movable').on('mousemove', function(e) { 
    pageFlipIt.doStuff(); 
    }) 
}) 

但是最大的問題是動畫盒陰影和邊框半徑是相當處理器密集型的。我試圖在你的jsfiddle中刪除所有這些文件,並且在Opera中它像黃油一樣流暢,但它當然會帶走你書本實現的所有魅力。

我建議將它們全部刪除,然後逐步添加它們以查看在哪裏可以找到眼睛糖果和速度之間的折中。

+0

thx我感謝您的幫助。我刪除了箱子陰影動畫,但它仍然很笨。邊界不是真正的動畫,他們只是按照動畫..我嘗試使用翻譯和規模,這使得一切都比黃油更順利。但我不能使用scaleX ..可悲的是。我會嘗試變量緩存。邊框半徑不能被刪除,因爲那麼它將只是另一個可怕的翻書(有很多不好的jQuery css翻書...而且我不想使用html5畫布...哦,快樂的聖誕節BTW – pixelass 2011-12-24 23:30:00

+0

box-陰影似乎是殺手...沒有盒子陰影,但與半徑。但沒有CSS動畫.. http://jsfiddle.net/pixelass/PXZwf/9/但是..這看起來真的很糟糕沒有影子 – pixelass 2011-12-27 01:31:13

1

那麼@Duopixel說緩存選擇器的一開始,並鏈接它們。我會努力簡化數學 - 那裏有很多步驟。但是,是的,鼠標移動會引發很多事件,並且每個人都有很多數學。所以它會很難。

這裏是我的bash快於它,希望它是一些使用

function startMove() { 
    var $memoized_page_flipit = $('.page.flipit') 
     , $memoized_page_removeit = $('.page.removeit ') 
     , $memoized_page_stop = $memoized_page_flipit.add($memoized_page_removeit) 
     , offsetThisX = offsetX + 190 //saves an addition at every loop.. 
     , offsetThisY = offsetX + 270 
     , offsetPosX = offsetThisX + 55 + 310 //saves two additions at every loop.. 
     , offsetPosY = (offsetThisY + 100)/10; //saves one addtion every loop 
     , moving = false 

    $('#flipwrap.movable').on('mousemove', function(e) { 
     e.preventDefault(); 

     //tries not to have too many handlers hogging resources 
     if(moving){ 
      return; 
     } 
     moving = true; 

     thisX = e.pageX - offsetThisX; //floats and ints are all Numbers 
     thisY = e.pageY - offsetThisY; 
     positionX = offsetPosX - e.pageX; //swapping order to save the * -1 
     positionY = e.pageY/10 - offsetPosY 

     //make a string only once 
     rotateZ = 'rotate(' + parseFloat((((positionX - 350) * positionY)/900).toFixed(2) * -1, 10) + 'deg)'; 

     if ($memoized_page_flipit.hasClass('movable')) { 
      $memoized_page_stop.stop(true, true); 
      $memoized_page_flipit 
       .removeClass('css-animation') 
       .css({ 
        width: 116 - thisX/2.1, 
        height: 345 - (thisX >> 3),  //bitwise shift division 
        top: -13 + (thisX >> 4) , 
        left: thisX + 155 
        , '-webkit-transform' : rotateZ 
        , '-o-transform' : rotateZ 
        , '-moz-transform' : rotateZ 
       }); 
      $memoized_page_removeit.css({ 
       width: 40 + thisX/1.6 
      }); 
     } 
     moving = false; 
    }); 
} 
+0

這看起來很有趣。等不及回家給它一試... thx s束 – pixelass 2011-12-24 23:55:10

+0

所以..我試了你的答案。 http://jsfiddle.net/pixelass/PXZwf/7/ ...我還刪除了box-shadow和border-radius的CSS動畫,但在Opera/Firefox中它仍然顯得非常糟糕。我很樂意從別人那裏得到一些反饋。等等... – pixelass 2011-12-27 01:19:02

+0

是的,我也試過了,沒有看到太大的區別......正如我所說,這些都是最佳實踐,但是有這麼多的數學和這麼多的事件,它真的會很難。 – gotofritz 2011-12-27 13:27:11