css requestAnimationFrame

2024-01-04 10:48

本文主要是介绍css requestAnimationFrame,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

绘制动画,一般有两个选择:

  1. js脚本 setTimeout和setInterval
  2. css3 transition和animation属性

这两个方法有各自的局限性:

  • js脚本实现动画的局限性:
  1. 即使向 setTimeout和setInterval 传递ms级的参数,由于js单线程的关系,可能会引发堵塞,不能达到高精度的准确性
  2. 没有对动画的循环机制进行优化,只是以一个大致的时间间隔循环,而且“最优帧速率”和“选择绘制下一帧的最优时机”都需要开发者自己来控制;ms设置过小,比如小于16.67ms(60帧)那么就会引起掉帧(一般显示器显示最高频率是60帧);设置过大,帧数小,动画效果不流畅
  • css3实现动画的局限性
  1. 兼容性问题,对于PC浏览器,IE8, IE9之流,你想兼容实现某些动画效果,比如说淡入淡出,就无能为力了
  2. 不能应用所有属性问题,CSS3动画可以改变高宽,方位,角度,透明度等等,但是对于scrollTop,就无能无力了
  3. CSS3支持的动画效果有限

于是,我们引入requestAnimationFrame

  1. requestAnimationFrame会把每一帧中的dom操作集中起来,再一次重绘或者重排中就完成,并且刷新频率紧跟浏览器的刷新频率
  2. 在隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的CPU、GPU和内存使用量
  3. requestAnimationFrame是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了CPU开销

requestAnimationFrame的用法与setTimeout相似,只是不需要设置时间间隔而已。requestAnimationFrame使用一个回调函数作为参数,这个回调函数会在浏览器重绘之前调用。它返回一个整数,表示定时器的编号,这个值可以传递给cancelAnimationFrame用于取消这个函数的执行

timerID = requestAnimationFrame(callback); 
//控制台输出1和0
var timer = requestAnimationFrame(function(){console.log(0);
}); 
console.log(timer);//1

cancelAnimationFrame方法用于取消定时器

//控制台什么都不输出
var timer = requestAnimationFrame(function(){console.log(0);
}); 
cancelAnimationFrame(timer);

也可以直接使用返回值进行取消

var timer = requestAnimationFrame(function(){console.log(0);
}); 
cancelAnimationFrame(1);

其实我们在《vue 页面加载进度条组件》中使用了setInterval作为动画脚本,现在我们可以用requestAnimationFrame重写(主要是一个递归调用,看mounted和watch中的代码就可以了)

<template><transition name="fade"><div class="progress-bar" v-if="isShow"></div></transition>
</template><script type="text/babel">export default {data() {return {isShow: true, // 是否显示进度条val: 0, // 进度}},props: {/*** 每10毫秒自增幅度*/step: {type: Number,default: 5,},/*** 初始值*/initVal: {type: Number,default: 0,},/*** 到一定进度停止*/stopVal: {type: Number,default: 80,},/*** 进度条继续到成功*/isOk: {type: Boolean,default: false,},},mounted() {this.val = this.initVallet step =  this.steplet loop = () => {this.val = this.val + stepthis.$el.style.width = this.val + '%'if (this.val >= this.stopVal) {cancelAnimationFrame(timer)return}requestAnimationFrame(loop)}let timer = requestAnimationFrame(loop)},watch: {isOk() {let val = this.vallet step =  this.steplet loop = () => {val = val + stepthis.$el.style.width = val + '%'if (val >= 100) {cancelAnimationFrame(timer)this.isShow = falsethis.$emit('callback', 'load success')return}requestAnimationFrame(loop)}let timer = requestAnimationFrame(loop)},},}
</script><style lang="stylus" rel="stylesheet/stylus">.progress-bar {position fixedtop 0height 6pxwidth 0background-color #999}.fade {&-enter-active, &-leave-active {transition: all .3s}&-enter, &-leave-active {opacity: 0}}
</style>

这篇关于css requestAnimationFrame的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/569087

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交