[英]Strange first time scroll delay in Chrome using jQuery ScrollTop animate
[英]Strange behavor using scrollTop
我有一个奇怪的行为,使用scrollTop JQuery函数。 我有一个div,其中包含复杂的文本,分为以下不同部分:
<div id="wrapper" ... >
<div id="section1">
<h1>Section 1</h1>
Lorem ipsum dolor sit amet, consectetuer...
...
</div>
<div id="section2">
<h1>Section 2</h1>
Lorem ipsum dolor sit amet, consectetuer...
...
</div>
<div id="section3">
<h1>Section 3</h1>
Lorem ipsum dolor sit amet, consectetuer...
...
</div>
...
第二个DIV包含一个简单的部分列表,当用户单击每个部分时,我希望包装器滚动到右侧部分:
<li>
<a href="#" onclick="customScrollTo('section1')">section1</a>
</li>
<li>
<a href="#" onclick="customScrollTo('section2')">section2</a>
...
这是简单的JS函数:
function customScrollTo (section) {
$('#wrapper').animate({
scrollTop: $("#wrapper div[id='" + section + "']").offset().top
}, 200);
};
现在,如果您尝试在此JSfiddle中对其进行测试: http : //jsfiddle.net/Ws5F9/4/
您会看到两个奇怪的行为:
customScrollTo
方法有两个问题。
首先,您使用.offset()而不是.position() 。 这将返回相对于文档而不是#wrapper
div的位置。 这在这里几乎没有引起注意,因为div无论如何都靠近文档的顶部,但是在将其进一步移至页面下方时会遇到麻烦。
其次,当您调用position时,它将考虑当前滚动位置返回元素的位置 ,因此,如果您已经滚动到文档的顶部,它将按预期工作,但是任何进一步的滚动都会造成麻烦,由于文档已被移动。 您还需要考虑当前滚动位置,方法是将其添加到最终滚动值中,这样它就不会丢失。
这是解决两个问题的示例:
function customScrollTo (section) {
$('#wrapper').animate({
scrollTop: $("#wrapper div[id='" + section + "']").position().top + $("#wrapper").scrollTop()
}, 200);
};
用这个:
function customScrollTo (sectionId) {
var $wrapper = $('#wrapper'),
$section = $('#' + sectionId);
$wrapper.animate({
scrollTop: $wrapper.scrollTop() + $section.position().top
}, 200);
}
.offset()
函数获取相对于文档的坐标,而.position()
函数获取相对于父文档的坐标。 但是.position().top
值随元素滚动而变化。 添加父级的.scrollTop()
值可以.scrollTop()
进行调整。
试试这个,我也修改了您的标记。 看到这个演示
$('#index ul').on('click', 'a', function(e) {
var section = $(this).prop('href');
section = section.split('#')[1];
var top = $("#" + section)[0].offsetTop;
$('#wrapper').stop().animate({
scrollTop: top
}, 200);
return false;
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.