浏览器渲染过程:
-
根据HTML构建HTML树(DOM)
- 文档对象模型(DOM)是HTML和XML文档的编程接口,它会将web页面和脚本或程序语言连接起来。
-
根据CSS构建CSS树(CSSOM)
- CSS 对象模型 (CSS Object Model, CSSOM) 是一个存放所有 CSS 选择器与相关特性的树状结构容器,拥有根节点、邻居节点、后代节点、子代节点以及其他关系。 CSSCOM 非常类似于 DOM 文件对象模型 。
-
将两棵树合并成一颗渲染树(render tree)
-
Layout布局(文档流,盒模型,计算大小和位置)
-
Paint绘制(将边框颜色,文字颜色,阴影等画出来)
-
Compose合成(根据层叠关系展示画面)
如何更新样式:
一般用JS更新样式:
- div.style.background='red'
- div.style.display='none'
- div.classList.add('red')(加样式不如加类)
三种渲染方式和更新方式:
- JS/CSS>样式>布局>绘制>合成
- 例如
div.remove()会触发当前消失,其他元素relayout。
- JS/CSS>样式>绘制>合成
- 例如改变背景颜色,则直接repaint+composite。
- JS/CSS>样式>合成
- 改变transform,只需composite
Notes:
- 必须全屏查看效果,在iframe里看问题。
- csstriggers.com 可查看每种属性触发哪些流程。
CSS动画优化
详细可查看google团队文章
- JS优化:使用requestAnimationFrame代替setTimeout或setInterval
- CSS优化:使用will-change或translate
transform属性
- 四个常用功能
-
位移transsform
transsform:translate(50px);X轴位移50像素。Notes:
- 若要在Z轴(垂直于视点)位移,需要在父元素上添加perspective属性。
transsform:translate(-50%,-50%);可做绝对定位元素的居中。- MDN语法格式很重要!!!
-
缩放scale:
transsform:scale(1.5);。用的很少,因为变形,容易出现模糊。 -
旋转rotate:
transsform:rotate(45deg);顺时针旋转45度。一般用于 360 度旋转制作 loading,或者按钮的交互(鼠标移到按钮上就转一圈),多看MDN文档。
- 倾斜skew:
transsform:skewX(15deg);X轴倾斜15度。用得较少,用时搜 MDN 文档。
transition
-
作用:补全中间帧。
例如:
效果 -
语法:
-
transition:属性名 时长 过渡时间 延迟;
transition:right 10s linear; -
可用逗号分隔开两个不同属性
transition:right 10s,top 10s; -
可用all代表所有属性
transition:all 10s linear; -
过渡方式:linear,ease,ease-in,ease-out, ease-in-out,cubic-bezier,step- start,step-end,steps。 具体效果查看MDN
-
-
Notes:并非所有属性都使用transition。
- display:block;=>display:none;不能过渡,而修改成透明度opacity,也只是看不见了,位置还一直占着。 一般改成 visibility:visible=>hidden,visibility也是占位置的。
- background背景颜色可以过渡。
- opacity透明度可以过渡,但不推荐。
过渡必须有起始,一般只有一次或两次动画,比如hover和非hover状态的过渡。
若有中间过渡,可以使用两次transform,用setTimeout或者监听transitionend事件确认中间点。
也可以使用animation(声明关键帧,添加动画)来实现。
animation
- keyframes语法: 一种是from to:
@keyframes slidein {
from {
transform: translateX(0%);
}
to {
transform: translateX(100%);
}
}
或者百分数
@keyframes identifier {
0% { top: 0; left: 0; }
30% { top: 50px; }
68%, 72% { left: 50px; }
100% { top: 100px; left: 100%; }
}
-
语法:animation:时长|过渡方式|延迟|次数|方向|填充模式|是否暂停|动画名;
- 时长:1s 或者 1000ms
- 过渡方式:跟 transition 取值一样,如 linear
- 次数:数字 或着 infinite(无限次)
- 方向:
- normal:每个循环内动画向前循环,换言之,每个动画循环结束,动画重置到起点重新开始,这是默认属性。
- reverse:反向运行动画,每周期结束动画由尾到头运行。
- alternate:动画交替反向运行,反向运行时,动画按步后退,同时,带时间功能的函数也反向,比如,ease-in 在反向时成为ease-out。
- alternate-reverse:反向交替,反向开始交替 动画第一次运行时是反向的,然后下一次是正向,后面依次循环。
- 填充模式:
- none:这是默认值,由该元素的 CSS 规则来显示该元素。
- forwards:动画将停留在最后一个关键帧。
- backwards:动画将在应用于目标时立即应用第一个关键帧中定义的值,并在animation-delay期间保留此值。第一个关键帧取决于animation-direction的值。
- both:动画将遵循forwards和backwards的规则,从而在两个方向上扩展动画属性。
- 是否暂停:
- paused:当前动画已被停止。
- running:当前动画正在运行。
note:以上所有属性都有对应的单独属性。只改一个属性的话就要单独写。