CSS优化
CSS和HTML是一对基友,两者是密不可分的。没有HTML,CSS的表现没有载体。没有CSS,HTML就没有那么多的布局和样式了。那么,如何给HTML添加样式呢?
添加样式
内联CSS,优点是不会阻断HTML的加载。缺点是会增加HTML文件的体积,同时不利于样式的管理和阅读,可读性不强。所以,一般只是首屏的关键CSS才会这样写。可以搜索css trigger具体了解用法。
Link标签
1
<link href='xxx.css' rel='stylesheet'>
上面这种写法可以会阻断HTML的渲染,不会阻塞HTML的构建,具体流程参考关键路径
1
<link href='xxx.css' rel='stylesheet' media='none' onload='this.media=all'>
上面这种写法,既不会阻塞HTML的构建,也不会阻塞渲染,算是异步加载css文件的异种pollyfill的手段。
1
<link rel='preload' href='xxx.css' as='style' onload='this.rel=stylesheet'>
这种写法,也是异步加载,而且是官方提供的,但是各个浏览器的支持度不够高。
样式选择器
独立选择器:
- 属性选择器
- 类选择器
- ID选择器
- 标签选择器
- 伪类选择器
- 伪元素选择器
- 通用选择器
组合选择器:
- 分组选择器(a, b)
- 后代选择器(a b)
- 子选择器(a > b)
- 相邻选择器 (a + b)
- 同辈选择器(a ~ b)
在使用选择器的时候,尽量避免嵌套多个选择器,因为选择器是从右到左,过多嵌套会加重计算。同时减少重流和重绘。会出发CSS重流重绘的元素可以参考:http://csstriggers.com.
关键渲染路径
上图是在没有JS的情况下,DOM和CSSOM的构建过程,可以看到,DOM和CSSOM是并行的,两个互不影响,而Render Tree的形成时间则是由两者中耗时最长的路径决定的。
而在有JS文件的情况下,由于JS会改变CSS和HTML。所以,JS会阻断HTML的DOM构建,而且,JS的执行是在CSSOM形成之后。所以,在有JS参与的情况,关键路径如下所示:
此时的Render Tree形成由路径上节点耗时的总和。所以,我们需要对关键路径进行优化。
减少HTML文件大小,使用HTTP Cache
将不必要的CSS文件只用异步加载,减少CSSOM的构建时间。
加载JS文件时,使用async
1
<script async src='xxx.js' />
Critical CSS
原文作者: Billy & Barney
原文链接: https://liangbilin.github.io/2020/02/10/Barney--css优化/
版权声明: 转载请注明出处(必须保留作者署名及链接)