Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • CSS
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《JavaScript教程》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • CSS
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • CSS

    • CSS教程和技巧收藏
    • css块元素和行内元素
    • 盒子模型
    • BFC和IFC
    • 字体font-weight相关知识
    • CSS-function汇总
    • CSS3之has函数的使用
    • CSS3之transition过渡
    • CSS3之animation动画
    • css动画性能优化
      • flex布局语法
      • flex布局案例
      • Grid布局语法
      • flex布局和grid布局的区别
      • 「布局技巧」图片未加载前自动撑开元素高度
      • 文字在一行或多行时超出显示省略号
      • 水平垂直居中的几种方式-案例
      • 如何根据系统主题自动响应CSS深色模式
      • 工作中遇到的css问题记录
      • 今天总结一下用到的css吧
    • 页面
    • CSS
    mamingjuan
    2023-09-15
    目录

    css动画性能优化

    # css动画如何优化性能

    在现代前端开发中,CSS 动画是提高用户体验和界面互动性的强大工具,但如果使用不当,它们也可能导致性能问题,特别是在复杂页面和低性能设备上。 因此,合理优化 CSS 动画,确保动画平滑流畅至关重要。

    下面是一些常见的 CSS 动画优化技巧,让你在面试中既能展示对动画的理解,又能展示出你对性能优化的敏锐度。


    # 1. 避免使用影响回流和重绘的属性

    在 CSS 动画中,某些属性会触发 回流(reflow)和 重绘(repaint),这些都会导致浏览器性能下降。

    # 避免动画以下属性:

    • width、height:改变元素的尺寸会导致回流。
    • top、left:改变元素位置时会影响布局,可能会触发回流。
    • padding、margin:这些会影响周围元素的排列,也会导致回流。
    • border:边框的变化也会导致回流和重绘。

    # 优先使用以下属性来做动画:

    • transform:只会触发 重绘,不会引起回流。使用 translate、scale、rotate 等 transform 动画能大大提升性能。
    • opacity:改变透明度不会影响布局,也不会引发回流,通常是性能友好的动画。
    # 示例:
    /* 好的动画,使用 transform 和 opacity */
    .element {
      animation: move 1s ease-in-out;
    }
    
    @keyframes move {
      0% {
        transform: translateX(0);
        opacity: 1;
      }
      100% {
        transform: translateX(100px);
        opacity: 0.5;
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    # 2. 使用 will-change 提前告知浏览器

    will-change 是一个 CSS 属性,可以提前告知浏览器你将要改变哪些属性,从而优化渲染性能。

    # 使用时机:

    • 仅当元素需要在短时间内进行动画或过渡时,使用 will-change。
    • 过度使用 will-change 会导致内存占用增加,因为它会触发硬件加速。
    # 示例:
    .element {
      will-change: transform, opacity;
    }
    
    1
    2
    3
    # 注意:
    • 只在需要时使用 will-change,过度使用会导致性能下降。
    • 使用后,确保在动画结束后去除 will-change。

    # 3. 使用硬件加速(transform + opacity)

    硬件加速通过将元素交给 GPU 来处理,避免了 CPU 渲染,从而提高渲染效率。

    # 如何启用硬件加速:

    • 使用 transform(如 translate3d)代替 left、top 和 position。
    • 使用 opacity 做透明度变化,而不是 visibility。
    # 示例:
    /* 使用 transform 进行平移,而不是改变 left/top */
    .element {
      transform: translate3d(0, 0, 0); /* 使用 translate3d 激活 GPU 加速 */
    }
    
    1
    2
    3
    4
    # 原理:
    • translate3d(0, 0, 0) 的作用是强制让浏览器将该元素交给 GPU 进行渲染(即硬件加速)。
    • 这不会改变元素的位置,只是触发硬件加速。

    # 4. 使用 requestAnimationFrame 做 JavaScript 动画优化

    虽然这个问题主要是关于 CSS 动画,但对于复杂的动画,JavaScript 动画(如用 requestAnimationFrame)也可以配合 CSS 动画使用,以更好地控制帧率。

    # 为什么使用 requestAnimationFrame:

    • 它在浏览器的每一帧上调用,能提供平滑的动画效果,并且它会自动优化动画的帧率,避免了过度渲染。
    • 使用 requestAnimationFrame 可以让你更精细地控制动画的开始、暂停、终止等。
    # 示例:
    let start = null;
    
    function animate(timestamp) {
      if (!start) start = timestamp;
      let progress = timestamp - start;
      document.querySelector('.element').style.transform = `translateX(${Math.min(progress / 10, 300)}px)`;
    
      if (progress < 3000) { // 动画持续3秒
        requestAnimationFrame(animate);
      }
    }
    
    requestAnimationFrame(animate);
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    # 5. 避免过度使用动画

    • 限制动画数量:多个动画同时运行会消耗更多资源,导致性能下降。减少页面上的动画数量,保持简洁。
    • 减少动画持续时间:不需要每个动画都保持很长时间,通常 300-500ms 的动画效果足够流畅。
    • 只对用户交互动画进行优化:例如点击、悬停等交互动画通常是用户关注的焦点,其他不重要的动画可以考虑禁用。

    # 6. 动画性能测试与调优

    # 工具:

    • Chrome DevTools Performance 面板:查看 CSS 动画的性能瓶颈,找出哪些动画或者样式计算造成了性能瓶颈。
    • Lighthouse:分析页面的动画和渲染性能,提供优化建议。

    # 通过 Lighthouse 检查动画流畅性:

    Lighthouse 会给出页面的 FCP(首次内容绘制)、LCP(最大内容绘制)、**CLS(布局偏移)**等指标,能有效帮助你评估动画对页面性能的影响。


    # 总结

    # 动画性能优化要点:

    1. 避免使用会触发回流和重绘的属性(width、height、top、left 等),优先使用 transform 和 opacity。
    2. 使用 will-change 预告哪些属性会发生变化,帮助浏览器优化渲染。
    3. 启用 硬件加速,使用 transform 和 opacity 代替传统的布局属性。
    4. 对于复杂动画,使用 requestAnimationFrame 控制帧率,提升动画流畅度。
    5. 减少不必要的动画,避免页面上有过多同时运行的动画,保持页面简洁。
    上次更新: 2025/11/25, 03:09:18
    CSS3之animation动画
    flex布局语法

    ← CSS3之animation动画 flex布局语法→

    Copyright © 2015-2025 Glitz Ma
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式