浏览器渲染
- 浏览器渲染过程:
- 构建HTML树DOM
- 构建CSS树CSSOM
- 将两颗树合并成一颗渲染树render tree
- Layout布局(文档流、盒模型,计算大小和位置)
- Paint绘制(画边框颜色,文字颜色等)
- Compose(垂直屏幕合成,根据层叠关系展示页面)
- 页面的三种更新方式:
- JS/CSS > Style > Layout > Paint > Composite
如 div.remove(),使得元素消失,其他元素重新布局 - JS/CSS > Style > Paint > Composite
如只改变背景颜色 - JS/CSS > Style > Composite
如只改变transform
- 查看每个属性触发哪种更新方式:https://csstriggers.com/
- 查看浏览器渲染过程:开发者工具 -> 按“Esc”调出Console -> 左上角点击出现菜单中的rendering -> 勾选Paint flashing -> 播放动画, 画面变绿则说明在repaint
- JS/CSS > Style > Layout > Paint > Composite
动画优化
- JS:用 resquestAnimationFrame 代替 setTimeout 或 setInterval
- CSS:用 will-change 或 translate
transform
可任意组合 transform: translate(50px, 50px) scale(15deg 15deg) ;
- translate:
- translate(X, Y, Z): 简写
- translateX(50px): 水平方向移动
- translateY(50px): 竖直方向移动
- translateZ(50px): 垂直屏幕方向移动,在二维平面上看不出效果,需在三维世界中看
在父元素上设置视点perspective,
```css .demo {<div class="wrapper">
<div class="demo"> </div>
</div>
border: 1px solid #f00; width: 100px; height: 100px; margin: 50px; }
.demo:hover { transform: translateZ(50px); /数值越大离屏幕越近,数值变小往视点走/ }
.wrapper { border:1px solid #000; perspective: 1000px; /设置视点/ } ```
- scale: 用的较少,容易产生模糊
- scale(X, Y): 简写
- scaleX():水平方向缩放
- scaleY():竖直方向缩放
- rotate:
- skew:
- 一般配合transition过度
- inline 元素不支持transform,需要先变成block
CSS动画
作用:补充中间帧
- transition: 属性名 时长 过度方式 延迟; 做一个动画动作
- 过度方式:linear | ease | ease-in | ease-out
- display: block -> display: none , 会之直接没用,无法过度
- animation:可做多个动画动作
- 两次动画写法,有两种:
- 使用两次transform,使用setTimeout或transitionend监听
- 使用animation声明关键帧
- 将动画停留在最后一刻,最后加forward: animation: bubble 1.0s forwards;
查看CS手册
https://developer.mozilla.org/zh-CN/docs/Web/CSS/Reference
练习
一起来画一只会眨眼的猪猪