js 实现动画的两种方案对比:setTimeout vs RAF (requestAnimationFrame)

简介: js 实现动画的两种方案对比:setTimeout vs RAF (requestAnimationFrame)

setTimeout

需手动控制频率,页面隐藏后仍会执行动画,更加耗费性能。

requestAnimationFrame

简称 RAF , 会在浏览器中每次刷新屏幕时调用一个函数,用于创建平滑的动画,因为它会自动适应屏幕的刷新率,无需手动控制频率。在页面隐藏时,自动暂停动画。

RAF动画 vs CSS动画

requestAnimationFrame通常用于需要高度控制动画的场景,例如游戏或者复杂的数据可视化。而CSS动画则更多用于简单的静态或者中等复杂度的动画设计。在性能上,当不需要高度控制或者频繁更新视图时,使用CSS动画是更好的选择,因为浏览器可以进行更多的优化。而requestAnimationFrame则更适合于需要实时更新视图的场景。

效果预览

演示代码

<template>
  <div>
    <div class="demoBox" :style="{ width: width + 'px' }"></div>

    <button @click="setTimeout_animate">使用 setTimeout 执行动画</button>

    <button @click="ref_animate">使用 ref 执行动画</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      width: 20,
      maxWidth: 620,
    };
  },

  mounted() {
    // 4s 把宽度从 20px 变为 620px ,即增加 600px,每次需变化  600 px / (60帧/秒 *4秒) = 15px/帧
    // 60帧/s 才能确保动画流畅, 即每 1000/60 = 16.7 ms 执行一次动画
    // 得出最终动画效果为  每 16.7 ms , 宽度增加15px
    // this.setTimeout_animate();
  },

  methods: {
    setTimeout_animate() {
      if (this.width < this.maxWidth) {
        setTimeout(this.setTimeout_animate, 16.7); // 时间需要自己控制

        this.width += 15;
      } else {
        this.width = 20;
      }
    },
    ref_animate() {
      if (this.width < this.maxWidth) {
        requestAnimationFrame(this.ref_animate); // 时间不用自己控制
        this.width += 15;
      } else {
        this.width = 20;
      }
    },
  },
};
</script>
<style scoped>
.demoBox {
  height: 30px;
  background-color: red;
  margin: 20px;
}
</style>

目录
相关文章
|
6天前
|
自然语言处理 JavaScript 前端开发
一文梳理JavaScript中常见的七大继承方案
该文章系统地概述了JavaScript中七种常见的继承模式,包括原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合继承等,并探讨了每种模式的实现方式及其优缺点。
一文梳理JavaScript中常见的七大继承方案
|
9天前
|
前端开发 数据可视化 开发者
D3.js 内置的动画函数
D3.js 内置的动画函数
|
9天前
|
JavaScript 前端开发
JS配合CSS3实现动画和拖动小星星小Demo
本文通过代码示例展示了如何使用JavaScript和CSS3实现动画效果和拖动小星星的交互效果,包括文字掉落动画和鼠标拖动产生小星星动画的实现方法。
23 0
JS配合CSS3实现动画和拖动小星星小Demo
|
2月前
|
JavaScript 前端开发 UED
Vue.js动画魔法:解锁流畅过渡,让每一次交互都成为用户心中的小确幸!
【8月更文挑战第30天】在Vue.js中,动画与过渡效果不仅是视觉点缀,更是提升用户体验的关键。通过流畅的动态效果,应用的互动性和吸引力得以增强,从而提高用户满意度和参与度。`&lt;transition&gt;`和`&lt;transition-group&gt;`组件结合CSS过渡,可轻松实现元素的进入、离开及列表变化动画。合理的性能优化,如使用硬件加速,能避免页面卡顿,确保动画既美观又高效。下面是一个简单的淡入淡出效果示例,展示了如何利用Vue.js实现平滑的动画过渡。总之,恰当的动画设计能显著提升应用的用户体验。
41 0
Vue.js动画魔法:解锁流畅过渡,让每一次交互都成为用户心中的小确幸!
|
2月前
|
JavaScript 前端开发 C++
【Vue.js的终极对决】服务端渲染VS客户端渲染:一场关乎速度与SEO的生死较量!
【8月更文挑战第30天】Vue.js 是一个流行的 JavaScript 框架,支持服务端渲染(SSR)和客户端渲染。SSR 在服务器生成完整 HTML,有利于 SEO 并缩短首屏加载时间,但增加服务器负担;客户端渲染则在浏览器生成页面,提升交互性,降低服务器负载。本文通过代码示例对比两者优劣,并提供选择指南,帮助开发者根据 SEO 需求、交互性需求及服务器资源等条件,选择合适的渲染方式,从而优化应用性能和用户体验。
40 0
|
2月前
|
JavaScript 前端开发
动态背景,视觉盛宴:JavaScript动画让网页活起来!
动态背景,视觉盛宴:JavaScript动画让网页活起来!
|
2月前
|
移动开发 JavaScript 前端开发
基于CSS3、原生JS、Vue3.0技术各自实现序列帧动画效果
这篇文章展示了如何使用纯CSS3、原生JavaScript以及Vue 3.0技术来实现序列帧动画效果,并通过代码示例和动画效果展示了每种方法的实现过程和最终效果。
64 0
|
3月前
|
缓存 监控 JavaScript
常见的JS优化方案都有那些
【7月更文挑战第7天】 JavaScript优化包括代码优化(箭头函数、解构赋值、模板字面量、展开运算符、高阶函数)、DOM操作优化(减少操作、事件委托、节流防抖)、异步优化(Promise、Web Workers)、缓存策略(结果缓存、HTTP缓存)、压缩合并以及性能分析和监控。通过这些方法,提升网页性能和用户体验。
26 1
|
3月前
|
开发框架 前端开发 JavaScript
循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果
循序渐进BootstrapVue,开发公司门户网站(2)--- 使用wow.js动画组件以及自定义的CSS样式处理动态效果
|
3月前
|
JavaScript
JS【详解】setTimeout 延时(含清除 setTimeout,计时开始时间,0 秒延时解析,多 setTimeout 执行顺序,setTimeout 应用场景,网红面试题)
JS【详解】setTimeout 延时(含清除 setTimeout,计时开始时间,0 秒延时解析,多 setTimeout 执行顺序,setTimeout 应用场景,网红面试题)
372 0