浏览器渲染原理
渲染过程
- 根据HTML构建HTML树(DOM)
- 根据CSS构建CSS树(CSSOM)
- 将两棵树合并为一棵渲染树(render tree)
- Layout布局(文档流、盒模型、计算大小和位置)
- Paint绘制(把边框颜色、文字颜色、阴影等画出来)
- Composite合成(根据层叠关系展示画面)
三棵树模型图
如何更新样式
- 一般用js来更新样式
div.style.background='red';
div.style.dispaly='none';
div.classListAdd('red');
div.remove();
-
不同的更新样式,渲染方式也不同
-
三种更新方式:
- JS/CSS>样式>布局>绘制>合成: JavaScript>Style>Layout>Paint>composite
如:div.remove()会触发当前元素消失,其他元素relayout
- JS/CSS>布局>绘制>合成: JavaScript>Style>Layout>Paint>composite
如:改变元素背景颜色,直接repaint+composite
- JS/CSS>绘制>合成: JavaScript>Style>Paint>composite
如:改变transform,只需composite
CSS 动画的两种做法(transition 和 animation)
transition(过渡)
-
作用:补充中间帧
-
transition语法:
transiton:属性名 时长 过渡方式 延迟
格式如
transition: all 4s ease-in-out 1s; -
注意:
- 可用逗号隔开不同属性,如
transition: margin-right 4s, color 1s; - 也可用 all 代表所有属性,如
transition:all 100ms; - 过渡方式有:
linear/ease/ease-in/ease-out/ease-in-out/cubic-bezier/step- start/step-end/steps等,具体含义要靠数学知识; - 不是所有属性都能用 transition ,如
display:none=>block ; - 如果有中间点,可使用两次 transition 。
- 可用逗号隔开不同属性,如
animation(动画)
-
作用:在有中间点时,用于替代 transition ,搭配keyframes选择器使用。
-
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语法:
animation:动画名/时长/过渡方式/延迟/次数/方向/填充模式/是否暂停;
- 时长:1s或1000ms等
- 过渡方式:与transition取值一样,如linear等
- 次数:3或者4或者infinite等
- 方向:reverse | alternate | alternate-reverse
- 填充方式:none | forwards | backwards | both
- 是否暂停:paused | running
注意:以上属性都有对应单独的属性对应,具体可以去MDN上查。
写个栗子,比较下效果
-
用transition写的爱心:
-
用animation写的爱心:
css动画优化
js优化
使用 requestAnimationFrame 代替 setTimeout或setInterval
css优化
使用will-change或translate
学习心得
不会的先去查MDN,查完了自己试,试过还不懂再问,培养自己解决问题能力很重要!