【发布时间】:2014-03-16 19:21:33
【问题描述】:
我在 div 元素上有一个滚动条。
在许多浏览器上(我在 MacOS 和 Linux 上的最新版本的 Chrome 和 Firefox 上对此进行了测试),似乎浏览器确保在滚动重绘触发之前调用绑定到 onscroll 的代码。
换句话说,以下小提琴在滚动http://jsfiddle.net/m2E65/1/时不会闪烁也不闪烁:
var onscroll = function() {
var y = $("#container").scrollTop() + 30;
var z = 0
for (var c=0; c<y*10000; c++) {
z+=c;
}
$("#label").text("bocal : "+z);
$("#label").css("top", y);
};
$('#container').scroll(onscroll);
但是在 Ubuntu 上的 Linux Chromium v28 上,它确实会闪烁。几乎就像我们使用 setTimeout (http://jsfiddle.net/m2E65/2/) 推迟 onscroll 一样糟糕:
$('#container').scroll(function() {
window.setTimeout(onscroll, 0);
});
在同一个浏览器上,即使使用http://jsfiddle.net/m2E65/4/ 中的 requestAnimationFrame 也会同样严重闪烁(见下文)
var onscroll = function() {
var y = $("#container").scrollTop() + 30;
var z = 0
for (var c=0; c<y*10000; c++) {
z+=c;
}
$("#label").text("bocal : "+z);
$("#label").css("top", y);
window.requestAnimationFrame(onscroll);
};
window.requestAnimationFrame(onscroll);
我的问题是:
- 有这方面的规范吗?
- 有没有办法确保在所有浏览器上,代码都会在重绘之前运行?
- 奖励点:这种行为有多罕见?
【问题讨论】:
-
在ubuntu下其他网站看到这个闪烁了吗?这可能是您的显卡的垂直同步问题?
-
通过闪烁,我的意思是我有时会看到文本在不同的地方出现 1 帧(如果我上升,则会降低)。我不认为显卡在这里有问题。也许是 Wayland + 铬的组合?
-
如果有人给我一个指向任何类型规范的指针,我很高兴...我找不到任何说明 onscroll / paint 应该如何交互的内容。
标签: javascript dom scroll browser