浏览器渲染原理 CSS动画的两种做法(transition 和 animation)
一、浏览器渲染原理
参考文章(Google 团队写的文章)
浏览器渲染过程
- 根据 HTML 构建 HTML 树(DOM)
- 根据 CSS 构建 CSS 树(CSSOM)
- 将两棵树合并成一颗渲染树(render tree)
- Layout 布局(文档流、盒模型、计算大小和位置)
- Paint 绘制(把边框颜色、文字颜色、阴影等画出来)
- Compose 合成(根据层叠关系展示画面)
如何更新样式
一般用JS来更新样式
div.style.background = 'red';
div.style.display = 'none';
div.classList.add('red');
div.remove();
其中涉及到三种更新方式
- JS / CSS > 样式 > 布局 > 绘制 > 合成
- JS / CSS > 样式 > > 绘制 > 合成
- JS / CSS > 样式 > > > 合成
- 第一种,全走
div.remove()会触发当前消失,其他元素 relayout
- 第二种,跳过 layout
改变背景颜色,直接 repaint + composite
- 第三种,跳过 layout 和 Paint
改变transform,只需 composite
二、CSS动画
transform 和 transition
transform的四个常用功能
- 位移 translate
- 缩放 scale
- 旋转 rotate
- 倾斜 skew
transition 过渡语法(补充中间帧)
- transition: 属性名 时长 过渡方式 延迟
- transition: left 200ms linear
- 可以用逗号分割两个不同树形
- transition: left 200ms, top 400ms
- 可以用 all 代表所有属性
- transition: all 200ms
- 过渡方式有:linear | ease | ease-in | ease-out | ease-in-out | cubic-bezier | step-start | step-end | steps。
注意:并不是所有属性都能过渡
- display: none => block 没法过渡
- 一般改成 visibilidy: hidden => visible
过渡必须要有起始,一般只有一次动画,或者两次,比如 hover 和非 hover 状态的过渡
如果还有中间点的话,可以使用如下方法解决:
- 使用两次 transform
.a => transform => .b
.b => transform => .c
通过 setTimeout 或者监听 transitionend 事件
- 使用 animation
声明关键帧
@keyframes 动画名称 {
from {
/* 初始样式 */
}
to {
/* 结束样式 */
}
}
@keyframes 动画名称 {
0% {
/* 初始样式 */
}
n% {
/* 中间样式 */
}
/* ,,, */
100% {
/* 结束样式 */
}
}
添加动画
animation语法
animation: 时长 | 过度方式 | 延迟 | 次数 | 方向 | 填充模式 | 是否暂停 | 动画名;
- 时长:1s 或者 1000ms
- 过渡方式:和 transition 取值一样,如 linear
- 次数:正整数 或者 infinite (无穷)
- 方向:reverse | alternate | alternate-reverse
- 填充模式:none | forwards | backwards | both
- 是否暂停:pause | running
- 以上所有的属性都有单独的属性