CSS 渲染性能优化
我们可以从两个方面来看性能优化的意义:
-
用户角度
网站优化能够让页面加载得更快,响应更加及时,极大提升用户体验,减少用户流失率。
-
服务商角度
优化会减少页面资源请求数,减小请求资源所占带宽大小,从而节省可观的带宽资源。
网站优化的目标就是减少网站加载时间,提高响应速度。
这里我们主要来看 CSS 方面能够进行哪些性能优化。
1.使用 id selector
非常的高效。
在使用 id selector
的时候需要注意一点:因为 id
是唯一的,所以不需要既指定 id
又指定 tagName
:
css
/* Bad */
p#id1 {
color:red;
}
/* Good */
#id1 {
color:red;
}
2.避免深层次的 node
例如:
css
/* Bad */
div > div > div > p {
color:red;
}
/* Good */
p-class {
color:red;
}
3. 不要使用 attribute selector
如:p[att1="val1"]。这样的匹配非常慢。更不要这样写:p[id="id1"]
。这样将 id selector
退化成 attribute selector
。
css
/* Bad */
p[id="id1"] {
color:red;
}
p[class="blog"] {
color:red;
}
/* Good */
#id1 {
color:red;
}
.blog {
color:red;
}
4.通常将浏览器前缀置于前面,将标准样式属性置于最后
例如:
css
.foo {
-moz-border-radius: 5px;
border-radius: 5px;
}
5.遵守 CSSLint 规则
css
font-faces 不能使用超过5个web字体
import 禁止使用@import
regex-selectors 禁止使用属性选择器中的正则表达式选择器
universal-selector 禁止使用通用选择器*
unqualified-attributes 禁止使用不规范的属性选择器
zero-units 0后面不要加单位
overqualified-elements 使用相邻选择器时,不要使用不必要的选择器
shorthand 简写样式属性
duplicate-background-images 相同的url在样式表中不超过一次
更多的 CSSLint 规则可以参阅:github.com/CSSLint/css...
6.不要使用 @import
使用 @import
引入 CSS
会影响浏览器的并行下载。使用 @import
引用的 CSS
文件只有在引用它的那个 CSS
文件被下载、解析之后,浏览器才会知道还有另外一个 CSS
需要下载,这时才去下载,然后下载后开始解析、构建 Render Tree
等一系列操作。
多个 @import
会导致下载顺序紊乱。在 IE
中,@import
会引发资源文件的下载顺序被打乱,即排列在 @import
后面的 JS
文件先于 @import
下载,并且打乱甚至破坏 @import
自身的并行下载。
html
<!-- 不使用 @import -->
<link rel="stylesheet" href="style.css">
<!-- 使用 @import -->
<style>
@import url("style.css");
</style>
7.避免过分重排(Reflow)
重排是指浏览器根据DOM结构和CSS样式计算元素的几何属性(如位置、大小等),过多的重排会影响渲染性能。应尽量避免频繁改变元素的样式或布局,可以通过批量修改样式、使用 CSS3 动画等方式来减少重排。
常见的重排元素:
css
width
height
padding
margin
display
border-width
border
top
position
font-size
float
text-align
overflow-y
font-weight
overflow
left
font-family
line-height
vertical-align
right
clear
white-space
bottom
min-height
8.依赖继承。
CSS中的继承可以减少对特定元素的样式定义,从而减少渲染时间。可以利用继承来减少对子元素的样式定义,让样式在DOM树中向下传递。
css
/* 利用继承减少样式定义 */
.parent {
color: red;
}
.child {
/* 子元素继承父元素的颜色 */
}
/* 不使用继承,直接定义子元素的样式 */
.parent {
/* ... */
}
.child {
color: red;
}
9.值缩写
使用值缩写可以减少CSS代码量,并且可以提高解析速度。例如,将margin-top: 10px; margin-right: 20px; margin-bottom: 10px; margin-left: 20px;
改为margin: 10px 20px;
。
这样可以减少代码量,提高解析速度。
css
/* 不使用值缩写 */
margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left: 20px;
/* 使用值缩写 */
margin: 10px 20px;
10. 避免耗性能的属性
一些CSS属性对于浏览器来说是比较昂贵的操作,会影响渲染性能。如果不是必要的话,应尽量避免使用这些属性。
例如,box-shadow
和border-radius
都是比较耗性能的属性。
css
/* 使用耗性能的属性 */
.box {
box-shadow: 0 0 5px rgba(0,0,0,0.5);
border-radius: 5px;
}
11. 背景图优化合并
将多个小背景图合并为一个大背景图可以减少请求次数和文件大小,提高加载速度。可以使用CSS的background-position
来定位合并后的背景图。
css
/* 不优化合并的背景图 */
.box1 {
background-image: url('image1.jpg');
/* ... */
}
.box2 {
background-image: url('image2.jpg');
/* ... */
}
/* 优化合并的背景图 */
.box {
background-image: url('combined.jpg');
/* ... */
}
/* 定位合并后的背景图 */
.box1 {
background-position: 0 0;
}
.box2 {
background-position: -100px 0;
}
12. 文件压缩
将多个CSS文件合并为一个文件,并进行压缩可以减少请求次数和文件大小,提高加载速度。可以使用工具如CSS压缩器来压缩CSS文件。
css
/* 不进行文件压缩和合并 */
<link rel="stylesheet" href="style1.css">
<link rel="stylesheet" href="style2.css">
/* 进行文件压缩和合并 */
<link rel="stylesheet" href="combined.min.css">