一个最简单的例子
- 将
<div></div>
从左往右移动: 用 JS 实现
原理
- 每过一段时间,将 div 移动一小段距离
- 用
setInterval
实现 - 直到移动到目标处
注意性能
Chrome 开发者工具,点任何一个 Tab,按 Esc,按竖排省略号按钮,选
Rendering
,勾选Paint flashing
- 绿色闪烁表示:重新绘制(repaint)
- 每次闪烁,都消耗性能
- CSS 渲染过程依次包含:布局、绘制、合成
- 其中布局和绘制有可能会被省略
不用position
和left
做动画
用transform
demo
transform
原理
transform:translateX(0=>300px);
- 直接修改会被合成,需要等一会修改
transition
过渡属性可以自动脑补中间帧
注意transform
性能
- 并没有
repaint
(重新绘制) - 比更改
left
性能好
浏览器渲染原理
参考文章
使用 transform 和 opacity 属性更改来实现动画
查看 CSS 各属性会出发什么?
(Layout Paint Composite)(布局 绘制 合成)
浏览器渲染过程
步骤:
- 根据 HTML 树构建 HTML 树(DOM)
- 根据 CSS 构建 CSS 树(CSSDOM)
- 将两棵树合并成一棵:渲染树(render tree)
- 即构建对象模型
由渲染树(render tree)可进行
Layout
布局(文档流和定位、盒模型、计算元素的大小和位置)Paint
绘制(把边框颜色、文字颜色、阴影等画出来)Composite
合成(根据层叠关系展示画面)- 即渲染树构建、布局及绘制
三棵树(DOM CSSDOM render)
如何更新样式
一般用 JS 来更新样式
比如
|
|
三种不同的渲染方式
- JS/CSS>样式>布局>合成
- JS/CSS>样式>无布局>绘制>合成
- JS/CSS>样式>无布局>无绘制>合成
JS 和 Style 样式计算必不可少
最后都要
composite
不同方法间的区别(以下链接 demo)
- 第一种:全走
div.remove()
:会触发当前消失,其他元素重布局relayout
- 第二种:跳过
layout
未改变元素的位置和大小
比如只改变背景颜色:直接
repaint
+composite
- 第三种:跳过
layout
和paint
transform
:只需composite
- 注意:必须全屏查看效果,在
iframe
里看有问题
不同属性触发的流程也各不相同,可查:CSSTriggers
CSS 动画优化(面试 5%)
JS 优化
使用requestAnimationFrame
代替setTimeout
或setInterval
CSS 优化
使用will-change
或translate
死记硬背
参考文章
相关文章
- 无
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名
- 河 掘 思 知 简