BFC 及其应用

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 重绘与回流是网页渲染过程中关键环节:重绘涉及更新元素视觉属性如颜色、背景等变化而不改变布局的情况;回流则是在元素大小、位置或布局发生变化时重新计算和更新整个页面布局的过程。为提升性能,应尽量减少强制同步的重绘和回流,采用CSS层叠、使用RAF(requestAnimationFrame)代替setTimeout和setInterval,将动画移至独立容器或使用GPU加速等方式优化。

一、重绘和回流的定义

  1. 回流(Reflow):也称为布局(Layout),当页面中的元素的尺寸、结构或者位置发生变化时,浏览器需要重新计算元素的几何属性,这个过程称为回流。例如,当窗口大小改变、元素的尺寸改变、添加或删除元素等情况发生时,都会触发回流。
  2. 重绘(Repaint):当页面中的元素的外观(如颜色、背景色、边框等)发生改变,但不影响元素的布局时,浏览器会重新绘制这个元素,这个过程称为重绘。

二、触发回流和重绘的情况

  1. 回流的触发情况:

    • 页面首次加载。
    • 浏览器窗口大小改变。
    • 元素的尺寸、位置发生改变(如通过 JavaScript 改变元素的宽度、高度、边距等)。
    • 元素内容发生变化(如文本内容改变或图片被替换)。
    • 添加或删除可见的 DOM 元素。
    • 激活 CSS 伪类(如:hover等)。
  2. 重绘的触发情况:

    • 元素的颜色、背景色、边框颜色等外观属性发生改变。
    • 文本内容的字体颜色、大小等属性发生改变。

三、优化重绘和回流的方法

  1. 避免频繁操作样式

    • 尽量减少通过 JavaScript 频繁地操作元素的样式。可以将多个样式的修改合并到一起,然后一次性应用到元素上。例如:
      ```javascript
      const element = document.getElementById('myElement');
      // 不好的做法
      element.style.backgroundColor = 'red';
      element.style.border = '1px solid black';
      element.style.marginTop = '10px';

    // 好的做法
    element.className = 'newStyle';
    `` 在好的做法中,通过修改元素的className`属性,将多个样式的修改合并到一个 CSS 类中,减少了对元素样式的频繁操作,从而减少回流和重绘的次数。

  2. 避免频繁读取和修改 DOM 属性

    • 频繁地读取和修改 DOM 属性会导致回流和重绘。如果需要读取和修改 DOM 属性,可以先将其存储在变量中,然后在合适的时候一次性应用。例如:
      ```javascript
      const element = document.getElementById('myElement');
      // 不好的做法
      for (let i = 0; i < 100; i++) {
      element.style.top = element.offsetTop + 1 + 'px';
      }

    // 好的做法
    let top = element.offsetTop;
    for (let i = 0; i < 100; i++) {
    top++;
    }
    element.style.top = top + 'px';
    `` 在好的做法中,先将元素的offsetTop属性存储在变量top中,然后在循环中修改这个变量,最后一次性将修改后的top值应用到元素的style.top`属性上,减少了对 DOM 属性的频繁读取和修改,从而减少回流和重绘的次数。

  3. 使用 CSS 动画代替 JavaScript 动画

    • CSS 动画通常比 JavaScript 动画更高效,因为浏览器可以对 CSS 动画进行优化,减少回流和重绘的次数。例如:
      ```css
      .animated-element {
      animation: myAnimation 2s ease-in-out;
      }

    @keyframes myAnimation {
    from {

    transform: translateX(0);
    

    }
    to {

    transform: translateX(100px);
    

    }
    }
    ```
    在上述代码中,使用 CSS 动画将元素从左侧平移到右侧,浏览器可以对这个动画进行优化,减少回流和重绘的次数。

  4. 使用文档碎片(DocumentFragment)

    • 当需要添加大量的 DOM 元素时,可以先将这些元素添加到文档碎片中,然后一次性将文档碎片添加到页面中,这样可以减少回流和重绘的次数。例如:
      const fragment = document.createDocumentFragment();
      for (let i = 0; i < 100; i++) {
             
      const element = document.createElement('div');
      element.textContent = 'New Element';
      fragment.appendChild(element);
      }
      document.getElementById('container').appendChild(fragment);
      
      在上述代码中,先创建一个文档碎片,然后在循环中创建 100 个div元素并添加到文档碎片中,最后将文档碎片一次性添加到页面中的container元素中,减少了回流和重绘的次数。
  5. 避免使用 table 布局

    • table布局的回流和重绘成本比较高,因为浏览器需要对整个表格进行重新布局。如果可能的话,尽量使用divCSS布局代替table布局。
  6. 对频繁操作的元素进行绝对定位或固定定位

    • 对频繁操作的元素进行绝对定位或固定定位,可以将其从文档流中移除,这样对其进行操作时不会影响其他元素的布局,从而减少回流的次数。但是需要注意,绝对定位或固定定位可能会影响页面的整体布局,需要谨慎使用。
  7. 使用虚拟 DOM

    • 虚拟 DOM 是一种在内存中模拟 DOM 树的技术,可以减少对真实 DOM 的操作次数,从而减少回流和重绘的次数。例如,React 和 Vue.js 等框架都使用了虚拟 DOM 技术。
相关文章
|
2天前
|
前端开发 开发者 容器
BFC 及其应用详解
BFC(Block Format Context),即块级格式化上下文,是CSS中一种重要的布局方式,它能够解决浮动元素带来的问题,如元素塌陷等。通过触发BFC,可以将元素布局限制在一个独立的容器内,避免与外部元素相互影响。适用于需要对元素进行精确控制的场景。
|
5月前
|
前端开发
Margin - 单边外边距属性
Margin - 单边外边距属性。
28 1
|
前端开发 容器
BFC
准面试题,这里简洁阐述了,帮助快速复习、加深记忆
88 2
BFC
|
5月前
|
容器
BFC 是什么
BFC 是什么
59 0
|
前端开发 容器
浅谈BFC
浅谈BFC
71 1
|
前端开发 容器
【对BFC的详解】
【对BFC的详解】
|
前端开发
BFC是什么?怎么触发BFC?
BFC是“块级格式化上下文”的缩写,是一个独立的渲染区域,内部的元素按照一定规则进行布局,不会影响到外部元素的布局。BFC主要用于解决一些常见的布局问题,例如清除浮动、防止 margin 重叠等。
|
前端开发 容器
浅谈BFC
大家好,我是 CoderBin,本文讲给大家分享 CSS 中关于 BFC 的相关内容,如果文中有任何不对的地方欢迎在评论区留言指正,如果对同学们有帮助的欢迎点赞收藏,你们的支持就是我最大的动力,谢谢🌻
130 1
浅谈BFC
|
前端开发 JavaScript
了解BFC特性,轻松实现自适应布局
BFC(Block Formatting Context)俗称块级格式上下文,初次看到这词似乎有点不是很理解,通俗解释就是一个独立区域决定了内部元素的排放,以及内部元素与外部元素的相互作用关系
135 0
了解BFC特性,轻松实现自适应布局
|
前端开发
盒子模型 边框border 外边距 内边距
盒子模型 边框border 外边距 内边距
245 0
盒子模型 边框border 外边距 内边距