我正在尝试使用带有accordion的jQuery.scrollTo插件(其中一个块在点击它和另一个合同后扩展),但它不会滚动到正确的位置。
以下是演示:pelmeshkin.com/temp/scrolltoaccoridon
正如您所看到的,第一次单击可以正确滚动,但是下一次单击会比它应该更进一步。
似乎使用目标的初始位置(在扩展/收缩之前的位置),这是有道理的,因为两个事件都是同时启动的,但即使我尝试暂停scrollTo并等到slideUp / slideDown转换结束了,它仍然表现相同。 :(
答案 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'});
新年快乐。