
动画
定义:由许多静止的画面(帧),以一定的速度(如每秒30张)连续播放时,肉眼因视觉残象产生错觉,而误以为是活动的画面
CSS渲染
步骤
- 根据HTML构建HTML树(DOM)

- 根据CSS构建CSS树(CSSOM)


5. aint绘制(把边框颜色、文字颜色、阴影等画出来) Compose合成(根据层叠关系展示画面)
使用JS更新样式
div.style.background ='red'
div.style.display = 'none'
div.classList.add('red')
div.remove()直接删掉节点
- 记住加样式
style
,不如加class
类
三种不同的渲染方式

- 第一种,全走
div.remove
会触发当前消失,其他元素relayout
- 第二种,跳过layout
- 改变背景元素,直接
repaint + composite
- 改变背景元素,直接
- 第三种,跳过layout和paint
- 改变
transform
,只需composite
*注意:不同CSS元素,会导致不同的渲染顺序。CSS渲染顺序查询
- 改变
CSS动画优化(一定要记住)
优化 JavaScript 执行
- 对于动画效果的实现,避免使用
setTimeout
或setInterval
,请使用requestAnimationFrame
。 - 将长时间运行的
JavaScript
从主线程移到Web Worker
。 - 使用微任务来执行对多个帧的
DOM
更改。 - 使用
Chrome DevTools
的Timeline
和JavaScript
分析器来评估JavaScript
的影响。
缩小样式计算的范围并降低其复杂性
- 降低选择器的复杂性;使用以类为中心的方法,例如 BEM。
- 减少必须计算其样式的元素数量。
避免大型、复杂的布局和布局抖动
- 布局的作用范围一般为整个文档。
DOM
元素的数量将影响性能;应尽可能避免触发布局。- 评估布局模型的性能;新版
Flexbox
一般比旧版Flexbox
或基于浮动的布局模型更快。 - 避免强制同步布局和布局抖动;先读取样式值,然后进行样式更改。
简化绘制的复杂度、减小绘制区域
- 除
transform
或opacity
属性之外,更改任何属性始终都会触发绘制。 - 绘制通常是像素管道中开销最大的部分;应尽可能避免绘制。
- 通过层的提升和动画的编排来减少绘制区域。
- 使用
Chrome DevTools
绘制分析器来评估绘制的复杂性和开销;应尽可能降低复杂性并减少开销。
坚持仅合成器的属性和管理层计数
- 坚持使用
transform
和opacity
属性更改来实现动画。 - 使用
will-change
或translateZ
提升移动的元素。 - 避免过度使用提升规则;各层都需要内存和管理开销。
使输入处理程序去除抖动
- 避免长时间运行输入处理程序;它们可能阻止滚动。
- 不要在输入处理程序中进行样式更改。
- 使处理程序去除抖动;存储事件值并在下一个
requestAnimationFrame
回调中处理样式更改。
transform
transform
属性允许你旋转,缩放,倾斜或平移给定元素。这是通过修改CSS
视觉格式化模型的坐标空间来实现的。- 注意:
inline
行级元素不支持transform
需要先变成block
块级元素
位移 translate
transform: translateX() X轴横轴
transform: translateY() Y轴纵轴
transform: translate (X,Y) 简写推荐使用
transform: translateZ() z轴三维垂直方向
- 特点:
transform: translateZ()
, z轴是三维垂直方向,必须配合perspective: 1000px;
必须有视口才能显示.
缩放 scale
transform: scaleX(); X轴缩放
transform: scaleY(); Y轴缩放
transform: scale(XY); 简写推荐使用
translate(-50%,-50%)
可做绝对定位元素的居中
旋转 rotate
transform: rotateX( ); X轴旋转
transform: rotateY( ); Y轴旋转
transform: rotate(X,Y); 简写推荐使用
transform: rotateZ( ); z轴是三维垂直旋转,太难了,不懂?
- 一般用于360度旋转制作loading
倾斜skew
transform: skewX( deg); X轴倾斜
transform: skewY( deg); Y轴倾斜
多重效果:
transform: scale(0.5) translate(-100%, -100%);
- 一定要写在一行,不然第二行
transform
会覆盖他. - transform: none;取消所有
transition 过度
- 过渡可以为一个元素在不同状态之间切换的时候定义不同的过渡效果。比如在不同的伪元素之间切换,像是
:hover
,:active
或者通过JavaScript
实现的状态变化。 - 作用补充中间帧
语法
- animation
- 时长| 过渡方式 | 延迟 | 次数 | 方向 | 填充模式 | 是否暂停 | 动画名
- 时长
- Is或者1000ms
- 过渡方式
- 跟transition取值一样,如linear
- 次数
- 3或者2.4或者infinite
- 方向
- reverse | alternate | alternate-reverse
- 填充模式
- none | forwards | backwards | both
- 是否暂停:
- paused | running
必须配合@keyframes
使用实现动画效果
@keyframes heart {
0% {
transform: scale(1.0);
}
20% {
transform: scale(1.2);
}
50% {
transform: scale(1.3);
}
80% {
transform: scale(1.5);
}
100% {
transform: scale(2);
}
}
资料引用:
饥人谷方方老师
本文参考了饥人谷内部课程