1.浏览器的渲染原理
1.步骤
1.根据HTML构建HTML树(DOM)
2.根据CSS构建CSS树(CSSOM)
3.将两棵树合并成一棵渲染树(render tree)
4.Layout布局(文档流,盒模型,计算大小和位置)
5.Paint绘制(把边框颜色,文字颜色,阴影画出来)
6.Compose合成(根据叠层关系展示画面)
2.如何更新样式?
一般使用JS来更新样式
三种更新的方式:
- JS / CSS > 样式 > 布局 > 绘制 > 合成
如果您修改元素的“layout”属性,也就是改变了元素的几何属性(例如宽度、高度、左侧或顶部位置等),那么浏览器将必须检查所有其他元素,然后“自动重排”页面。任何受影响的部分都需要重新绘制,而且最终绘制的元素需进行合成。
例如:div.remove()会触发当前消失,其它元素relayout。
- JS / CSS > 样式 > 绘制 > 合成
如果您修改“paint only”属性(例如背景图片、文字颜色或阴影等),即不会影响页面布局的属性,则浏览器会跳过布局,但仍将执行绘制。
例如:改变背景颜色,直接repaint+composite。
- JS / CSS > 样式 > 合成
如果您更改一个既不要布局也不要绘制的属性,则浏览器将跳到只执行合成。
这个最后的版本开销最小,最适合于应用生命周期中的高压力点,例如动画或滚动。
例如:改变transform,只需composite。
- 补充:CSS优化看Google文章
- JS优化:使用requestAnimationFrame代替setTimeout或setInterval
- CSS优化:使用will-change或transform
2.CSS动画的两种做法
使用transform(详见文档)
四个常用的功能:
- 位移 translate
- 缩放 scale
- 旋转 rotate
- 倾斜 skew
-
translate
translateX(<length-percentage>) //可写长度,可写百分度,在x轴上 translateY(<length-percentage>) //在y轴上 translate(<length-percentage>,<length-percentage>?) //?表省略 translateZ(<length>) //且父容器perspective,在z轴上 translate3d(x,y,z)
可以做绝对定位元素的水平垂直居中(子绝父相)
{
left:50%;
top:50%;
transform:translate(-50%,-50%)
}
-
scale
CSS属性 scale 允许你可以分别且独立地指定CSS属性 transform 缩放的比例。
/* 关键值 */ scale: none; /* 单个值 */ /* 设定比1大的数值使该元素变大 */ scale: 2; /* 设定比1小的数值使该元素缩小 */ scale: 0.5; /* 两个值 */ scale: 2 0.5; /* 三个值 */ scale: 2 0.5 2;取值:
单一数值
单一的数值即指定了一个缩放系数,同时作用于X轴和Y轴让该元素进行缩放,相当于指定了单个值的scale()(2D缩放)函数。
两个长度/百分比值
两个数值即分别指定了2D比例的X轴和Y轴的缩放系数,相当于指定了两个值的scale()(2D缩放)函数。
三个长度/百分比值
三个数值即分别指定了3D比例的X轴、Y轴和Z轴的缩放系数. 相当于一个scale3d()函数。
none
指定不进行缩放。
、
-
rotate
/* Keyword values */ scale: none; /* Angle value */ rotate: 90deg; rotate: 0.25turn; rotate: 1.57rad; /* x, y, or z axis name plus angle */ rotate: x 90deg; rotate: y 0.25turn; rotate: z 1.57rad; /* Vector plus angle value */ scale: 1 1 1 90deg;rotate(360deg)默认以垂直于屏幕的轴转动的
-
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没法过渡。
过渡必须有起始
使用animation(详见MDN文档)
使用animation的步骤:
- 添加关键帧
- 添加动画
@keyframes xxx {
0% { transform:none;}
60% { transform:translateX(200px)}
100% { transform:translate(200px,300px)}
}
@keyframes完整语法是有两种:
- 一种是
from to - 另一种是
%百分数
缩写语法:
animation:时长|过渡方式|延迟|次数|方向|填充模式|是否暂停|动画名
- 时长:1s或1000ms
- 过渡方式:跟transition取值一样。如linear
- 次数:3或2.4或indfinite(无限次)
- 方向:reverse | alternate | alternate-reverse
- 填充模式:none | forward (停留在最后一帧)| backwards | both
- 是否暂停:paused | running
#id.style.animationPlayState = 'paused/running'
以上的所有的属性都有对应的单独属性
3.CSS的定位
position的五个取值:(重要)
- static 默认值,待在文档流
- relative 相对定位,升起来,但是不脱离文档流,是相对自己定位
- absolute 绝对定位。定位基准是祖先里第一个非static的元素
- fixed 固定定位,以视口为基准的定位,实际上并不是绝对的
- sticky 粘滞定位,兼容性不好。
小总结:
- 若是写了absolute,一般会补一个relative
- 若是写了absolute或fixed,一定要写top和left
- sticky 目前兼容性很差,不适合项目生产。