javascript - jQuery animate scrolltop on Opera 错误

标签 javascript jquery dom opera

有没有人用过

$(“html, body”).animate({scrollTop:0}, 'slow');

在 Opera 浏览器上?

它会产生一种奇怪的效果,尤其是当您在一个长页面上滚动时,页面似乎先到达顶部然后向下滚动到正确的位置。这是一种奇怪的令人不安的效果......

是否有解决方法?谢谢

最佳答案

过去没有正确定义该属性。我认为它是由 IE 引入的,然后通过逆向工程由不同的用户代理实现。自此在 CSSOM 中进行了描述(仍然是工作草案)。截至今天,Opera 中确实存在一个正在修复的错误。

## 可能的破解。

一个解决方案是

$(window.opera?'html':'html, body').animate({ 
  scrollTop:0}, 'slow' 
);

要小心,因为如果 Opera 在某一点修复它,代码可能会表现得很奇怪。

为什么?

  • 在 Firefox 和 IE 怪异模式下,您必须在“body”上设置该属性才能使页面滚动,而如果在“html”上设置则忽略该属性。
  • 在Firefox 和IE 标准模式下,您必须在“html”上设置该属性才能使页面滚动,而如果在“body”上设置则忽略该属性。
  • 在 Safari 和 Chrome 中,在任何一种模式下,您都必须在“body”上设置该属性才能使页面滚动,而如果在“html”上设置该属性,则该属性将被忽略。

由于页面处于标准模式,他们必须在“html”和“body”上都设置它,否则它将无法在 Safari/Chrome 中工作。

现在有个坏消息;在 Opera 中,当您读取 body 的 scrollTop 时,它正确地为 0,因为 body 在文档中不可滚动。但如果您在“html”或“body” 上设置滚动偏移,Opera 将滚动视口(viewport)。结果,动画设置了两个属性,一次用于“html”,一次用于“body”。第一个从正确的位置开始,而第二个从 0 开始,导致闪烁和奇怪的滚动位置。

不涉及用户代理嗅探的更好解决方案

来自 http://w3fools.com/js/script.js

    // find out what the hell to scroll ( html or body )
    // its like we can already tell - spooky
    if ( $docEl.scrollTop() ) {
        $scrollable = $docEl;
    } else {
        var bodyST = $body.scrollTop();
        // if scrolling the body doesn't do anything
        if ( $body.scrollTop( bodyST + 1 ).scrollTop() == bodyST) {
            $scrollable = $docEl;
        } else {
            // we actually scrolled, so, er, undo it
            $body.scrollTop( bodyST - 1 );
        }
    }

关于javascript - jQuery animate scrolltop on Opera 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4880743/

相关文章:

javascript - 使用 ng-repeat 添加/删除 DOM 元素 <input>

javascript - minicart.js 不工作,购物车不弹出

Java 转换器 w3c.dom.document 到 inputstream

javascript - 为什么我不能在 ie 中未插入的节点上使用原型(prototype) DOM 方法?

Javascript:替换元素与更改元素属性

javascript - 反向 jquery 倒数计时器

javascript - 使用 JavaScript 将路径附加到 SVG

javascript - 访问变量内的 DOM 元素

javascript - 从图像中裁剪出麦田圈并设置为网站图标

jQuery Windows 移动应用程序 "append(html) not working"