当前位置: 首页 > news >正文

优化 Web 性能:处理非合成动画(Non-Composited Animations)

在 Web 开发中,动画能够增强用户体验,但低效的动画实现可能导致性能问题。Google 的 Lighthouse 工具在性能审计中特别关注“非合成动画”(Non-Composited Animations),指出这些动画可能增加主线程负担,影响页面流畅性。本文将基于 Chrome 开发者文档,探讨非合成动画的影响、识别方法及优化策略,助你在2025年的 Web 项目中提升性能。


1. 什么是非合成动画?
1.1 定义

非合成动画(Non-Composited Animations)是指浏览器无法通过 GPU 合成(Compositing)直接处理的动画,而是需要主线程参与计算和重绘的动画。合成动画通常只涉及 transformopacity,而非合成动画涉及更多属性(如 widthtop)。

1.2 合成 vs 非合成
  • 合成动画:由 GPU 处理,仅更新图层位置或透明度,性能高效。
  • 非合成动画:由主线程计算布局(Layout)和绘制(Paint),开销大。
1.3 Lighthouse 的关注点

Lighthouse 检查页面中的动画,识别非合成属性,警告其可能导致的性能问题,如掉帧或卡顿。


2. 非合成动画的影响
2.1 主线程负担

非合成动画需要主线程重新计算布局和重绘,导致 CPU 使用率升高,尤其在低端设备上可能造成卡顿。

2.2 流畅性下降

动画帧率(FPS)下降,用户感知到不平滑的体验,影响“可交互时间”(TTI)。

2.3 性能得分降低

Lighthouse 的性能评分因非合成动画的低效性而下降,可能影响用户满意度。


3. 如何识别非合成动画?
3.1 使用 Lighthouse
  1. 打开 Chrome 开发者工具(F12)。
  2. 切换到“Lighthouse”选项卡。
  3. 选择“性能”类别,生成报告。
  4. 查看“诊断”下的“避免非合成的动画”(Avoid Non-Composited Animations),列出问题属性及动画。
3.2 使用开发者工具
  • 在“性能”面板中录制动画,检查是否有频繁的“Layout”或“Paint”调用。
  • 在“层”(Layers)面板中,确认动画元素是否独立合成。
3.3 检查 CSS

查看动画使用的属性是否超出 transformopacity


4. 优化非合成动画的策略
4.1 使用合成友好属性

将动画限制在 transformopacity

.box {
    animation: move 2s infinite;
}
@keyframes move {
    from { transform: translateX(0); }
    to { transform: translateX(100px); }
}
  • 替代:
    • lefttransform: translateX
    • background-coloropacity(若适用)。
4.2 启用 GPU 加速

添加 will-changetransform 触发合成:

.box {
    will-change: transform;
    animation: move 2s infinite;
}
  • 注意:避免滥用 will-change,仅用于动画元素。
4.3 检查触发布局的属性

避免在动画中使用以下属性:

  • widthheighttopleft
  • marginpadding
  • 示例优化:
    /* 低效 */
    @keyframes grow {
        from { width: 100px; }
        to { width: 200px; }
    }
    /* 高效 */
    @keyframes grow {
        from { transform: scaleX(1); }
        to { transform: scaleX(2); }
    }
    
4.4 使用 JavaScript 优化

通过 requestAnimationFrame 控制动画:

const box = document.querySelector('.box');
let pos = 0;
function animate() {
    pos += 1;
    box.style.transform = `translateX(${pos}px)`;
    requestAnimationFrame(animate);
}
animate();
4.5 测试和验证
  • 使用“渲染”面板中的“帧率”(FPS)工具,确认动画流畅性。
  • 确保优化后视觉效果一致。

5. 示例:优化前后对比
优化前
.box {
    animation: slide 2s infinite;
}
@keyframes slide {
    from { left: 0; }
    to { left: 100px; }
}
  • 主线程调用:Layout + Paint。
  • FPS:30(卡顿)。
