Chrome下,多次操作DOM引起的浏览器渲染问题

发布于 2022-09-03 00:28:54 字数 1278 浏览 13 评论 0

小弟不才,还请高人指点。情况是这样的:

我在工作的时候遇到一个问题:新增&并插入了一个dom节点,没有触发其它区域的重绘。没有触发table区域的Composite Layers?

正常情况如下图:
图片描述

异常情况如下图:
图片描述

出现异常的原因是这样的:
我在原有的DOM节点,通过jQueryprepend方法,插入了一块新的dom片段,好像没有正常触发浏览器重绘。导致出现了这个问题。代码如下:

Labor.prototype._onLoaded_overview = function () {
    var self = this;

    // 如果使用setTimeout,做一个延迟处理,100%会出现上图Bug
    // setTimeout(function () {
        self.root.prepend(overviewTpl.render(self.data.overview));
    // }, 500);

    // 由于代码不好,有bug, 需要有一个触发表格重绘动作
    // 原因: _onLoaded_overview与_onLoaded_detail会同时增加dom节点, 而引起一个很怪异的bug
    // 若想重现这个bug, 可注释一下这行代码, 启用setTimeout
    // this.root.find('.labor-table').css({opacity: 0.99});
};

有没有什么相关的资料(博文、书籍等)可以学习研究的?

感觉是,已经Layout、Paint成功了,但是Composite(合并渲染)的时候出现了问题?
感觉出现这种问题总是跟 table 有关?

问题我其实已经解决了,但是不知道根本原因。
解决办法1:JS代码中使用opacitytransform:translateZ(0)触发Composite Layers。
解决办法2:CSS中使用transform:translateZ(0),让table使用Layer Mode

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文