【发布时间】:2019-03-06 21:12:57
【问题描述】:
如果我们做一个简单的测试用例:
document.documentElement.addEventListener('scroll', function() {
console.log(document.documentElement.scrollTop);
});
然后通过点击轨道使用滚动条进行滚动,或者使用PageDown/PageUp,那么我们可以看到在滚动动画结束时我们只得到一个事件。
现在理论上我可以通过模拟滚动事件来修复一些这种行为。带有 jQuery 和下划线的示例代码:
$(function () {
var $document = $(document), until = 0;
var throttleScroll = _.throttle(function () {
$document.scroll();
if (+new Date < until) {
setTimeout(throttleScroll, 50);
}
}, 50);
$document.keydown(function (evt) {
if (evt.which === 33 || evt.which === 34) {
until = +new Date + 300;
throttleScroll();
}
});
});
但它仍然不起作用。我们只获取原始scrollTop 和目标scrollTop 的滚动事件,两者之间没有值。
如果然后每 10 毫秒去一次 console.log(document.documentElement.scrollTop),那么我们可以看到 IE 在滚动时不会更新 scrollTop。
如果我们想将某些东西“固定”到滚动位置,这是非常令人沮丧的。使用 IE 会变得生涩。
我没有在任何其他浏览器上观察到这种行为,也没有使用以前的 IE 版本进行测试。
如果有人找到了修复 IE 行为的方法(也许有一个神奇的 CSS 可以关闭 IE 11 中的平滑滚动?)那么我非常想听听!
谢谢:-)
【问题讨论】:
-
没什么啊?是这样想的。
-
这是旧的,但我遇到了完全相同的问题。我尝试使用 setInterval 并强制该函数以 60fps 的速度更新,但这只是让它在所有浏览器上都明显抖动。另外,它似乎对 IE 没有影响:\
-
经过一番折腾,我发现最好的解决方法是尽可能使用
position:fixed,而不是手动使用position:absolutetop。这绝对是 IE 中的渲染错误。在禁用平滑滚动的情况下,它并没有表现得那么多,但它仍然有些生涩。另外,平滑滚动默认是开启的,所以几乎所有的 IE 用户都会注意到这个问题。 -
我的问题不在于固定元素,而在于虚拟表......滚动时您无法呈现新单元格。 IE,像往常一样,糟透了。即使在 10 个版本之后。
-
“我没有在任何其他浏览器上观察到这种行为” - iOS Safari 从它首次发布之日起就一直如此。我怀疑 IE 团队认为,如果这能给他们带来性能优势,他们可以效仿这个先例。 Android Chrome 相当频繁地发送滚动事件,但不足以消除抖动。
标签: javascript jquery internet-explorer underscore.js