CSS 性能优化

通过内联关键 CSS、异步加载、选择器优化等方式提升页面渲染性能

问题

如何使用 CSS 提高页面性能?

解答

CSS 作为页面渲染和内容展现的重要环节,直接影响用户体验。以下是几种有效的优化方式。

内联首屏关键 CSS

将首屏关键 CSS 直接内联到 HTML 中,使浏览器下载完 HTML 后立即渲染,无需等待外部 CSS 文件下载。

<head>
  <style>
    /* 首屏关键样式 */
    .header { height: 60px; background: #fff; }
    .hero { min-height: 400px; }
  </style>
</head>

注意:只内联首屏必需的样式,大量 CSS 代码不适合内联,会增加 HTML 体积且无法缓存。

异步加载 CSS

非首屏 CSS 可以异步加载,避免阻塞页面渲染。

方式一:JavaScript 动态插入

const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'styles.css';
document.head.appendChild(link);

方式二:使用 media 属性

<link rel="stylesheet" href="styles.css" media="print" onload="this.media='all'">

方式三:使用 alternate

<link rel="alternate stylesheet" href="styles.css" onload="this.rel='stylesheet'">

资源压缩

使用 webpack、gulp、rollup 等工具压缩 CSS 文件,减小文件体积,降低加载时间。

// webpack 配置示例
module.exports = {
  optimization: {
    minimize: true
  }
};

合理使用选择器

CSS 选择器匹配规则是从右往左,嵌套层级越多,匹配成本越高。

/* 不推荐:层级过深 */
#markdown .content .article h3 span { }

/* 推荐:简化层级 */
.article-title { }

优化规则:

  • 避免嵌套超过三层
  • 使用 id 选择器时无需再嵌套
  • 避免使用通配符和属性选择器

减少使用昂贵的属性

以下属性在重绘时会降低渲染性能,应谨慎使用:

  • box-shadow
  • border-radius
  • filter
  • opacity
  • :nth-child

避免使用 @import

@import 会阻止浏览器并行下载,增加页面加载延迟。

/* 不推荐 */
@import url("reset.css");

/* 推荐:使用 link 标签 */
<link rel="stylesheet" href="reset.css">
<link rel="stylesheet" href="main.css">

其他优化技巧

  • 使用 CSS Sprite 合并小图标,减少 HTTP 请求
  • 将小图标转为 base64 编码内联
  • CSS3 动画优先使用 transformopacity,避免使用 lefttop
  • 利用 CSS 继承特性,避免重复编写可继承属性
  • 减少重排和重绘操作

关键点

  • 内联首屏关键 CSS,异步加载非首屏样式
  • 简化选择器层级,避免使用低效选择器
  • 使用 link 标签而非 @import 引入样式
  • 谨慎使用 box-shadow、filter 等昂贵属性
  • 压缩 CSS 文件,合并图标资源