同样的旧问题,.scrollTop(0)在Chrome和Safari中无效

问题描述 投票:6回答:11

首先,让我指出,我已经用Google搜索,甚至在这里查看thisthis的答案,但是,我仍然没有为我的案例找到一个有效的解决方案。

我设计了一个页面,其中有几个固定元素覆盖页面,并使html5 / css3在主文档上创建一个干净的“掩码”,从而允许主体滚动条仍然滚动底层内容。

在firefox和ie(bleh)中,scrollTop(0)工作正常。但是,正如问题所述,在我喜欢的浏览器中并没有那么多。

我记下的一件事是在scrollTo事件之前和之后调用以下内容

$("body,html,document").each(function(){ console.log($(this).scrollTop()); });

结果并不令人满意,它告诉我,scrolltop已经是0,因此甚至没有尝试使用scrollTop,或者至少那是我迄今为止“想到的”。

在你问之前,我在这3个项目中的每个项目都进行了控制台调用,因为文档scrolltop应该被覆盖在其中一个项目中(我会想到身体,但是就像你必须调用html一样)

任何关于想法的人?

仅供参考,这可能是一个奇怪的问题(在IE中它是如何工作的而不是我真的无法理解的铬)但我已经尝试了以下结果:

$(window).scrollTop(0);
$(document).scrollTop(0);
$("html").scrollTop(0);
$("body").scrollTop(0);
window.scroll(0,0);
$("body,html,document").scrollTop(0);
$("body,html").scrollTop(0);

我想这扩展了我的问题,这是一个CSS问题吗?我没有外部链接,代码太长(用CI视图Partials制作)发布所有内容,但要澄清我做了什么:

  • 修复了页眉,页脚和侧边栏,使内容与文档滚动条一起滚动
  • 到目前为止实现的javascript或jquery非常少,在预定元素的固定位置之外几乎有0个自定义css
  • “内容”是基于单边栏导航器中单击的列表项使用jQuery的.load函数的ajax

临时小提琴不再起来

jquery google-chrome safari scrolltop
11个回答
8
投票

问题出在CSS上。特别是我在下面列出的规则。

html, body {
    overflow-x: hidden;
    overflow-y: auto;
}

虽然这些规则显然与滚动条有关,但我不确定它们为什么会导致您正在观察的行为。但如果你删除它们,它应该解决你的问题。

见:http://jsfiddle.net/jNWUm/23/


0
投票

(function () { var down = false, downX, downY; document.onmousedown = function (e) { downX = e.pageX; downY = e.pageY; down = true; }; document.onmouseup = function () { down = false; }; document.onmousemove = function (e) { if (down) { window.scrollTo( window.scrollX + downX - e.pageX, window.scrollY + downY - e.pageY ); } }; })(); 也应该这样做。


0
投票

我在MacOS上遇到过这个问题。我试图把:

overflow: hidden

html,它仍然无法正常工作。

然后我尝试使用一些技巧:

body

它工作正常!固定位置将jQuery API docsoverflow: hidden分离,有效地将窗口滚动位置设置为零。然后延迟200毫秒(只是为了更安全的一面),我把$('#element-id').prop('scrollTop', 0);放回去了。

我希望这有帮助。谢谢。


19
投票

我有同样的问题。如果我放

$(window).scrollTop(0);

在文档就绪处理程序中,它没有工作;但如果我在Chrome开发者工具包的javascript控制台面板中测试它,它就可以了!唯一的区别是脚本的执行时间。所以我试过了

window.setTimeout(function() {
    $(window).scrollTop(0); 
}, 0);

它起作用了。设置延迟大于0是不必要的,尽管这也有效。这不是jQuery的错,因为它是一样的

window.scrollTo(0, 0);  window.scroll(0, 0);

所以原因可能是浏览器在呈现页面并执行js后填充window.pageYOffset属性。


9
投票

对于需要溢出设置的人来说,解决方法是使用这样的动画。

    $('#element_id').stop().animate({ scrollTop: 0 }, 500);

这似乎比.scrollTop(0)更好。


3
投票

我刚刚在IE8和Chrome中测试了以下内容,两者都有效:

$(window).scrollTop(0)

1
投票

还看看这个答案:scrolltop broken on android - 当溢出设置为可见并且位置相对时它似乎效果最好 - 但是ymmv。您可能会发现这些有用......

function repeatMeOnMouseDown() // for smooth scrolling
{
    var $newTop = $('#element_id').position().top + ($goingUp ? -20 : 20);
    $('#element_id').animate({top: $newTop}, 20, repeatMeOnMouseDown); 
}

// these should work
$('#element_id').animate({top: -200}, 200); // scroll down
$('#element_id').animate({top: 0}, 200); // scroll back up

// DON'T DO THIS - Offsets don't work with top like they do with scrollTop 
$('#element_id').animate({top: ("-= " + 200)}, 200);

// and when you get tired of fighting to do smooth animation 
// on different browsers (some buggy!), just use css and move on
function singleClick($goingUp)
{
   var $newTop = $('#element_id').position().top + ($goingUp ? -200 : 200);
    $('#element_id').css({top: $newTop}, 20); 
}

1
投票

仅供参考,如果不是在顶层,即在iframe中,只需尝试window.top.scrollTo(0,0);


1
投票

我在qazxsw poi中滚动时遇到了同样的问题。理由是在qazxsw poi和chrome中的qazxsw poi风格。 height:100%


0
投票

此代码在chrome中测试过。 body

html

0
投票

这是正常的行为,当你在css中宣布qazxsw poi为qazxsw poi或qazxsw poi dom元素时,你可以在See this answer中读到:

垂直滚动位置与可滚动区域上方的视图中隐藏的像素数相同。如果滚动条位于最顶部,或者元素不可滚动,则此数字将为0。

使用http://jsfiddle.net/wmo3o5m8/1/滚动条不可见因此元素不可滚动,因此在您将使用的每个(我不知道)浏览器中数字将为0。

© www.soinside.com 2019 - 2024. All rights reserved.