代码之家  ›  专栏  ›  技术社区  ›  Morgan Cheng

什么时候在DOM环境中发生回流?

  •  50
  • Morgan Cheng  · 技术社区  · 15 年前

    什么样的活动会触发使用dom的网页回流?

    似乎有不同的观点。根据 http://www.nczonline.net/blog/2009/02/03/speed-up-your-javascript-part-4/ 它发生了

    • 添加或删除一个DOM节点时。
    • 动态应用样式时(例如element.style.width=“10px”)。
    • 当检索必须计算的度量值时,例如访问offsetwidth、clientheight或任何计算的css值(通过符合DOM的浏览器中的getComputedStyle()或IE中的currentStyle)。

    但是,根据 http://dev.opera.com/articles/view/efficient-javascript/?page=3 ,仅当已经有回流操作排队时,采用测量触发回流。

    有人有更多的想法吗?

    3 回复  |  直到 14 年前
        1
  •  45
  •   coderjoe    15 年前

    两篇文章都是正确的。 我们可以安全地假设,每当您做一些合理地需要计算DOM中元素的维度的事情时,都会触发回流。

    另外,据我所知,这两篇文章都说了同样的话。

    第一篇文章说回流发生在:

    当你 检索必须计算的度量值 ,例如访问 偏移宽度 , 优先权 或任何计算的css值(通过 getComputedStyle()。 在与dom兼容的浏览器或ie中的currentstyle中),当dom更改排队等待进行时。

    第二条规定:

    如前所述,浏览器可能会为您缓存多个更改,并且在所有这些更改都进行之后,只会重新显示一次。但是,请注意 对元件进行测量将迫使其回流。 ,以便测量结果正确。这些变化可能会被重新粉刷,也可能不会被重新粉刷,但回流本身仍然必须在幕后发生。

    当使用如下属性进行测量时,就会产生这种效果 偏移宽度 或者使用类似的方法 getComputedStyle(getComputedStyle) . 即使不使用这些数字,只要在浏览器仍在缓存更改时使用这些数字中的任何一个,也足以触发隐藏的回流。如果重复进行这些测量,则应考虑只进行一次测量,并存储结果,然后再使用。

    我认为这和他们之前说的一样。Opera将尽其最大努力缓存值,并避免回流,但您不应该依赖它的能力。

    无论出于何种目的,只要相信他们所说的,当他们说这三种类型的交互作用都会引起回流。

    干杯。

        2
  •  3
  •   Kevin Hakanson    14 年前

    查看的“属性读取访问触发的渲染”部分 Understanding Internet Explorer Rendering Behaviour ,其中IE中的以下代码将导致呈现活动。

    function askforHeight () {
      $("#lower").height();  
    }
    
        3
  •  1
  •   I.devries    15 年前
    document.body.style.display = 'none';
    document.body.style.display = 'block';
    

    这通常可以解决那些无法理解的布局错误。