页面优化——重绘和回流[通俗易懂]

页面优化——重绘和回流[通俗易懂]一、写在前面页面优化在面试的过程中经常遇到的问题,今天就来总计一下重绘和回流的问题。二、重绘和回流是什么我们都知道一个页面从加载到完成,首先是构建DOM树,然后根据DOM节点进行几何布局形成render树(渲染树),当渲染树构建完成后,页面就根据DOM树开始布局,渲染树也根据设置的样式渲染这些节点。在这一过程中,比如我们删除DOM节点,修改一个元素的宽高,页面布局发生变化,DOM树也发生变化,那么肯定要重新构建DOm树,而DOM树和渲染树紧密相连,DOM树渲染完了,渲染树也会随之进行渲染,这个过程就

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

一、写在前面
页面优化在面试的过程中经常遇到的问题,今天就来总计一下重绘和回流的问题。
二、重绘和回流是什么
我们都知道一个页面从加载到完成,首先是构建DOM树,然后根据DOM节点进行几何布局形成render树(渲染树),当渲染树构建完成后,页面就根据DOM树开始布局,渲染树也根据设置的样式渲染这些节点。
在这一过程中,比如我们删除DOM节点,修改一个元素的宽高,页面布局发生变化,DOM树也发生变化,那么肯定要重新构建DOm树,而DOM树和渲染树紧密相连,DOM树渲染完了,渲染树也会随之进行渲染,这个过程就称为回流
在比如说,我们给一个元素修改颜色,这样的行为是不会影响页面的布局的,DOM树不会发生改变,但是颜色变了,渲染树得重新绘制,这就是重绘
所以说回流一定会触发重绘,重绘不一定触发回流。
题外话:
1、由于display:none的元素不在页面渲染,渲染树的构建不包含这些节点。但是visibilityhidden的元素会在渲染树中。因为displaynone会脱离文档流,visibility为hidden虽然看不到,但类似与透明度为0,其实还在文档流中,还是有渲染的过程。
2、尽量避免使用表格布局,当我们不给表格的td设置固定的宽度的时,一列的td的宽度会以最宽的td的宽作为渲染的标准,假设前几行的td在渲染时都渲染好了,结果下面的某行特别宽,table为了统一宽度,前几行的td会回流重新计算宽度,这是一个比较耗时的操作。
三、怎么样减少回流
回流会重构DOM树,渲染树也得重新渲染,比较麻烦,哪些行为可以引发回流,如何去避免呢?
1、DOM的删除行为
比如删除某个节点,或者给父元素插入子节点,这类操作都会触发回流。如果我们插入多个子节点的话,可以使用documentfragment
2、几何属性的变化
比如说元素的宽度变了,border变了,字体大小变了,这种直接会引发页面的布局的改变,也会触发回流。如果我们需要改变多个属性,做好的是将这些改变定义在一个class中,直接修改class名,这样只会触发一次回流。
3、元素的位置发生改变
修改一个元素的左右margin,padding之类的操作,所以在元素位移的动画,不要更改margin之类的值,使用定位脱离文档流后进行改变位置。
4、获取文章的偏移量之类的属性
例如我们需要获取scrollTop、scrollLeft、scrollWidth、offsetTop、offsetLeft、offsetWidth、offsetHeight之类的属性的时候,浏览器为了保证值的正确性也会回流进行获取,所以如果你要不多次操作,最好取完进行缓存。
5、页面初次渲染触发回流
页面的初次渲染触发回流这样无法避免。
6、浏览器窗口尺寸的改变
resize事件的发生也会触发回流。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/219131.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • springboot实现拦截器_spring拦截器和过滤器

    springboot实现拦截器_spring拦截器和过滤器集成拦截器登录验证为例添加拦截器public class LoginInterceptor implements HandlerInterceptor { private Logger log = LoggerFactory.getLogger(getClass()); //Controller逻辑执行之前 @Override public boolean preHandle(HttpServletRequest request, HttpServletRe

  • 计算机机房装修规范_设备机房设计规范

    计算机机房装修规范_设备机房设计规范等级:文件732KB格式rar1.0.1本规范宗旨,修改原规范第1.0.1条。  采暖、通风与空调工程是基本建设领域中一个不可缺少的组成部分,它对改善劳动条件、提高生活质量、合理利用和节约能源及资源、保护环境、保证产品质量以及提高劳动生产率,都有着十分重要的意义。本次规范修订从节能、环保、安全、卫生等方面结合了近十年来国内外出现的新技术、新设备、新材料与设计、科研新成果,对有关设计标准、技术…

  • chmod修改权限的用法

    一、chmod作用:修改文件、目录的权限二、语法:chmod[对谁操作][操作符][赋予的权限]文件名三、操作对象:u用户user,表现文件或目录的所有者g用户组group,表现文件或目录所属的用户组o其他用户other…

  • Pandas一键爬取解析代理IP与代理IP池的维护

    Pandas一键爬取解析代理IP与代理IP池的维护本文的目标是至少演示如下技术:1.pandas超简代码带请求头解析表格2.查看访问IP的方法3.搭建简易检验代理Ip的网站4.Redis数据库的基本操作5.代理ip在request库中的使用方法6.Timer定时器的使用7.Redis图形化工具的使用介绍…

    2022年10月25日
  • loading 遮罩层

    JS代码片段//数据请求方法vardom=$(“#loading”).length;if(!dom){$(“body”).append(“

    “);}$(“#loading”).show();//开始请求………//如果正常$(“#loading”).hide();对应的CSS设置#loading{

  • C# 定时执行方法

    C# 定时执行方法定时执行某个方法privatevoidbutton1_Click(objectsender,EventArgse){System.Timers.Timertimer=newSystem.Timers.Timer();timer.Enabled=true;timer.Inter…

  • 发表回复

    您的电子邮箱地址不会被公开。

    关注全栈程序员社区公众号