图层 & 重排 & 重绘
图层
浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小,每个图层上有一个或多个节点
渲染 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>
图层 & 重排 & 重绘的更多相关文章
- 优化CSS重排重绘与浏览器性能
关于CSS重排和重绘的概念,最近看到不少这方面的文章,觉得挺有用,在制作中考虑浏览器的性能,减少重排能够节省浏览器对其子元素及父类元素的重新渲染:避免过分的重绘也能节省浏览器性能:优化动画,使用3D启 ...
- 关于DOM的操作以及性能优化问题-重绘重排
写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...
- 高性能JavaScript 重排与重绘
先回顾下前文高性能JavaScript DOM编程,主要提了两点优化,一是尽量减少DOM的访问,而把运算放在ECMAScript这一端,二是尽量缓存局部变量,比如length等等,最后介绍了两个新的A ...
- 高性能WEB开发:重排与重绘
DOM编程可能最耗时的地方,重排和重绘. 1.什么是重排和重绘 浏览器下载完页面中的所有组件——HTML标记.JavaScript.CSS.图片之后会解析生成两个内部数据结构——DOM树和渲染树. D ...
- 前端性能优化--为什么DOM操作慢? 浅谈DOM的操作以及性能优化问题-重绘重排 为什么要减少DOM操作 为什么要减少操作DOM
前端性能优化--为什么DOM操作慢? 作为一个前端,不能不考虑性能问题.对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩( ...
- css 重排与重绘
css 重绘与重排 我们要知道当浏览器下载完页面的所有资源后,就会开始解析源代码. HTML 会被解析成 DOM Tree,Css 则会被渲染成 CSSOM Tree,最后它们会附加到一起,形成渲染树 ...
- js 重排和重绘
1.什么是重排和重绘 浏览器下载完页面中的所有组件--HTML标记.JavaScript.CSS.图片之后会解析生成两个内部数据结构--DOM树和渲染树. DOM树表示页面结构,渲染树表示DOM节点如 ...
- JS学习笔记:(二)回流和重绘
在搞清楚回流和重绘的概念之前,我们要清除浏览器的渲染过程. 解析生成DOM Tree(此时包含所有节点,包括display:none); 根据CSS Object Module(CCSSOM)计算节点 ...
- CSS重排和重绘
一.什么是重绘Repaint和重排 (回流 reflow) 重绘:当元素的一部分属性发生改变,如外观.背景.颜色等不会引起布局变化,只需要浏览器根据元素的新属性重新绘制 ,使元素呈现新的外观叫做重绘. ...
随机推荐
- JavaScript数据类型 String字符串类型
前言 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串String是javascript基本数据类型,同时javascript也支持 ...
- 点评cat系列-应用集成
========================消息的基本属性========================消息的几个属性:type: 定义消息的 category, 比如 SQL 或 RPC 或 ...
- [再寄小读者之数学篇](2014-06-23 积分不等式 [中国科学技术大学2013年高等数学B 考研试题])
设 $f(x)$ 在 $[a,b]$ 上一阶连续可导, $f(a)=0$. 证明: $$\bex \int_a^b f^2(x)\rd x\leq \cfrac{(b-a)^2}{2}\int_a^b ...
- java(8)二重循环
一.二重循环 1.循环中,嵌套另外一个循环,将内层的循环,看成外层循环的一个循环操作 2.常见的二重循环 形式1: 外层while或do…while 内层为for循环 形式2: 外层.内层都 ...
- 分布式系列五: RMI通信
RPC(Remote Procedure Call)协议 RPC协议是一种通过网络从远程计算机上请求服务, 而不需要了解底层网络技术的协议, 在OSI模型中处在应用层和网络层. 作为一个规范, 使用R ...
- 一些日期的计算方式 PHP
一些日期的计算 某个月内的所有天数: public function getMonthDay ($date) { $stattime = strtotime(date('Ym01',strtotime ...
- webhook: requestbin
A Runscope Community Project — Learn more. RequestBin Bin URL Make a request to get started. After m ...
- ASP .NET Core HTTP Error 502.5 – Process Failure
页面返回错误 事件日志显示错误 大家可以先看着个链接 https://docs.microsoft.com/en-us/aspnet/core/publishing/iis?tabs=aspnetco ...
- 阿里云ECS试用配置
1.首先从阿里云找到ECS购买入口(目前在弹性入口的弹出框中).进入ECS购买界面后,选择免费试用. 此处省略试用申请过程. 2.然后再到云市场中购买一个免费的镜像服务.此处为Centos 64位系统 ...
- 服务器资源迁移到aliyun对象存储及oss的权限管理配置
chinasoft-download增值服务的迁移和部署 需求: 增值服务网站需要从网宿迁移到阿里云,以前的增值服务历史软件存放在服务器中需要迁移到阿里云的oss中存放 需要改造程序给程序添加一个os ...