浏览器渲染页面的过程
1. 处理 HTML 标记并构建 DOM 树
DOM树描述了文档的内容。<html>元素是第一个标签也是文档树的根节点。树反映了不同标记之间的关系和层次结构。嵌套在其他标记中的标记是子节点。DOM节点的数量越多,构建DOM树所需的时间就越长。
2. 处理 CSS 标记并构建 CSSOM 树
CSS 字节转换成字符,接着转换成令牌和节点,最后链接到一个称为“CSS 对象模型”(CSSOM) 的树结构内:
3.将 DOM 与 CSSOM 合并成一个渲染树
DOM/CSSOM树本身并不能直接用于排版和渲染,浏览器还会生成另外一棵树:Render树
渲染树只包含了可见内容。头部(通常)不包含任何可见信息,因此不会被包含在渲染树种。如果有元素上有
display: none;,它本身和其后代都不会出现在渲染树中。
Render 树是衔接浏览器排版引擎和渲染引擎之间的桥梁,它是排版引擎的输出,渲染引擎的输入。此时的Render树上,已经包含了网页上所有可见元素的内容和位置信息,排版引擎会根据Render树的内容和结构,准确的计算出元素该在网页上的什么位置。到此,我们已经具备进入布局的一切准备条件
4.根据渲染树来布局,以计算每个节点的几何信息
第一次确定节点的大小和位置称为布局。随后对节点大小和位置的重新计算称为回流。
布局是确定呈现树中所有节点的宽度、高度和位置,以及确定页面上每个对象的大小和位置的过程。回流是对页面的任何部分或整个文档的任何后续大小和位置的确定。
布局最后的输出是一个“盒模型”:将所有相对测量值都转换成屏幕上的绝对像素。
5.将各个节点绘制到屏幕上
绘画包括将元素的每个可视部分绘制到屏幕上,包括文本、颜色、边框、阴影和替换的元素(如按钮和图像)。浏览器需要非常快地完成这项工作。
绘制可以将布局树中的元素分解为多个层。将内容提升到GPU上的层(而不是CPU上的主线程)可以提高绘制和重新绘制性能。
层确实可以提高性能,但是它以内存管理为代价,因此不应作为web性能优化策略的一部分过度使用。
6.合成
当文档的各个部分以不同的层绘制,相互重叠时,必须进行合成,以确保它们以正确的顺序绘制到屏幕上,并正确显示内容。
CSS动画实现
1.transform
使用transfrom实现位移(translate)、缩放(scale)、旋转(rotate)、倾斜(skew)
以上效果可以组合使用:transform: scale(0.5) translate(50%,50%);
但是注意不能分开写成:(分开会使上面的缩放效果消失,只剩位移)
transform: scale(0.5);
transform: translate(50%,50%);
2.transition
transition: 属性名 时长 过渡方式 延迟
transform一般都配合transition使用,实现过渡的动画效果。
- transition属性可以被指定为一个或多个 CSS 属性的过渡效果,多个属性之间用逗号进行分隔:
transition: margin-right 4s, color 1s; - 用all可以代表所有属性:
transition: all 2s; - 过渡方式有:linear | ease | ease-in | ease-out | ease-in-out | cubic-bezier | step-start | step-end |steps
- 并不是所有属性都能过渡
3.animation
animation: 时长 过渡方式 延迟 次数 方向 填充模式 是否暂停 动画名
animation 属性用来指定一组或多组动画,每组之间用逗号相隔。
- 时长:1s 或 100ms
- 过渡方式:与transition相同
- 次数:1、2、3或者infinite
- 方向:revese | alternate | alternare-reverse
- 填充模式:none | forwards | background | both
- 是否暂停:pasued | running
举例如下:
#heart{
margin: 100px;
position: relative;
display: inline-block;
animation: heart 1.3s infinite alternate;
}
@keyframes heart{
0%{
transform: scale(1.0);
}
100%{
transform: scale(1.6);
}
}
问:使用animation后动画结束后会回到原点,如何使动画停在最后一帧呢?
答:添加一个forwards
#demo.start{
animation: xxx 1.5s forwards; /* 写上forwards之后最后一帧动画就不会回到原点 */
}
关键帧@keyframes
通过在动画序列中定义关键帧的样式来控制CSS动画序列中的中间步骤。它有两种写法:
1. from to
@keyframes slidein {
from {
transform: translateX(0%);
}
to {
transform: translateX(100%);
}
}
from等价于 0%。to 等价于 100%。
2. 百分比形式
@keyframes identifier {
0% { top: 0; left: 0; }
30% { top: 50px; }
68%, 72% { left: 50px; }
100% { top: 100px; left: 100%; }
}
例子中,top 属性分别出现在关键帧 0%、30% 和 100% 的中,而 left 属性分别出现在关键帧 0%、68%、72% 和 100% 中。
本文参考摘录了:1、渲染页面:浏览器的工作原理 2、渲染树构建、布局及绘制 3、浏览器的渲染过程 4、浏览器的渲染:过程与原理 5、@keyframes