由于提前重绘,Safari 9.0.3 在 window.scrollTo() 上出现闪烁问题

Safari 9.0.3 flickering issue on window.scrollTo() due to a early repaint on the way

我在 Safari 中遇到了一个奇怪的行为。

在内容非常丰富的页面上,根据特定的用户操作(需要重新布局和替换页面上的元素),我几乎重建了整个文档,然后我调用 window.scrollTo() 将视口移动到计算好的点.

隔离问题我发现就在 window.scrollTo() 重绘发生之前(即使 JavaScript 仍在执行!)然后执行滚动导致闪烁。

文档首先以新布局显示,然后-一帧后-在新位置显示(以新布局)。

我探索了各种“Safari 闪烁”问题(和答案),但其中 none 涵盖了我遇到的问题。

所描述的行为显然是 Safari 的一个错误,因为在 JavaScript 执行终止之前,重绘必须 不会 发生。

网页有纯色背景。经过一些试验后,我发现使用图像而不是纯色作为背景可以解决问题

主要文档大小 <div> 有此背景 CSS 属性:

background: #eee;

将其替换为内联 png(具有相同颜色的小方块)

background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABlJREFUeNpifPfuHQMpgHFUw6iG4asBIMAAYmAssRRucYsAAAAASUVORK5CYII=") fixed repeat;

避免虚假重绘并消除闪烁。