scrollTo不会滚动到正确的位置

时间:2009-04-19 23:59:49

标签: jquery accordion scrollto

我正在尝试使用带有accordion的jQuery.scrollTo插件(其中一个块在点击它和另一个合同后扩展),但它不会滚动到正确的位置。

以下是演示:pelmeshkin.com/temp/scrolltoaccoridon

正如您所看到的,第一次单击可以正确滚动,但是下一次单击会比它应该更进一步。

似乎使用目标的初始位置(在扩展/收缩之前的位置),这是有道理的,因为两个事件都是同时启动的,但即使我尝试暂停scrollTo并等到slideUp / slideDown转换结束了,它仍然表现相同。 :(

3 个答案:

答案 0 :(得分:4)

因为它在动画发生之前根据位置计算位置。不知道如何处理这个事实,除非可能修补内部计算,这可能不是一件简单的事情。

答案 1 :(得分:3)

好的,我有点自己解决了。我首先使用offset()在pageload上找到所有可点击元素的位置,将它们放在数组中,然后将这些作为像素值提供给clickTo上的clickTo。

这样我们就可以在页面上滚动到scrollTo精确的像素位置,而不是依赖它来自元素ID本身计算它。以下是它最终的表现:pelmeshkin.com

答案 2 :(得分: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'});
新年快乐。