优化后
.box {
    will-change: transform;
    animation: slide 2s infinite;
}
@keyframes slide {
    from { transform: translateX(0); }
    to { transform: translateX(100px); }
}
  • 主线程调用:仅合成。
  • FPS:60(流畅)。
效果
  • 主线程阻塞时间从 50ms 降至 0ms。
  • Lighthouse 性能得分提升 5-10 分。

6. 注意事项
  • 兼容性transformopacity 在现代浏览器中广泛支持。
  • 过度优化:避免为所有元素添加 will-change,增加 GPU 负担。
  • 测试:在低端设备上验证动画效果。

7. 总结

非合成动画是 Web 性能优化的常见问题,通过使用合成友好属性和 GPU 加速,可以显著降低主线程负担,提升动画流畅性。Lighthouse 的审计为我们提供了优化方向,而本文介绍的策略则是实践指南。


文章转载自:
http://chopsticks.ciuzn.cn
http://amenorrhea.ciuzn.cn
http://cerebrospinal.ciuzn.cn
http://cartage.ciuzn.cn
http://cablet.ciuzn.cn
http://birthright.ciuzn.cn
http://affidavit.ciuzn.cn
http://antiscorbutic.ciuzn.cn
http://blenheim.ciuzn.cn
http://ayah.ciuzn.cn
http://artwork.ciuzn.cn
http://assuage.ciuzn.cn
http://cetology.ciuzn.cn
http://buckram.ciuzn.cn
http://carbamoyl.ciuzn.cn
http://antipathetic.ciuzn.cn
http://antipolitician.ciuzn.cn
http://bimorph.ciuzn.cn
http://caravaggesque.ciuzn.cn
http://alphabet.ciuzn.cn
http://abranchiate.ciuzn.cn
http://castaneous.ciuzn.cn
http://attune.ciuzn.cn
http://asking.ciuzn.cn
http://characterful.ciuzn.cn
http://abattis.ciuzn.cn
http://arcticologist.ciuzn.cn
http://anilinctus.ciuzn.cn
http://airboat.ciuzn.cn
http://bemusement.ciuzn.cn
http://www.dtcms.com/a/113953.html

相关文章:

  • Java的Selenium基本元素定位(findElement方法)
  • leetcode-动态规划20
  • 15-SpringBoot3入门-MyBatis-Plus基于service层的CRUD
  • 数据结构与算法学习笔记----贪心·排序不等式
  • CSS Text(文本)学习笔记
  • es基本概念
  • (蓝桥杯)岛屿个数
  • 树莓集团多方位拓展:园区服务及人才培养的协同发展
  • 博客文章:深入分析 PyMovie - 基于 Python和 MoviePy 的视频管理工具
  • YY forget password
  • 学透Spring Boot — 013. Spring Web-Flux 函数式风格的控制器
  • 用Python解锁未来交通:开发基于机器学习的流量预测系统
  • Java程序设计第1章:概述
  • LeetCode 249 解法揭秘:如何把“abc”和“bcd”分到一组?
  • 蓝桥杯2024年第十五届省赛真题-数字接龙
  • 辅助查询是根据查询到的文档片段再去生成新的查询问题
  • 解决Spring Boot Test中的ByteBuddy类缺失问题
  • 【TI MSPM0】ADC DAC学习
  • Java中的四大引用类型详解
  • 【34期获取股票数据API接口】如何用Python、Java等五种主流语言实例演示获取股票行情api接口之沪深A股当天分时成交数据及接口API说明文档
  • SpringBoot启动run方法分析
  • 配置管理:夯实软件开发与运维根基
  • 实体类设计规范
  • [Deep-ML]Transpose of a Matrix(矩阵的转置)
  • HikariCP 源码核心设计解析与 ZKmall开源商城场景调优实践
  • 【LLM】MCP(Python):实现 stdio 通信的Client与Server
  • 经典算法 a^b
  • FreeRTOS 软件定时器工作原理及应用
  • 【嵌入式学习5】PyQt布局- 信号和槽 - 按钮 - 对话框 - 面向对象
  • 无招回归阿里