Javascript 回流和重新喷漆的替代方案

Javascript 回流和重新喷漆的替代方案,javascript,html,css,repaint,reflow,Javascript,Html,Css,Repaint,Reflow,我和其他人都知道,重新绘制和重新流动对于浏览器来说是非常昂贵的 我对CSS/JS替代品很感兴趣,它们可以重新绘制/显示:无和重新流动/可见性:隐藏,对浏览器的计算要求不高 为了清楚起见,如果我错了,请纠正我,一个常见的重新流动场景是在您要切换显示的元素上设置display:none,例如,下拉菜单。重新流动意味着浏览器首先“流动”,即,将元素和下面的所有内容显示为可见内容,但随后必须重新流动所有内容,因为下拉菜单需要隐藏 评论《再流动与再粉刷》的性能冲击是否真的是人们需要关心的事情也是受欢迎的。

我和其他人都知道,重新绘制和重新流动对于浏览器来说是非常昂贵的

我对CSS/JS替代品很感兴趣,它们可以重新绘制/
显示:无
和重新流动/
可见性:隐藏
,对浏览器的计算要求不高

为了清楚起见,如果我错了,请纠正我,一个常见的重新流动场景是在您要切换显示的元素上设置
display:none
,例如,下拉菜单。重新流动意味着浏览器首先“流动”,即,将元素和下面的所有内容显示为可见内容,但随后必须重新流动所有内容,因为下拉菜单需要隐藏


评论《再流动与再粉刷》的性能冲击是否真的是人们需要关心的事情也是受欢迎的。

我认为你误解了这一说法

如果动态生成元素,请考虑这两个ScNeNiS:

  • 生成一个元素,将其添加到DOM中。重复一遍
  • 首先创建一个DOMDocumentFragment。将元素添加到片段中。重复一遍。将片段添加到DOM中
  • 方法1将为添加的每个元素重新绘制。方法2在最后只执行一次重新绘制。如果您要添加的元素数量较少,那么方法1可能很好。如果要添加多个节点,则方法2的速度要快得多

    这就是所谓的重新油漆昂贵的意思


    也许这是一个很好的看待它的方式:


    重新油漆的基本成本为100英镑。创建DOM元素并附加它需要花费1美元。如果您对7个要素采用方法1,您的成本将为(1+100)*7=707。如果你在做方法2,你的成本是:1*7+100=107。这是相当低的。这些数字只是为了举例说明。可能不止这些,但我认为这是一种很好且简单的重新绘制性能的方法。

    我认为你误解了这一说法

    如果动态生成元素,请考虑这两个ScNeNiS:

  • 生成一个元素,将其添加到DOM中。重复一遍
  • 首先创建一个DOMDocumentFragment。将元素添加到片段中。重复一遍。将片段添加到DOM中
  • 方法1将为添加的每个元素重新绘制。方法2在最后只执行一次重新绘制。如果您要添加的元素数量较少,那么方法1可能很好。如果要添加多个节点,则方法2的速度要快得多

    这就是所谓的重新油漆昂贵的意思


    也许这是一个很好的看待它的方式:


    重新油漆的基本成本为100英镑。创建DOM元素并附加它需要花费1美元。如果您对7个要素采用方法1,您的成本将为(1+100)*7=707。如果你在做方法2,你的成本是:1*7+100=107。这是相当低的。这些数字只是为了举例说明。可能还有更多,但我认为这是一个很好的简单的方式来看待重新油漆的性能。

    没有简单的公式。首先,每个浏览器都有自己处理回流和重绘的方法。通常,浏览器会尽可能推迟回流,因为它们可能非常昂贵,正如您所知

    一般而言,请记住,以下操作始终会触发回流:

    • 通过附加、删除或移动节点来更改DOM树
    • 更改CSS计算属性,例如
      offsetWidth
    • 使用
      getComputedStyle
      (或旧IE上的
      currentStyle
      )读取计算的CSS值
    (见附件。)

    设置样式通常会导致回流,但如果更改不会影响其他元素的位置或尺寸,浏览器将尝试避免回流


    有关回流焊的一些乐趣,请参见没有简单的公式。首先,每个浏览器都有自己处理回流和重绘的方法。通常,浏览器会尽可能推迟回流,因为它们可能非常昂贵,正如您所知

    一般而言,请记住,以下操作始终会触发回流:

    • 通过附加、删除或移动节点来更改DOM树
    • 更改CSS计算属性,例如
      offsetWidth
    • 使用
      getComputedStyle
      (或旧IE上的
      currentStyle
      )读取计算的CSS值
    (见附件。)

    设置样式通常会导致回流,但如果更改不会影响其他元素的位置或尺寸,浏览器将尝试避免回流


    要了解回流的乐趣,请参见

    如果要更改显示内容,则需要回流并重新绘制至少一次。您所能做的最好的事情就是尽量减少回流次数,方法是不要在典型网页(例如,这里的Stackoverflow)上交替使用DOM更改和计算属性Reads,在开始看起来不稳定之前,想要使用的
    display:none的典型上限是多少?永久隐藏的DOM元素不会导致回流。伤害的是“删除这个元素。容器有多大?删除这个。它现在有多大?好的,也删除这个。现在怎么办?”问题是,如果一次删除多个元素,如果浏览器可以避免最后一次回流之外的所有回流,那么可能只会出现一次回流。我很确定这不应该是一个问题。看看浏览器能以多快的速度创建1000个div,使它们不可见,然后使它们再次可见:如果要更改显示内容,至少需要回流并重新绘制一次。你能做的最好的事情就是尽量减少回流次数,不要在一个典型的网页(例如,这里的Stackoverflow)上交替使用DOM更改和计算属性read,在它开始看起来不稳定之前,你想要使用的
    display:none
    的典型上限是多少?永久隐藏的DOM元素不会导致