聊天室源码前端渲染回流与重排问题以及优化方案

前言

今天一起看一下聊天室源码前端是如何渲染页面的,并看一下修改代码会对页面渲染带来的影响,带着问题一起寻找优化的方案~

一、聊天室源码前端是如何进行界面渲染的?

不同的渲染引擎的具体做法稍有差异,但是大体流程都是差不多的,下面以 chrome渲染引擎 的 渲染流程来说明:
在这里插入图片描述

上图展示的流程是:

1、获取 HTML ⽂件并进⾏解析,生成一棵 DOM 树(DOM Tree)

2、解析 HTML 的同时也会解析 CSS,⽣成样式规则(Style Rules)

3、根据 DOM 树和样式规则,生成一棵渲染树(Render Tree)

4、进行布局(Layout)(重排),即为每个节点分配⼀个在屏幕上应显示的确切坐标位置

5、进⾏绘制(Paint)(重绘),遍历渲染树节点,调⽤ GPU(图形处理器) 将元素呈现出来

二、聊天室源码前端渲染的重绘(repaint)和重排(回流reflow)是什么?

1. 重排

重排是指部分或整个渲染树需要重新分析,并且节点的尺⼨需要重新计算。
表现为 重新⽣成布局,重新排列元素。

2. 重绘

重绘是由于聊天室源码节点的⼏何属性发⽣改变,或由于样式发⽣改变(例如:改变元素背景⾊)。
表现为某些元素的外观被改变。或者重排后, 进行重新绘制!

3. 两者的关系

重绘不⼀定会出现重排,重排必定会触发重绘。

聊天室源码每个页面至少需要一次回流+重绘。(初始化渲染)
重排和重绘的代价都很⾼昂,频繁重排重绘, 会破坏⽤户体验、让界面显示变迟缓。
我们需要尽可能避免频繁触发重排和重绘, 尤其是重排

4. 何时会触发重排?

  • 添加或者删除可见的DOM元素;
  • 元素位置改变;
  • 元素尺寸改变——边距、填充、边框、宽度和高度
  • 聊天室源码内容改变——比如文本改变或者图片大小改变而引起的计算值宽度和高度改变; 页面渲染初始化;
    -前端窗口尺寸改变——resize事件发生时;

三、如何优化聊天室源码前端页面渲染性能?

站在重绘重排角度, 我们应该如何优化页面渲染性能呢?

主要有几大方式来避免:

  • 集中修改聊天室源码样式 (这样可以尽可能利用浏览器的优化机制, 一次重排重绘就完成渲染)
  • 尽量避免在遍历循环中, 进行元素 offsetTop 等样式值的获取操作, 会强制浏览器刷新队列, 进行渲染
  • 利用 transform 实现动画变化效果, 去代替 left top 的变换 (轮播图等) transform变换, 只是视觉效果!
    不会影响到其他盒子, 只触发了自己的重绘
  • 使用文档碎片(DocumentFragment)可以用于批量处理, 创建元素

1.文档碎片
documentFragment是一个保存多个元素的容器对象(保存在内存)当更新其中的一个或者多个元素时,聊天室源码页面不会更新。
当documentFragment容器中保存的所有元素操作完毕了, 只有将其插入到页面中才会更新页面。
代码如下(示例):

<ul id="box"></ul>

<script>
  let ul = document.getElementById("box")
  for (let i = 0; i < 20; i++) {
    let li = document.createElement("li")
    li.innerHTML = "index: " + i
    ul.appendChild(li)
  }


  // let ul = document.getElementById("box")
  // let fragment = document.createDocumentFragment()
  // for (let i = 0; i < 20; i++) {
  //     let li = document.createElement("li")
  //     li.innerHTML = "index: " + i
  //     fragment.appendChild(li)
  // }
  // ul.appendChild(fragment)
</script>

vue底层渲染更新, 就用了 document.createDocumentFragment

总结

以上便是聊天室源码前端渲染回流与重排问题以及优化方案的全部内容,希望能给大家带来帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值