提升用户体验之requestAnimationFrame实现前端动画
1)requestAnimationFrame是什么?
1.MDN官方解释

2.解析这段话:
1、那么浏览器重绘是指什么呢?
——大多数电脑的显示器刷新频率是60Hz,1000ms/60=16.66666667ms的时间刷新一次
2、重绘之前调用指定的回调函数更新动画?
——requestAnimationFrame 会把每一帧中的所有 DOM 操作集中起来,在一次重绘或回流中 紧跟随浏览器的刷新频率 去完成操作。
2)基础用法
<script setup>
let animationRef
const goStart = () => {const cb = () => {// 写入DOM 操作会在每一次浏览器刷新之前执行❤requestAnimationFrame(cb)}// 开启动画animationRef = requestAnimationFrame(cb)
}
const goEnd = () => {// 取消动画cancelAnimationFrame(animationRef)
}
</script>
3)requestAnimationFrame的优点
1.传统实现JS动画
通常情况下,实现动画能使用css实现的就使用css,不能的css实现的再使用JS实现。
我们实现JS动画,会使用setTimeout和setInterval。
而setTimeout和setInterval的使用是存在问题的,导致丢帧。
①间隔时间不好确定,前面也提到大多数电脑的显示器刷新频率是60Hz,1000ms/60,定时器的间隔时间设置过长或者过短都无法匹配上刷新频率,推荐的最佳循环间隔17ms。
②MDN指出定时器实际延长时间比设定值长一些。常见的几种情况,嵌套超时、非活动标签的超时、追踪型脚本的节流、超时延迟等…一个浏览器的线程队列中任务
这里就不过多赘述,可以到以下链接阅读 https://developer.mozilla.org/zh-CN/docs/Web/API/setTimeout
其实就是当线程忙碌时,定时器会等待线程队列中的任务执行后再执行。
所以定时器动画,视觉上看来,就是一盹一盹…的效果。
2.requestAnimationFrame
而requestAnimationFrame由浏览器专门为动画提供的 API,就是为了解决这类问题,提升用户体验的。
且我们切换到其他页面时,requestAnimationFrame会暂停下来,直到我们回到该页面后,动画会从暂停的位置继续执行。
3.应用场景

