浏览器运行原理与DOM的重绘和回流

从用户在浏览器地址栏输入网址,到看整个页面,中间发生了那些事情?

  • HTTP请求阶段
  • HTTP响应阶段
  • 浏览器渲染阶段

关键词

  • 进程(Process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
  • 线程(Thread):是操作系统能够进行运算调度的最小单位。
  • 栈内存(Stack):在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配

运行过程图解:

DOM的重绘和回流Repaint & Reflow

  • 重绘:元素样式的改变(但宽高、大小、位置等不变)

    如 outline,visibility,color,background-color等

  • 回流:元素的大小或位置发生了变化(当页面布局和几何信息发生变化的时候),触发了重新布局,导致渲染树重新计算布局和渲染

注意:回流一定会触发重绘,而重绘不一定回流

性能优化:

  1. 减少HTTP的请求次数和大小

    • 资源合并压缩
    • 图片懒加载
    • 音视频走流文件
  2. 避免DOM的回流

    • 放弃传统操作dom的时代,基于vue/react开始数据影响视图模式

      mvvm/mvc/virtual dom/dom diff …

    • 分离读写操作(现代浏览器都有渲染队列机制)

      offsetTop、offsetLeft、offsetWidth、offsetHeight、clientTop、clientLeft、clientWidth、clientHeight、scrollTop、scrollLeft、scrollWidth、scrollHeight、getComputedStyle、currenStyle…会重新渲染队列。

    • 样式集中改变

      div.style.cssText = 'width:20px;height:20px;'
      div.className = 'box';
      
    • 缓存布局信息

      div.style.left = div.offsetLeft + 1 + 'px';
      div.style.Top = div.offsetTop + 1 + 'px';
      //改为
      var curLeft = div.offsetLeft;
      var curTop = div.offserTop;
      div.style.left = curleft + 1 + 'px';
      div.style.top = curTop + 1 + 'px';
      
    • 元素批量修改

      文档碎片:createDocumentFragment

      模板字符串拼接

      let str = ``;
      for(let i=0;i<5;i++){
      	str+=`<li>${i}<\li>`
      }
      box.innerHTML=str;
      
    • 动画效果应用到position属性为absolute或fixed的元素上(脱离文档流)

    • CSS3硬件加速(GPU加速)

      transform、opacity、filters…

    • 牺牲平滑换取速度

    • 避免table布局和使用css的JavaScript表达式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值