花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 159|回复: 14

JS请求动画之requestAnimationFrame运用举例

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2022-3-8 19:52 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    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 赞一个!

    查看全部评分

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-3-8 20:27 | 显示全部楼层
    xx += speed; //位置变更

    speed不是速度么,为什么这个语句成了位置变更?
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-11-25 21:11
  • 签到天数: 1 天

    [LV.1]初来乍到

    1421

    主题

    6万

    回帖

    12万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀青草情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀男儿情怀鹰傲苍穹心香一瓣音画大师天籁妙音风雨同行我心永远喜乐安康中秋征文指尖上的流年花潮管理

    发表于 2022-3-8 20:32 | 显示全部楼层
    看不懂,学习一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-3-8 20:46 | 显示全部楼层
    去试了一下,原来是来回移动的。var speed = 1,可以是小数么?
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-3-8 21:18 | 显示全部楼层
    红影 发表于 2022-3-8 20:46
    去试了一下,原来是来回移动的。var speed = 1,可以是小数么?

    可以试试,但不建议,移动可能会比较缓慢。一个像素一个像素移动已经不错了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-15 09:52
  • 签到天数: 1180 天

    [LV.10]以坛为家III

    1247

    主题

    2万

    回帖

    9万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀男儿情怀鹰傲苍穹花好月圆心香一瓣紫色情节飞龙在天王者至尊生财有道大将风范金剪刀音画大师天籁妙音妙笔生花共看流星我心永远幸福快乐宁静致远逍遥自在喜乐安康妙趣横生指尖上的流年花潮贵宾

    发表于 2022-3-8 21:20 | 显示全部楼层
    这个黑客是真黑啊,一点看不懂。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-3-8 22:41 | 显示全部楼层
    马黑黑 发表于 2022-3-8 21:18
    可以试试,但不建议,移动可能会比较缓慢。一个像素一个像素移动已经不错了。

    嗯嗯,尤其父元素比较大的时候,太慢的移动会时间更长。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-3-8 23:09 | 显示全部楼层
    红影 发表于 2022-3-8 22:41
    嗯嗯,尤其父元素比较大的时候,太慢的移动会时间更长。

    正解
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-3-8 23:10 | 显示全部楼层
    红影 发表于 2022-3-8 20:27
    xx += speed; //位置变更

    speed不是速度么,为什么这个语句成了位置变更?

    xx变更,不是speed,我这里是把speed加到了xx的值,xx是改变移动对象的依据,它不变更对象就不能移动
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-3-8 23:26 | 显示全部楼层
    东篱闲人 发表于 2022-3-8 21:20
    这个黑客是真黑啊,一点看不懂。。。

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-6-15 10:31
  • 签到天数: 525 天

    [LV.9]以坛为家II

    1383

    主题

    3万

    回帖

    10万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀青草情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀男儿情怀鹰傲苍穹花好月圆飞龙在天王者至尊大将风范天籁妙音共看流星风雨同行幸福快乐喜乐安康指尖上的流年花潮版主

    发表于 2022-3-9 09:59 | 显示全部楼层
    继续来学习
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-3-9 10:56 | 显示全部楼层
    马黑黑 发表于 2022-3-8 23:10
    xx变更,不是speed,我这里是把speed加到了xx的值,xx是改变移动对象的依据,它不变更对象就不能移动

    xx必须变化这个知道,为什么要用速度去加,我的理解,速度是有单位的,不是纯粹的数值。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-3-9 11:23 | 显示全部楼层
    本帖最后由 马黑黑 于 2022-3-9 11:24 编辑
    红影 发表于 2022-3-9 10:56
    xx必须变化这个知道,为什么要用速度去加,我的理解,速度是有单位的,不是纯粹的数值。

    这里,JS定义的speed变量,是一个数值变量,不带单位,不要理解为生活中的速度。

    JS要操作实体HTML元素,比如改变其 left 值,先给数值,再给单位。下面语句假如盒子的操作句柄是 c :

    var k = c.clientLeft || 0; //获取元素的left值:若获取不到则设定为 0
    c.style.left = k + 100 + "px";

    上面,先获取HTML特定元素的 left 值,然后赋值给元素的CSS样式设定,k+100 是在原 left 值基础上再加 100,单位是像素,所以后面要给上 + "px" 的内容,因为CSS需要这样表达才能生效。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2022-3-9 13:16 | 显示全部楼层
    马黑黑 发表于 2022-3-9 11:23
    这里,JS定义的speed变量,是一个数值变量,不带单位,不要理解为生活中的速度。

    JS要操作实体HTML元 ...

    “不要理解为生活中的速度”

    嗯嗯,现在明白了。谢谢黑黑
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2022-3-9 14:02 | 显示全部楼层
    红影 发表于 2022-3-9 13:16
    “不要理解为生活中的速度”

    嗯嗯,现在明白了。谢谢黑黑

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-17 03:22 , Processed in 0.073439 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表