2009-04-19 74 views
1

我試圖使用jQuery.scrollTo手風琴插件(其中一個塊擴展後單擊它和另一個合同),但它不滾動到正確的位置。scrollTo不滾動到正確的位置

這裏是一個演示:pelmeshkin.com/temp/scrolltoaccoridon

正如你所看到的,第一次點擊滾動正確,但每下一次更進了一步比它應該。

它似乎使用目標的初始位置(它在擴展/收縮之前),這是有道理的,因爲兩個事件都是同時啓動的,但即使我嘗試暫停scrollTo並等到slideUp/slideDown轉換完成後,它仍然表現相同。 :(

回答

3

好吧,我有點解決它自己。我第一次發現在頁面加載的所有可點擊元素的位置使用偏移(),把它們放在數組,然後餵它們作爲像素值scrollTo上單擊事件。

通過這種方式,我們將scrollTo精確的像素位置滾動到頁面上,而不是依靠它來從元素ID本身進行計算。以下是最終結果:pelmeshkin.com

+1

altCognito的回答僅僅是對我在問題中已經提到的內容進行了回覆,但沒有實際的解決方案。由於沒有更多的答案,我至少提供了一種可能的解決方案,可以幫助那些遇到同樣問題並找到這篇文章的人。或者是否有一個關於接受自己的答案的計算器上的規則? – pelmeshkin 2009-05-09 15:30:49

4

因爲它是根據動畫出現之前的位置來計算位置。不知道你會怎麼處理這個事情,說實話,除了修補內部計算這可能不是一件簡單的事情。

+0

謝謝!是的,我不認爲我想深入瞭解:)也許,我可以先滾動,然後通過回調擴展/縮小,但我不確定如何將「this」對象傳遞給回電話。 像這樣的東西不起作用: $ .scrollTo($(本),1000,函數(){// 擴大(本); // 合同(不是(這個)); }); – pelmeshkin 2009-04-20 00:27:44

0

夥計。 N.S.F.W.

,有點黑客周圍Effect.ScrollTo後:

Effect.LazyScrollTo = function(element) { try { 
    var options = arguments[1] || { }; 
    scrollOffsets = document.viewport.getScrollOffsets(); 
    elementOffsets = $(element).cumulativeOffset(); 

    if (options.offset) elementOffsets[1] += options.offset; 

    return new Effect.Tween(null, 
    scrollOffsets.top, 
    elementOffsets[1], 
    options, 
    function(p){ 
     try { 
     this.lazy_offset = this.lazy_offset || $(element).cumulativeOffset(); 
     scrollTo(scrollOffsets.left, (p.round() - (elementOffsets[1] - this.lazy_offset[1]))); 
     } catch(e) { 
     alert(e); 
     } 
    }.bind(this) 
); 
} catch(e) { alert(e); }} 

然後在別處......

new Effect.SlideDown('tab1-body', {queue: 'end'}); 
new Effect.LazyScrollTo('tab1-heading', {queue: 'end'}); 

新年快樂。

+0

...但你的解決方案確實工作...所以謝謝:) – 2009-12-29 16:05:11

相關問題