【问题标题】:Is there a way to set the window's scroll position without using scroll() or scrollTo()?有没有办法在不使用 scroll() 或 scrollTo() 的情况下设置窗口的滚动位置?
【发布时间】:2011-02-28 08:09:00
【问题描述】:

...我问的原因是 Safari 在其 scroll() 的实现中有一个错误,它破坏了我的 UI。

想象一个页面:

<body>
    <div id="huge" style="width: 4000px; height: 4000px;"></div>
</body>

...这样您就可以获得水平和垂直滚动条。现在,通常当您按下滚动条时,页面会滚动(垂直)。出于我们花哨的 UI 的目的,我们不希望这种情况发生,所以我们压缩了 keyDown 事件:

window.onkeydown = function(e) {
    if(e.keyCode == 32)
    {
        return false;
    }
};

这很好用……除非我们决定不是完全阻止滚动,而是想要我们自己的自定义滚动行为:

window.onkeydown = function(e) {
    if(e.keyCode == 32)
    {
        window.scroll(foo, bar); // Causes odd behavior in Safari
        return false;
    }
};

在其他浏览器(Chrome、Firefox)中,这会立即将窗口的滚动位置移动到所需的坐标。但在 Safari 中,这会导致窗口动画到所需的滚动位置,类似于按空格键时发生的滚动动画。

请注意,如果您触发除空格键以外的任何键的滚动,动画不会发生;窗口会像在其他浏览器中一样立即滚动。

如果您碰巧滚动了 1000 像素或更多像素,那么动画滚动可能会引起一些严重的不适。

我正在挠头,试图找到解决这个问题的方法。我怀疑没有,但我希望这里的 Javascript 之神可以提出一些建议。我真的很想能够在这个命令中使用空格键。

【问题讨论】:

  • 您是否考虑过直接设置 Y 偏移量,而不是让 window.scroll 为您设置?我以这种方式在 Safari 中处理滚动,效果很好。我同意这不是一个原始的解决方案。
  • @Pete 我不确定你的意思。就像手动调整我的#huge div 的 Y 位置一样?还是别的什么?
  • huge.style.top = target_scroll_to.toString() + 'px';

标签: javascript safari scroll onkeydown


【解决方案1】:

如果您知道要滚动到文档中的哪个位置,则可以简单地使用命名锚点。将document.location 设置为锚点(例如#top#div50 或其他)应该非常可靠。

【讨论】:

  • 遗憾的是我需要使用像素坐标,但这是个好主意!我想我总是可以创建一个临时的、绝对定位的锚点,然后立即滚动到它...
【解决方案2】:

使用document.documentElement.scrollTop = ...(在某些浏览器中使用document.body)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多