[CSS全解]CSS动画
本文章资料主要来自饥人谷2020版前端体系课,本文为课程笔记
什么是动画
定义
- 由许多静止画面组成(帧)
- 以一定速度播放
- 人眼因视觉残像产生错觉
- 误以为是活动画面
概念
- 帧: 每个静止的画面为一帧
- 播放速度:每秒24帧(影视)或每秒30帧(游戏)
JS实现方法(使用setInterval与left)
- 使用setInterval周期性改变元素left或top值,会使浏览器进行repaint
- 性能及其他问题,可以看这个视频
使用transform实现
- 使用transform修改transformX或transformY的值来实现
- 直接修改会被合并到当前的requestAnimationFrame,需要设置延时器延时修改
- 添加transition属性来自动添加中间帧,没有repaint
浏览器渲染原理
谷歌开发者文档的说明
相关视频课程
渲染步骤
- 根据HTML构建DOM树
- 根据CSS构建CSS树(CSSOM)
- 将以上两棵树合并为渲染树(render tree)
- Layout布局(文档流、盒模型、计算大小及位置)
- Paint绘制(绘制边框颜色、文字颜色、阴影等)
- Composite合成(根据层叠关系展示画面)
更新样式的方法
- 一般使用js更新样式
div.style.background = 'red'
div.style.display = 'none'
div.classList.add('red)
常用方法div.remove
- 以上这些方法会费别造成浏览器的reflow,repaint和composite。
- 一般使用js更新样式
三种更新方式
- JS/CSS => 样式 => 布局 => 绘制 => 合成
- JavaScript => Style => Layout => Paint => Composite
- JS/CSS => 样式 => 绘制 => 合成
- JavaScript => Style => Paint => Composite
- JS/CSS => 样式 => 合成
- JavaScript => Style => Composite
- JS/CSS => 样式 => 布局 => 绘制 => 合成
三种更新方式举例
- 全部发生
div.remove()
将元素移出DOM树,改变页面元素几何属性,整个文档重新布局
- 跳过Layout
- 改变背景颜色,直接repaint + composite
- 跳过Layout和paint
- 改变transform属性值,只需composite
- 全部发生
CSS属性触发事件查看方法
- css triggers
- vscode css-triggers插件
CSS动画优化方式
- 文档
- JS优化
- 使用
requestAnimationFrame
替代setTimeout
和setInterval
- 使用
- CSS优化
- 使用
will-change
或translate
- 使用
- 其他方式可以参考之前的笔记
transform全解
-
translate
位移scale
缩放rotate
旋转skew
倾斜
经验
- 一般需要配合
transition
使用,进行过渡 inline
元素不支持transform
,需要先将其转换为block
元素
- 一般需要配合
transition
作用
- 补充中间帧
- 语法
transition: <需要过渡的属性名> <过渡时间> <过渡曲线> <延迟时间>;
注意
- 不是所有属性都能过渡
display: none;
=>display: block;
不可以- 可以使用
visibility: hidden;
=>visibility: visible
- 过渡必须要有起始
- 不是所有属性都能过渡
Animation
- MDN animation
@keyframes
关键帧- animation
- 缩写语法
animation: <动画时间> <过渡方式> <延迟> <次数> <方向> <填充方式> <是否暂停> <动画名称>
- 动画时间:秒或毫秒
- 过渡方式:与transition值一样
- 次数:数字或infinite
- 方向:reverse | alternate | alternate-reverse
- 填充方式:none | forwards | backwards | both
- 是否暂停:paused | running
- 缩写语法