话说,这个问题我们得从浏览器得渲染机制说起:

我们先来理解一下 重绘(Repainit)和 回流(Reflow):

重绘:当节点需要更改外观而不会影响布局得,比如改变 color 就称为重绘;

回流:布局或者几何属性需要改变就称为回流(换个说辞即是需要重新渲染Dom节点);

回流必定会发生重绘,重绘不一定会引发回流。回流所需得成本比重绘高得多,改变父节点里得子节点很可能会导致父节点得一系列回流。

以下几个动作可能会导致性能问题:

①.改变window大小;

②.改变字体;

③.添加或删除样式;

④.文字改变;

⑤.定位或者浮动;

⑥.盒模型;

通过查看HTML文档,学习到,重绘和回流其实也和 Eventloop 有关,为了系统学习,现摘录如下:

1.当 Eventloop 执行完 Microtasks 后,会判断 document 是否需要更新,因为浏览器是 60Hz 得刷新率,每 16.6 ms 才会更新一次;

2.然后判断是否有 resize 或者 scroll 事件,有的话会去触发事件,所以 resize 和 scroll 事件也是至少 16 ms 才会触发一次,并且自带节流功能;

3.判断是否触发了 media query;

4.更新动画并且发送事件;

5.判断是否有全屏操作事件;

6.执行 requestAnimationFrame 回调;

7.执行 IntersectionObserver 回调,该方法用于判断元素是否可见,可以用于懒加载上,但是兼容性不好;

8.更新界面;

9.以上就是一帧中可能会做的事情。如果在一帧中有空闲事件,就会去执行requestIdleCallback 回调;

综上可知,重绘和回流会影响页面性能,那么在实际开发中我们如何来尽量减少性能的损耗呢,如下:

使用transform后,页面的回流直接没有了,这就是使用transform性能更好的原因,如果我们使用定时器频繁改变 top 的时候,效果就会十分明显,其实在 css 类似的属性还有很多,这里只是以 transform 作为切入点进行讲解,其他优化的策略还有:

- opacity替代visibility ;

- 多个DOM统一操作(虽然 V8 会有缓存优化);

- 先将DOM离线,即 display:none;修改后显示;

- 不要把DOM放在已有循环中作为循环变量;

- 不要使用table;

深入理解为什么应该使用transform来替代top的更多相关文章

  1. CSS3 Transform变形理解与应用

    CSS3 Transform变形理解与应用 Transform:对元素进行变形:Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.但只有两个关键贞.开 ...

  2. z-index和transform

    z-index和transform是CSS中的属性,但很少同学将二者联系到一起,感觉他们八杆子打不上.事实真的是这样吗?如果你也不能确认,这篇文章就值得你花点时间阅读.因为阅读完了,你会有所收获的. ...

  3. [译]IOS中AutoLayout布局与Transform的冲突问题

    http://m.blog.csdn.net/blog/a345017062/43565279 原文链接见这里: http://stackoverflow.com/questions/12943107 ...

  4. z-index和transform,你真的了解吗?

    z-index和transform是CSS中的属性,但很少同学将二者联系到一起,感觉他们八杆子打不上.事实真的是这样吗?如果你也不能确认,这篇文章就值得你花点时间阅读.因为阅读完了,你会有所收获的. ...

  5. Canvas transform浅析

    没有前奏,直接进入主题 transform调用方法: ctx.transform(a,b,c,d,e,f);如下 var ctx = document.getElementById("myC ...

  6. U3D Transform用法

    最近在学习unity3d,下面对Transform类做一个小结 一.常用属性和方法 1.1 常用属性: 用代码展示一下上面的一些属性,值得注意的是myCube是mySphere的父物体 using U ...

  7. Hough变换-理解篇

    Hough变换-理解篇 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体.该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符 ...

  8. Transform.eulerAngles 欧拉角

    var eulerAngles : Vector3 Description描述 The rotation as Euler angles in degrees. 旋转作为欧拉角度. The x, y, ...

  9. 高性能Web动画和渲染原理系列(3)——transform和opacity为什么高性能

    示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址:[你要的前端打怪升级指南] [T ...

随机推荐

  1. cvCreateImage

    CvCreateImage函数说明 cvCreateImage是openCV中的一个函数.OpenCV是Intel公司支持的开源计算机视觉库.   cvCreateImage:   创建头并分配数据 ...

  2. Virtualbox的centos7 nat和桥接网络配置

    在实际配置虚拟机的过程中,网络配置时候一个很繁琐的过程,经常一个点没注意到,就访问不了了.在此,做一个简单的教程以供后续使用时可以参考! 方法一: 使用NAT网络 1. 选择网卡 安装centos7的 ...

  3. Scala学习笔记——样本类和模式匹配

    1.样本类 在申明的类前面加上一个case修饰符,带有这种修饰符的类被称为样本类(case class). 被申明为样本类的类的特点:1.会添加和类名一致的工厂方法:2.样本类参数列表中的所有参数隐式 ...

  4. java.security.ProviderException: java.security.KeyException

    本机部署没问题,部署到linux服务器报错: javax.net.ssl.SSLException: java.security.ProviderException: java.security.Ke ...

  5. Python下载安装

    https://www.python.org/downloads/ https://www.editplus.com/ftp/epp510_1828.exe  EditPlus 5.1

  6. DBeaver连接达梦数据库

    1.连接类型选择ODBC. 2.编辑驱动设置: 1)Class Name:dm.jdbc.driver.DmDriver 2)URL Template:jdbc:dm://{dbserver}/{da ...

  7. SVM 核方法

    在 SVM 中引入核方法便可使得 SVM 变为非线性分类器,给定非线性可分数据集 $\left \{ (x_i,y_i)\right\}_{i=1}^N$,如下图所示,此时找不到一个分类平面来将数据分 ...

  8. HTTP 响应状态码

    MDN https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status section 10 of RFC 2616 https://tools.ie ...

  9. Analytics.js简介

    analytics.js JavaScript代码段是一种可用于衡量用户与您网站的互动情况的全新方式.它与之前的跟踪代码ga.js类似,但为开发者自定义实现方案提供了更大的灵活性. analytics ...

  10. Docker容器集群管理之Swarm

    Docker容器集群管理主流方案 Swarm Docker公司自研发的集群管理系统. Kubernetes Google开源的一个容器集群管理系统,用于自动化部署.扩展和管理容器应用.也称为K8S ...