由于提前重绘,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;
避免虚假重绘并消除闪烁。
我在 Safari 中遇到了一个奇怪的行为。
在内容非常丰富的页面上,根据特定的用户操作(需要重新布局和替换页面上的元素),我几乎重建了整个文档,然后我调用 window.scrollTo()
将视口移动到计算好的点.
隔离问题我发现就在 window.scrollTo()
重绘发生之前(即使 JavaScript 仍在执行!)然后执行滚动导致闪烁。
文档首先以新布局显示,然后-一帧后-在新位置显示(以新布局)。
我探索了各种“Safari 闪烁”问题(和答案),但其中 none 涵盖了我遇到的问题。
所描述的行为显然是 Safari 的一个错误,因为在 JavaScript 执行终止之前,重绘必须 不会 发生。
网页有纯色背景。经过一些试验后,我发现使用图像而不是纯色作为背景可以解决问题。
主要文档大小 <div>
有此背景 CSS 属性:
background: #eee;
将其替换为内联 png(具有相同颜色的小方块)
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAABlJREFUeNpifPfuHQMpgHFUw6iG4asBIMAAYmAssRRucYsAAAAASUVORK5CYII=") fixed repeat;
避免虚假重绘并消除闪烁。