|
|
请马上登录,朋友们都在花潮里等着你哦:)
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 马黑黑 于 2022-3-8 23:28 编辑
JS之requestAnimationFrame运用举例 | 马黑黑
requestAnimationFrame,字面含义是请求动画帧,这是利用屏幕刷新行为而开发的对接显卡和监视器的API接口,理论上不占用系统内存和CPU资源,但要运行于GPU主线程之上,若主线程十分繁忙,动画运行效果可能不会理想。
requestAnimationFrame() 需要一个参数,比如自定义函数,语法如下:
window.requestAnimationFrame(go);
下面通过实例来领略 requestAnimationFrame 如何运行动画。我们要达成的目标是模拟marquee左右移动文字,为了实现这个动画,我们需要两个div盒子,一个是父盒子,负责提供运动场地,一个子盒子即运动员。先看CSS代码:
<style>
#paBox {
margin: auto;
width: 600px;
position: relative;
}
#marq {
width: 100px;
height: 20px;
line-height: 20px;
position: relative;
}
</style>
值得注意的是:① 移动需要定位,所以两个盒子都有position设置;② 父盒子的宽度必须大于子盒子的宽度;③ 我们用 # 号定义CSS选择器,它是基于id而定义的,是HTML里同一页只能用一次的标签标识。
下面看HTML代码,很简单,无需解释:
<div id="paBox">
<div id="marq">花潮论坛</div>
</div>
接着就是JS代码了,这是动画实现的核心内容:
<script>
var paBox = document.getElementById('paBox'); //父盒子句柄
var marq = document.getElementById('marq'); //移动盒子句柄
var xx = 0; //移动初始位置: 元素left值
var speed = 1; //移动速度: 数字越大越快
//移动函数
function go(){
xx += speed; //位置变更
//xx即元素left值大于等于父盒子减去自身宽度或 小于等于0时 speed 变为负值
if (xx >= paBox.clientWidth - marq.clientWidth || xx <= 0) speed = -speed;
marq.style.left = xx + 'px'; //令对象移动:其实是改变对象的left值
window.requestAnimationFrame(go); //请求动画
}
window.requestAnimationFrame(go); //首次启动动画
</script>
go()函数中并没有使用定时器,而是通过 requestAnimationFrame() 来调用自己,这是非常精巧的设计,当然,第一推动力需要“上帝之手”,所以在JS语句流中要启动一次动画,然后动画就能持久地运行下去,直至浏览器关闭。这是不是传说中的永动机呢?
go()函数中的算法也值得细细体会:if语句里,|| 表示“或者”的意思,就是说,当 xx 的值大于等于特定值或小于等于0之时,speed 都要变为负数,这样,自左向右移动时 xx 值是没执行一次动画就自动增加的,反之是自动减少的。顺便提一下,若需要不同的运动宽度或范围,可以直接修改if语句,直接设定大于等于和小于等于后面的值即可。如果需要文字只是一个方向移动,则需要修改子盒子的left值和JS代码里go函数的if语句,这里暂时不提,会在后续的回复中进行探讨。
最后再强调一下:两个盒子都必须设定position值,一般建议使用relative和absolute。设定position的原因是JS是通过改变对象的left值来达成移动的目的,而元素不定位就会处于永远静止的状态。
|
评分
-
| 参与人数 3 | 威望 +130 |
金钱 +260 |
经验 +130 |
收起
理由
|
加林森
| + 30 |
+ 60 |
+ 30 |
赞一个! |
小辣椒
| + 50 |
+ 100 |
+ 50 |
赞一个! |
红影
| + 50 |
+ 100 |
+ 50 |
赞一个! |
查看全部评分
|