⚡ 第十五章:性能优化与调试

优化 CSS 性能,提升网页加载速度

15.1 减少重绘 (Repaint) 与回流 (Reflow)

重绘和回流是影响页面性能的重要因素,需要尽量减少它们的发生。

重绘 vs 回流

类型 描述 影响
回流 (Reflow) 布局发生变化,需要重新计算元素位置和大小 高,影响整个页面
重绘 (Repaint) 外观发生变化,不需要重新计算布局 中,影响部分元素

触发回流的操作

触发重绘的操作

优化策略

/* 不好的做法 */
for (let i = 0; i < 1000; i++) {
    element.style.left = i + 'px';
    element.style.top = i + 'px';
}

/* 好的做法 */
element.style.transform = 'translate(' + i + 'px, ' + i + 'px)';
最佳实践:使用 transform 和 opacity 进行动画,因为它们不会触发回流,只会触发重绘。

15.2 关键 CSS (Critical CSS)

关键 CSS 是指首屏渲染所必需的 CSS,应该内联到 HTML 中以加快首屏加载速度。

提取关键 CSS

  1. 识别首屏可见的元素
  2. 提取这些元素的 CSS
  3. 内联到 HTML 的 <style> 标签中
  4. 其余 CSS 异步加载
/* HTML 中内联关键 CSS */
<style>
    body {
        font-family: Arial, sans-serif;
        line-height: 1.6;
    }
    
    .header {
        background: #3498db;
        color: white;
        padding: 20px;
    }
    
    .hero {
        height: 500px;
        background: #f8f9fa;
        display: flex;
        align-items: center;
        justify-content: center;
    }
</style>

/* 异步加载其余 CSS */
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"</link></noscript>

15.3 未使用的 CSS 检测

工具

使用 PurgeCSS

/* package.json */
{
  "scripts": {
    "build": "purgecss --css styles.css --content index.html --output purified.css"
  }
}

15.4 Chrome DevTools 高级调试技巧

Layers 面板

查看页面的图层信息,优化图层使用。

  1. 打开 Chrome DevTools
  2. 点击 More Tools → Layers
  3. 查看图层分布和合成信息

Animation 面板

分析和调试动画性能。

  1. 打开 Chrome DevTools
  2. 点击 More Tools → Animations
  3. 录制和分析动画

Performance 面板

分析页面加载和运行时性能。

  1. 打开 Chrome DevTools
  2. 点击 Performance
  3. 点击 Record 开始录制
  4. 刷新页面或执行操作
  5. 点击 Stop 查看分析结果

性能优化矩阵

CSS 性能优化影响因素

高影响:选择器复杂度、重排操作、大型 CSS 文件
中等影响:字体加载、背景图片大小、动画性能
低影响:注释数量、代码格式、变量使用

实战案例

优化选择器

/* 不好的做法 */
div.container > ul.menu > li.item > a.link {
    color: #333;
}

/* 好的做法 */
.menu__link {
    color: #333;
}

使用 CSS 硬件加速

/* 触发硬件加速 */
.element {
    transform: translateZ(0);
    will-change: transform;
}

减少 CSS 文件大小

/* 压缩前 */
body {
    font-family: Arial, sans-serif;
    font-size: 16px;
    line-height: 1.6;
    color: #333;
    background: #fff;
}

/* 压缩后 */
body{font-family:Arial,sans-serif;font-size:16px;line-height:1.6;color:#333;background:#fff}

动手练习

练习 1:减少重绘和回流

  1. 创建一个动画效果
  2. 使用 transform 和 opacity 实现
  3. 使用 Chrome DevTools 分析性能

练习 2:提取关键 CSS

  1. 创建一个简单的页面
  2. 识别首屏必需的 CSS
  3. 内联关键 CSS 并异步加载其余 CSS
  4. 测试加载性能

练习 3:使用 Chrome DevTools

  1. 打开一个网页
  2. 使用 Coverage 面板检测未使用的 CSS
  3. 使用 Performance 面板分析性能
  4. 使用 Layers 面板查看图层信息