JQuery动画scrollTop无法正常工作

JQuery动画scrollTop无法正常工作,jquery,scrolltop,Jquery,Scrolltop,以下JQuery代码将页面滚动到表单中的第一个错误: $('html,body').stop().delay(500).animate({scrollTop: $errors.filter(":first").offset().top -30},'slow'); 但是,如果我将$('html,body')替换为具有固定位置的容器元素的名称,例如div类$('.myDivClass'),则它似乎无法正常工作。它只是在每次提交时上下滚动到随机位置。如果容器元素不是html,body,那么它似乎工作

以下JQuery代码将页面滚动到表单中的第一个错误:

$('html,body').stop().delay(500).animate({scrollTop: $errors.filter(":first").offset().top -30},'slow');
但是,如果我将
$('html,body')
替换为具有固定位置的容器元素的名称,例如div类
$('.myDivClass')
,则它似乎无法正常工作。它只是在每次提交时上下滚动到随机位置。如果容器元素不是html,body,那么它似乎工作不正常

我不知道我做错了什么

容器元素的css如下所示(因此您知道我的意思):

我尝试过使用position()而不是offset()进行相对定位,但没有效果

谢谢大家!


更新:似乎没有解决方案。如果滚动的不是窗口,则需要查找相对于其容器的错误位置。在这种情况下是一个div。如果元素在div中,则使用
位置
,该位置将参考第一个具有相对、固定或绝对位置的父元素

$('.mcModalWrap1')
     .stop()
     .delay(500)
     .animate({scrollTop: $errors.filter(":first").position().top -30},'slow');

通过放弃这个想法解决了这个问题。JQuery scrollTop在父容器(html除外)中不起作用,只能滚动到特定位置。它只能滚动到顶部或底部。position()和offset()都不能正确计算该值


如果有人有答案,我很想知道。

我也有同样的问题。它只在第一次呼叫时起作用

要解决此问题,您需要在每次调用animate()之前滚动到顶部

所以我改变了主意:

$(element).animate({scrollTop: 500});

是的,这是真的,每次它都会先滚动到顶部,但没有动画,对我来说效果很好


希望能有帮助。

我知道我参加聚会迟到了,但遇到了同样的问题,下面是我如何解决的

当在固定位置的元素内滚动时,出于某种原因,您必须将其自身的scrollTop添加到要滚动的位置,因此:

var position = $errors.filter(":first").position().top + $('. myDivClass').scrollTop()
$('.myDivClass').animate({ scrollTop: position })

为我工作。

请尝试替换这行代码,以查看其行为是否符合您的要求:

$('#container').stop().delay(500).animate({scrollTop: $errors.filter(":first").offset().top - $('#container').offset().top + $('#container').scrollTop()},'slow');

我相信,您可以用
$errors.filter(“:first”).offset().top-$(“#container”).offset().top
替换部分
$errors.filter(“:first”).position().top

您在哪个浏览器中看到这种行为?在Chrome 17中,它似乎工作正常。当我提交表单时,它会滚动到第一个错误。如果第一个错误是名称,则会滚动到页面顶部。如果第一个错误进一步向下,那么它会将我滚动到输入元素。在我的所有浏览器中,它都会执行相同的操作。IE、FF、Chrome、Opera。内联版本工作得非常好。@Jasper,它不是为您上下交替移动吗?用于在容器内部滚动。。。试试这个漂亮的jQuery插件。。。非常灵活!使用position()而不是offset()对我产生相同的结果。@user1108996我知道你以前链接过你的站点,但我找不到关于这个问题的链接@Herman先生,发布的CSS显示所讨论的元素基本上是全屏的,它至少停靠在页面的顶部,因此
offset().top
position().top
应该返回相同的值。@Jasper好的,我将链接添加回了帖子。如果使用了浮动,可能需要100%的高度或使用clearfix。。。谷歌clearfix应该很容易:)
var position = $errors.filter(":first").position().top + $('. myDivClass').scrollTop()
$('.myDivClass').animate({ scrollTop: position })
$('#container').stop().delay(500).animate({scrollTop: $errors.filter(":first").offset().top - $('#container').offset().top + $('#container').scrollTop()},'slow');