会用一定卡顿,可以到我的github下载代码运行看效果。
https://github.com/wwaini/tao-vue3/tree/release240625
<template><div class="btn"><el-button @click="goStart">开始</el-button><el-button @click="goEnd">停止</el-button></div><div class="a-box">定时器</div><div class="b-box">requestAnimationFrame</div>
</template>
<script setup>
import { ref } from 'vue'
let leftNum = ref(0)
let flag = ref(false) // 定时器动画停止标识
let timmer // 定时器
let animationRef // requestAnimationFrame存储
// 定时器动画事件
const goAStart = () => {let dom = document.getElementsByClassName('a-box')dom[0].style.width = '10px'timmer = setInterval(() => {leftNum.value = parseInt(dom[0].style.width)if (leftNum.value > 800 || flag.value) {clearInterval(timmer)} else {dom[0].style.width = (leftNum.value + 3) + 'px'console.log(dom[0].style.width);}}, 17);
}
const goAEnd = () => {clearInterval(timmer)
}
// requestAnimationFrame动画事件
const goBStart = () => {let dom = document.getElementsByClassName('b-box')dom[0].style.width = '10px'const cb = () => {leftNum.value = parseInt(dom[0].style.width)if (leftNum.value > 800) {} else {dom[0].style.width = (leftNum.value + 3) + 'px'console.log(dom[0].style.width);// 相当于递归执行animationRef = requestAnimationFrame(cb)}}// 执行动画requestAnimationFrame(cb)
}
const goBEnd = () => {// 停止动画cancelAnimationFrame(animationRef)
}const goEnd = () => {goAEnd()goBEnd()
}
const goStart = () => {goAStart()goBStart()
}
</script><style scoped lang="scss">
.btn {text-align: center;margin-bottom: 20px;
}.a-box {width: 20px;height: 80px;background-color: pink;position: absolute;
}.b-box {width: 20px;height: 80px;background-color: blueviolet;color: #fff;position: absolute;top: 120px;
}
</style>
4)requestAnimationFrame兼容性

相关文章:
提升用户体验之requestAnimationFrame实现前端动画
1)requestAnimationFrame是什么? 1.MDN官方解释 2.解析这段话: 1、那么浏览器重绘是指什么呢? ——大多数电脑的显示器刷新频率是60Hz,1000ms/6016.66666667ms的时间刷新一次 2、重绘之前调用指定的回调函数更新动画? ——requ…...
Mysql慢日志、慢SQL
慢查询日志 查看执行慢的SQL语句,需要先开启慢查询日志。 MySQL 的慢查询日志,记录在 MySQL 中响应时间超过阀值的语句(具体指运行时间超过 long_query_time 值的SQL。long_query_time 的默认值为10,意思是运行10秒以上(不含10秒…...
卫星网络——Walker星座简单介绍
一、星座构型介绍 近年来,随着卫星应用领的不断拓展,许多任务已经无法单纯依靠单颗卫星来完成。与单个卫星相比,卫星星座的覆盖范围显著增加,合理的星座构型可以使其达到全球连续覆盖或全球多重连续覆盖,这样的特性使得…...
C++ Lambda表达式第一篇, 闭合(Closuretype)
C Lambda表达式第一篇, 闭合Closuretype ClosureType::operator()(params)auto 模板参数类型显式模板参数类型其他 ClosureType::operator ret(*)(params)() lambda 表达式是唯一的未命名,非联合,非聚合类类型(称为闭包类型&#…...
移动校园(3):处理全校课程数据excel文档,实现空闲教室查询与课程表查询
首先打开教学平台 然后导出为excel文档 import mathimport pandas as pd import pymssql serverName 127.0.0.1 userName sa passWord 123456 databaseuniSchool conn pymssql.connect(serverserverName,useruserName,passwordpassWord,databasedatabase) cursor conn.cur…...
【MySQL】1.初识MySQL
初识MySQL 一.MySQL 安装1.卸载已有的 MySQL2.获取官方 yum 源3.安装 MySQL4.登录 MySQL5.配置 my.cnf 二.MySQL 数据库基础1.MySQL 是什么?2.服务器,数据库和表3.mysqld 的层状结构4.SQL 语句分类 一.MySQL 安装 1.卸载已有的 MySQL //查询是否有相关…...
查看电脑显卡(NVIDIA)应该匹配什么版本的CUDA Toolkit
被串行计算逼到要吐时,决定重拾CUDa了,想想那光速般的处理感觉(夸张了)不要太爽,记下我的闯关记录。正好我的电脑配了NVIDIA独显,GTX1650,有菜可以炒呀,没有英伟达的要绕道了。回到正…...
优化:遍历List循环查找数据库导致接口过慢问题
前提: 我们在写查询的时候,有时候会遇到多表联查,一遇到多表联查大家就会直接写sql语句,不会使用较为方便的LambdaQueryWrapper去查询了。作为一个2024新进入码农世界的小白,我喜欢使用LambdaQueryWrapper,…...
NoSQL 之 Redis 配置与常用命令
一、关系型数据库与非关系型数据库 1、数据库概述 (1)关系型数据库 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记 录。 SQL 语句(标准数据查询语言&am…...
用SpringBoot打造坚固防线:轻松实现XSS攻击防御
在这篇博客中,我们将深入探讨如何使用SpringBoot有效防御XSS攻击。通过结合注解和过滤器的方式,我们可以为应用程序构建一个强大的安全屏障,确保用户数据不被恶意脚本所侵害。 目录 什么是XSS攻击?SpringBoot中的XSS防御策略使用…...
2024机器人科研/研发领域最新研究方向岗位职责与要求
具身智能工程师 从事具身智能领域的技术研究或产品开发,制定具身智能技术标准,利用大模型技术来提高机器人的智能化水平,研究端云协同的机器人系统框架,并赋能人形/复合等各类形态的机器人。具体内容包括不限于: 1、负…...
笔记:Newtonsoft.Json 序列化接口集合
在使用 Newtonsoft.Json 序列化接口集合时,一个常见的挑战是如何处理接口的具体实现,因为接口本身并不包含关于要实例化哪个具体类的信息。为了正确序列化和反序列化接口集合,你需要提供一些额外的信息或使用自定义的转换器来指导 Newtonsoft…...
【Unity设计模式】✨使用 MVC 和 MVP 编程模式
前言 最近在学习Unity游戏设计模式,看到两本比较适合入门的书,一本是unity官方的 《Level up your programming with game programming patterns》 ,另一本是 《游戏编程模式》 这两本书介绍了大部分会使用到的设计模式,因此很值得学习 本…...
CDH安装和配置流程
这份文件是一份关于CDH(Clouderas Distribution Including Apache Hadoop)安装的详细手册,主要内容包括以下几个部分: 1. **前言**: - CDH是基于Apache Hadoop的发行版,由Cloudera公司开发。 - 相比…...
SpringMVC:SpringMVC执行流程
文章目录 一、介绍二、什么是MVC 一、介绍 Spring MVC 是一种基于Java的Web框架,它采用了MVC(Model - View - Controller)设计模式,通过吧Model、View和Controller分离,将Web层进行职责解耦,把复杂的Web应…...
如何在前端网页实现live2d的动态效果
React如何在前端网页实现live2d的动态效果 业务需求: 因为公司需要做机器人相关的业务,主要是聊天形式的内容,所以需要一个虚拟的卡通形象。而且为了更直观的展示用户和机器人对话的状态,该live2d动画的嘴型需要根据播放的内容来…...
昇思25天学习打卡营第15天|linchenfengxue
Pix2Pix实现图像转换 Pix2Pix概述 Pix2Pix是基于条件生成对抗网络(cGAN, Condition Generative Adversarial Networks )实现的一种深度学习图像转换模型,该模型是由Phillip Isola等作者在2017年CVPR上提出的,可以实现语义/标签到…...
软考中级数据库系统工程师备考经验分享
前几天软考成绩出了,赶紧查询了一下发现自己顺利通过啦(上午63,下午67,开心),因此本文记录一下我的备考经验分享给大家。因为工作中项目管理类的知识没有系统学习过,本来想直接报名软考高级证书…...
Centos7删除MariaDB
在 CentOS 7 上删除 MariaDB 可以通过 yum 包管理器来完成。以下是一步一步的指导: 打开终端:首先,你需要打开你的 CentOS 7 系统的终端。 停止 MariaDB 服务(如果正在运行):在卸载 MariaDB 之前ÿ…...
【Docker系列】Docker 镜像构建中的跨设备移动问题及解决方案
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
终极指南:如何用Scream实现Windows音频网络共享
终极指南:如何用Scream实现Windows音频网络共享 【免费下载链接】scream Virtual network sound card for Microsoft Windows 项目地址: https://gitcode.com/gh_mirrors/sc/scream 想要将Windows电脑的音频无线传输到其他设备?厌倦了复杂的音频线…...
软件测试高频面试题 2026 最新整理(功能 + 自动化)
目录 一、功能测试高频题(必背) 1. 什么是软件测试?测试的目的是什么? 2. 黑盒测试 vs 白盒测试,区别与适用场景? 3. 测试用例设计方法有哪些?各适合什么场景? 4. 一个完整的测试用例包含哪些要素? 5. 什么是 Bug?Bug 的生命周期是什么? 6. 功能测试的核心流…...
Axios知识
安装:npm方式:npm install axios直接方式:<script src"https://unpkg.com/axios/dist/axios.min.js"></script>实例:// 发起一个post请求 axios({method: post,url: /user/12345,data: { // 向后端传参数firstName: Fr…...
保姆级教程:在Android项目中集成微信Matrix性能监控框架(含避坑指南)
Android性能监控实战:微信Matrix框架深度集成指南 在移动应用开发领域,性能优化始终是开发者面临的核心挑战之一。微信开源的Matrix框架作为一套全平台性能监控工具链,为Android开发者提供了从方法耗时、ANR检测到内存泄漏分析等全方位的监控…...
springboot+vue基于web的社区交互图书管理系统的设计系统
目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块划分关键技术实现数据库设计要点社区交互设计安全防护措施项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块划分 后…...
通义千问1.5-1.8B-Chat-GPTQ-Int4在MySQL数据库中的智能应用
通义千问1.5-1.8B-Chat-GPTQ-Int4在MySQL数据库中的智能应用 让数据库听懂人话,让查询像聊天一样简单 你有没有遇到过这样的情况:面对复杂的业务数据,明明知道想要什么结果,却不知道怎么写SQL语句?或者看着慢查询日志头…...
超越GUI:用Tcl命令流高效编辑Tessent DftSpecification的三种进阶玩法
超越GUI:用Tcl命令流高效编辑Tessent DftSpecification的三种进阶玩法 在大型SoC项目中,频繁修改IJTAG网络结构是每位资深DFT工程师的日常。当设计迭代进入深水区,图形界面操作和手动文本编辑的效率瓶颈会愈发明显——每次增减SIB、调整TDR位…...
Dockle在大型项目中的应用:多镜像批量扫描与报告生成完整指南
Dockle在大型项目中的应用:多镜像批量扫描与报告生成完整指南 【免费下载链接】dockle Container Image Linter for Security, Helping build the Best-Practice Docker Image, Easy to start 项目地址: https://gitcode.com/gh_mirrors/do/dockle Dockle是一…...
PID调参翻车实录:STM32驱动编码电机时,P值过大为何电机啸叫还振荡?
PID调参实战:STM32编码电机啸叫与振荡问题深度解析 当你在深夜实验室里第一次听到电机发出刺耳的啸叫声,同时观察到示波器上速度曲线像过山车一样上下震荡时,那种既困惑又兴奋的感觉,相信每个做过电机控制的工程师都深有体会。这不…...
LeetCode 300. Longest Increasing Subsequence 题解
LeetCode 300. Longest Increasing Subsequence 题解 题目描述 给你一个整数数组 nums,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,…...

