图层

浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小,每个图层上有一个或多个节点

渲染 DOM 时 浏览器所做的:

  • 获取 DOM 后分割为多个图层
  • 对每个图层的节点计算样式结果 (Recalculate style--样式重计算)
  • 为每个节点生成图形和位置 (Layout--重排,回流)
  • 将每个节点绘制填充到图层位图中 (Paint--重绘)
  • 图层作为纹理上传至 GPU
  • 符合多个图层到页面上生成最终屏幕图像 (Composite Layers--图层重组)

图层创建条件

Chrome 中满足 以下任意情况 就会创建图层:

拥有 3D 变换的 css 属性 transform

加速视频解码的 <video> 节点

<canvas> 且浏览器硬件加速

css3 动画节点 animation

拥有 css 加速属性的元素 (will-change: transform; 记得取消为 auto )

重绘(Repaint)

指的是 一个元素外观的改变 而触发的浏览器行为

例如改变 outline、背景色等属性。浏览器会根据元素的新属性重新绘制

浏览器会根据元素的新属性对元素进行重新绘制,使元素呈现新的外观

重绘 不会伴随 重排,但是 重排 一定会 重绘

以图层为单位,如果图层中某个元素需要重绘,那么整个图层都需要重绘

重排(Reflow)

渲染对象 在创建完成并添加到渲染树时,并不包含位置和大小信息。计算这些值,称之为 重排

resize 时、修改网页默认字体时,操作 DOM 节点时,修改 css 样式时

获取某些属性时(width、height... ...)

优化方案:

减少 计算需要被加载到节点上的样式结果(Recalculate style--样式重计算)

减少 为每个节点生成图形和位置(Layout--回流和重布局)

减少 将每个节点填充到图层中(Paint Setup和Paint--重绘)

减少 组合图层到页面上(Composite Layers--图层重组)

元素位置的改变 使用 transform

使用 opacity + will-change: transform; 代替 visibility        单独使用 opacity 会重排、重绘; 结合图层后只会发生重绘

不使用  table 布局

将多次 css 操作,集合成一次 css 操作

多使用 class 修改样式

使用 display: none; 离线 DOM 元素,在一顿 css 操作以后,再 display: block 显示;

(vue 底层就是使用 documentFragment 来优化的)使用文档碎片 documentFragment

不要把某些 DOM 节点的属性 在循环里作为变量使用

给要动的元素,单独开一个图层

总结:

Reflow 的成本比 Repaint 的成本高得多的多。DOM Tree 里的每个结点都会有 reflow 方法

一个结点的 reflow 很有可能导致子结点,甚至父点以及同级结点的 reflow。

在一些高性能的电脑上也许还没什么,但是如果 reflow 发生在手机上,那么这个过程是非常痛苦和耗电的。

requestAnimationFrame

  • <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title>requestAnimationFrame</title> <style rel="stylesheet" type="text/css">
    body {
    width: 100%;
    color: #000;
    background: #96b377;
    font: 14px Helvetica, Arial, sans-serif;
    } a {
    text-decoration: none;
    color: green;
    } #test_box {
    width: 100px;
    height: 100px;
    background-color: red;
    }
    <style/>
    </head> <body> <div id="test_box" class="clearfix"></div> <!-- javascript 代码 -->
    <script type="text/javascript" src="./js/index.js">
    window.addEventListener("DOMContentLoaded", function(){
    var testBox = document.getElementById("test_box"); /**** requestAnimationFrame ****/
    var element = testBox;
    element.style.position = 'absolute'; var start = null;
    var offset = 0;
    var speed = 5;
    function step(timestamp) {
    if (!start){
    start = timestamp;
    };
    var progress = (timestamp - start)/speed;
    endPos = 500; // 元素不断向左移,最大不超过200像素
    offset = progress;
    if(parseInt(progress/endPos)%2 == 0){
    offset = progress%endPos;
    }else{
    offset = endPos - progress%endPos;
    }; element.style.left = offset%endPos + 'px'; // 如果距离第一次执行不超过 2000 毫秒,
    // 就继续执行动画
    //if (progress < 2000) {
    window.requestAnimationFrame(step);
    //};
    }; window.requestAnimationFrame(step);
    }, false);
    </script>
    </body>
    </html>

