浏览器渲染过程
- 根据HTML构建HTML(DOM)
- 根据CSS构建CSS树(CSSOM)
- 将两棵树合并成一颗渲染树(render tree)
- Layout布局(文档流,盒模型,计算大小和位置)
- Paint绘制(把边框颜色,文字颜色,阴影等等画出来)
- Compose合成(根据层叠关系展示画面)
transform
- 原理:transform:translateX(0 => 300px);
- transform过渡属性可以自动脑补中间帧(transition:all 1s;)
- 常用四个属性
- translate:位移, tanslateX,translateY,translateZ为三个互相垂直的三维轴。
.demo:hover{
transform:translate(200px,300px);
transform:translate3D(100px,200px,300px);
}
- scale:缩放
.demo:hover{
transform:scale(1.5,0.5);
transform:scale(1.5);
}
- rotate:旋转
.demo:hover{
rotate(45deg);
}
- 倾斜skew,同上,直接加度数。
- transform多重效果:
.demo{
transform:scale(0.5) translate(-100%,-100%);
transform:none;
}
- 经验:
- 一般都需要transition过渡
- inline元素不支持transform,需要先变成block
CSS动画优化
- JS优化:使用requestAnimationFrame代替setTimeout或setInterval
- css优化:使用will-change或translate
transition过渡
animation
- 先声明关键帧
- 添加动画
#demo{
animation:xxx 1.5s;
}
@keyframes xxx{
0% {
transform:none;
}
50% {
transform:translateX(200px);
}
100% {
transform:translateX(200px) translateY(100px);
}
}
- 缩写语法:animation:时长|过渡方式|延迟|次数(具体数字或者infinite)|方向(reverse/alternate/alternate-reverse)|填充方式(none/forwards/backwards/both)|是否暂停(paused/running)|动画名;
- 如果某一个关键帧出现了重复的定义,且重复的关键帧中的 CSS 属性值不同,则以最后一次定义的属性为准。
- @keyframes 不存在层叠样式(cascade)的情况,所以动画在一个时刻(阶段)只会使用一个的关键帧的数据