【问题标题】:document.body.scrollTop Firefox returns 0 : ONLY JSdocument.body.scrollTop Firefox 返回 0:仅 JS
【发布时间】:2015-04-22 09:10:35
【问题描述】:

纯 javascript 中的任何替代方案?

以下作品适用于歌剧、铬和野生动物园。尚未在资源管理器上测试:

http://monkey-me.herokuapp.com

https://github.com/coolcatDev/monkey-me-heroku/blob/master/static/js/myscripts.js

在页面加载时应该向下滚动到 div '.content':

var destiny = document.getElementsByClassName('content');
var destinyY = destiny[0].offsetTop;
scrollTo(document.body, destinyY, 200);

function scrollTo(element, to, duration) {
    if (duration <= 0) return;
    var difference = to - element.scrollTop;
    var perTick = difference / duration * 2;

    setTimeout(function() {
        element.scrollTop = element.scrollTop + perTick;
        scrollTo(element, to, duration - 2);
    }, 10);
};

【问题讨论】:

  • 如果可能在纯 css 中更好!

标签: javascript firefox cross-browser


【解决方案1】:

尝试使用这个:document.documentElement.scrollTop。如果我是正确的,document.body.scrollTop 已弃用。

更新

似乎 Chrome 不配合答案,按照 cmets 中@Nikolai Mavrenkov 的建议安全使用:

window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0

现在应该涵盖所有浏览器。

【讨论】:

  • 太棒了。此解决方案适用于 Firefox,因此我将在 Firefox 上加载时添加一个 if 条件。谢谢
  • 我已经确认这也解决了我的问题。
  • 它不适用于 Chrome。使用window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0更安全
  • @NikolaiMavrenkov 谢谢,我更新了我的答案。我认为 Chrome 也应该被覆盖,但似乎他们仍然不会遵守其他的 ;)
  • @Michelangelo 在我的网站上没有工作,不知道为什么。
【解决方案2】:

除了使用 IF 条件之外,还有更简单的方法可以通过使用类似这样的逻辑表达式来获得正确的结果。

var bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop;

默认情况下,这两个部分都返回零,因此当您的滚动处于零位置时,这将按预期返回零。

bodyScrollTop = 0 || 0 = 0

在页面滚动时,其中一个部分将返回零,另一个将返回大于零的数字。归零值评估为 false,然后逻辑 OR || 将采用另一个值作为结果(例如,您的预期 scrollTop300)。

类似 Firefox 的浏览器会将此表达式视为

bodyScrollTop = 300 || 0 = 300

其他浏览器见

bodyScrollTop = 0 || 300 = 300

这再次给出了相同且正确的结果。

事实上,这都是关于something || nothing = something :)

【讨论】:

  • 这正是我想要的。
  • 感谢您的解释!真正帮助人们,包括我自己
  • @John_911 这是 StackOverflow 的主要目的 ;)
【解决方案3】:

标准是document.documentElement,供FF和IE使用。

WebKit 使用 document.body 并且无法使用该标准,因为如果他们更改为标准,则会抱怨向后兼容性,这篇文章很好地解释了它

https://miketaylr.com/posts/2014/11/document-body-scrolltop.html

WebKit 现在支持的文档上有一个新属性

https://developer.mozilla.org/en/docs/Web/API/document/scrollingElement

所以这会让你找到正确的元素

var scrollingElement = document.scrollingElement || document.documentElement;
scrollingElement.scrollTop = 100;

还有一个 polyfill

https://github.com/mathiasbynens/document.scrollingElement

【讨论】:

  • 我已经在我的代码中插入了提到的 polyfill 并将 document.body.scroll* 替换为 document.scrollingElement.scroll*,它在 OS X 上的 Chrome 52 和 Firefox 43 中运行良好。谢谢 Anthony
猜你喜欢
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 2012-10-08
  • 2015-03-14
  • 2018-10-15
  • 2014-08-09
相关资源
最近更新 更多