图层 & 重排 & 重绘的更多相关文章

  1. 优化CSS重排重绘与浏览器性能

    关于CSS重排和重绘的概念,最近看到不少这方面的文章,觉得挺有用,在制作中考虑浏览器的性能,减少重排能够节省浏览器对其子元素及父类元素的重新渲染:避免过分的重绘也能节省浏览器性能:优化动画,使用3D启 ...

  2. 关于DOM的操作以及性能优化问题-重绘重排

     写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...

  3. 高性能JavaScript 重排与重绘

    先回顾下前文高性能JavaScript DOM编程,主要提了两点优化,一是尽量减少DOM的访问,而把运算放在ECMAScript这一端,二是尽量缓存局部变量,比如length等等,最后介绍了两个新的A ...

  4. 高性能WEB开发:重排与重绘

    DOM编程可能最耗时的地方,重排和重绘. 1.什么是重排和重绘 浏览器下载完页面中的所有组件——HTML标记.JavaScript.CSS.图片之后会解析生成两个内部数据结构——DOM树和渲染树. D ...

  5. 前端性能优化--为什么DOM操作慢? 浅谈DOM的操作以及性能优化问题-重绘重排 为什么要减少DOM操作 为什么要减少操作DOM

    前端性能优化--为什么DOM操作慢?   作为一个前端,不能不考虑性能问题.对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩( ...

  6. css 重排与重绘

    css 重绘与重排 我们要知道当浏览器下载完页面的所有资源后,就会开始解析源代码. HTML 会被解析成 DOM Tree,Css 则会被渲染成 CSSOM Tree,最后它们会附加到一起,形成渲染树 ...

  7. js 重排和重绘

    1.什么是重排和重绘 浏览器下载完页面中的所有组件--HTML标记.JavaScript.CSS.图片之后会解析生成两个内部数据结构--DOM树和渲染树. DOM树表示页面结构,渲染树表示DOM节点如 ...

  8. JS学习笔记:(二)回流和重绘

    在搞清楚回流和重绘的概念之前,我们要清除浏览器的渲染过程. 解析生成DOM Tree(此时包含所有节点,包括display:none); 根据CSS Object Module(CCSSOM)计算节点 ...

  9. CSS重排和重绘

    一.什么是重绘Repaint和重排 (回流 reflow) 重绘:当元素的一部分属性发生改变,如外观.背景.颜色等不会引起布局变化,只需要浏览器根据元素的新属性重新绘制 ,使元素呈现新的外观叫做重绘. ...

随机推荐

  1. DirectX11--深入理解HLSL常量缓冲区打包规则

    HLSL常量缓冲区打包规则 DirectX11 With Windows SDK完整目录 欢迎加入QQ群: 727623616 可以一起探讨DX11,以及有什么问题也可以在这里汇报. 尽管打包规则并不 ...

  2. PyQt5之布局管理

    目录 一 写在开头 1.1 本文内容 二 绝对布局 三 布局类 3.1 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout) 3.2 水平布局和垂直布局实例 3.3 网格布局(QGr ...

  3. 淘宝网站上的 HTTP 缓存问题两则

    在阅读本文前推荐你先阅读我的前两篇文章< 扼杀 304,Cache-Control: immutable>和<关于缓存和 Chrome 的“新版刷新”>:下面要说的两个问题是在 ...

  4. ST表学习笔记

    ST表是一种利用DP思想求解最值的倍增算法 ST表常用于解决RMQ问题,即求解区间最值问题 接下来以求最大值为例分步讲解一下ST表的建立过程: 1.定义 f[i][j]表示[i,i+2j-1]这个长度 ...

  5. PYthon3:函数实现“自动售卖机”功能

    题目: 自动贩卖机: # 只接受1元.5元.10元的纸币或硬币,可以1块,5元,10元.# 饮料只有橙汁.椰汁.矿泉水.早餐奶,售价分别是3.5,4,2,4.5# 写一个函数用来表示贩卖机的功能:用户 ...

  6. java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or.....

    1,<activity android:name=".DialogActivity" android:theme="@android:style/Theme.Dia ...

  7. 设计模式七: 策略(Strategy)

    简介 策略属于行为型模式的一种,策略模式允许对象的行为或算法在运行时改变,使用不同的算法达成相同的结果或目的. 实现层面上,定义一个抽象的算法接口, 然后根据具体算法的不同定义不同的类去实现该接口, ...

  8. hadoop与hbase对应的支持版本

    官网信息:http://hbase.apache.org/book.html#java JDK的对应关系: 用jdk1.8+hadoop2.7.4/hadoop2.7.6+zookeeper3.4.1 ...

  9. 一文掌握 Linux 性能分析之 CPU 篇

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 平常工作会涉及 ...

  10. RequireJS - 个人小入门

    quirejs : http://www.requirejs.cn/ 叶小钗  : http://www.cnblogs.com/yexiaochai/p/3214926.html app.js 展示 ...