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

优化 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 ToolsLayers
  3. 查看图层分布和合成信息

Animation 面板

分析和调试动画性能。

  1. 打开 Chrome DevTools
  2. 点击 More ToolsAnimations
  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 面板查看图层信息