事件循环中scroll事件未在requestAnimationFrame前触发是否符合规范?
结论
该现象属于完全符合规范的预期行为。
原因说明
- 你对规范的理解遗漏了核心前提:事件循环的更新渲染阶段本身并非每轮事件循环都会运行。浏览器会结合屏幕刷新率、页面可见状态、是否有待更新的渲染内容等条件,自主决定是否跳过当前轮次的更新渲染步骤。
- 你的测试用例中
stepTimeout设置为10ms,两次Step执行间隔短于主流60Hz屏幕的单帧间隔(约16.6ms),会出现多轮事件循环才触发一次更新渲染的情况。多轮对scrollTop/scrollLeft的修改会被合并,浏览器在更新渲染时只会基于最终的滚动位置触发一次scroll事件,中间未被渲染的滚动修改不会单独派发事件,就会出现你观测到的「部分轮次scroll事件未触发」的现象。 - 规范本身也允许浏览器合并连续的滚动变更,不需要对每一次滚动位置修改都单独派发
scroll事件,进一步降低了高频修改时的事件触发次数。
验证建议
你可以将stepTimeout修改为20ms(大于单帧间隔),重复测试后会发现几乎不会再出现scroll事件漏触发的情况。
// 调整参数后的测试调用 Test(200, 20);
内容的提问来源于stack exchange,提问作者Andrey Godyaev
相关产品推荐
相关产品推荐

