花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 239|回复: 154

初识JS原生animate动画函数

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

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

    发表于 2024-6-6 13:01 | 显示全部楼层 |阅读模式

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

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

    x
    本帖最后由 马黑黑 于 2024-6-6 13:03 编辑

    很多人不认识 JS 有原生的动画函数,百度的AI也认为没有。其实不然,JS早就拥有 Web Animation API,提供两个接口,其中 animate 函数就是用来操控动画的。本文将通过制作一个可控的元素旋转对象初识 Web Animation API,具体做法是,使用 JS 原生 animate 函数驱动一个 img 元素,令其旋转并可控。

    我们需要准备一下图片:

    这张图片在后面的示例中需要一个 id ,id="h7",它是图片的标识,是我们后续操作这张图片的依据。animate 函数可以这样调用:h7.animate(/* 参数 */);。现在要做的事情是了解 animate 函数的参数——其实就是 animate 函数的语法:

    element.animate(keyframes, options);

    element 是要执行 animate 动画的元素,一般使用 id 标识,比如本文的图片标签 id h7,或通过 document.querySelector 等方法抓取到的元素标识。下面讨论重点问题,即两个参数:

    keyframes 参数,顾名思义指关键帧动画,它是关键帧动画描述的对象集合,比如从 0 到 360deg 的旋转描述,用 JS 对象来表示:

    { transform: 'rotate(0)', /* 第一帧 */ transform: 'rotate(360deg)', /* 第二帧 */ }

    CSS关键帧集合描述放在花括号 {} 内,这是JS对象的表示方法。这个内容块描述了动画的两个帧,起始帧旋转 0 度,结尾帧旋转 360 度,向 animate(参数1, 参数2) 函数传递参数1,告诉它给我运行一个动画,从 0 到 360deg 旋转元素。这个内容快就是 animate 函数所需的第一个参数,我们直接将其放置在 keyframes 参数的位置即可,当然,为了方便,我们还可以将动画描述集合储存为一个变量,后面的示例代码会呈现这一点。

    options 参数是动画属性集合,包含但不限于动画运行周期、动画运行次数,也是使用 JS 对象存储:

    { duration: 8000, /* 动画持续时长,毫秒单位 */ iteration: 2, /* 动画运行次数,正整数,Infinity 为无限 */ }

    同样地,将以上代码块放置到 animate(参数1,参数2) 参数2的位置,告诉 animate 函数,动画的运行属性值是这两个:8 秒钟一个运行周期、运行两次。

    把这些代码整合一下,动画就可以运行了:

    <img id="h7" alt="" width="200" src="https://638183.freep.cn/638183/web/svg/sunfl-2.svg" />   <script> h7.animate( { transform: 'rotate(0)', /* 第一帧 */ transform: 'rotate(360deg)', /* 第二帧 */ }, { duration: 8000, /* 动画持续时长,毫秒单位 */ iteration: 2, /* 动画运行次数,正整数,Infinity 为无限 */ } ); </script>

    图片旋转两圈后自动停下来,不过这个停止动作不是我们控制的,是 iteration: 2 属性的限定。要控制 animate 函数的动画,我们需要拿到动画操作标识,然后通过这个标识控制动画。animate 函数和CSS关键帧动画一样,拥有动画的播放与暂停方法,详情请参阅本文演示示例的代码:

    <img id="h7" alt="" width="200" src="https://638183.freep.cn/638183/web/svg/sunfl-2.svg" />   <script> //rot对象 :旋转动画描述(省略首帧) const rot = {     transform: 'rotate(360deg)', };   // rotAttr对象 :动画属性值列表 const rotAttr = {     duration: 8000,     iterations: Infinity, };   // 运行并获得动画操作入口 rotate const rotate = h7.animate(rot, rotAttr);   //图片单击事件 h7.onclick = () => {     rotate.playState === 'running' ? rotate.pause() : rotate.play(); }; </script>

    playState 是动画的运行状态,主要是 running 和 paused 两种;同时,animate 动画拥有 play() 和 pause() 两种方法。以上代码,我们就是根据 playerState 状态调用不同的方法来实现对 animate 动画的控制。效果如下:

    (点击图片可以控制动画)

    小结:animate 是 JS 原生的动画函数,它源自 Web Animation API 接口,它需要两个参数,参数1是动画各帧的描述集合,用以描述动画的全程,参数2是动画属性值的描述集合,用以描述动画的运行周期(时长)、运行次数等,两个参数都是用 JS 对象表示,分别放置在在花括号内;animate 函数的动画与动画属性值的描述语法大致和CSS关键帧动画一样,但有自己的语法规范。animate 函数应由元素调用,元素标识.animate(参数1, 参数2);。而要控制动画,需要获得动画标识,动画标识 = 元素标识.animate();,然后可以使用 动画标识.play(); 播放动画、使用 动画标识.pause(); 暂停动画。动画的运行状态则通过 动画标识.playState 获得,状态一般是 running 或 paused(还有中间状态,这里不提)。

    评分

    参与人数 4威望 +150 金钱 +300 经验 +150 收起 理由
    小辣椒 + 50 + 100 + 50 赞一个!
    执著 + 20 + 40 + 20 很给力!
    红影 + 50 + 100 + 50 赞一个!
    南无月 + 30 + 60 + 30 很给力!

    查看全部评分

  • TA的每日心情
    开心
    2024-12-15 11:29
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    824

    主题

    811

    回帖

    3万

    积分

    贵宾

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

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪奔放热烈春风拂面缤纷心情王者至尊大将风范金剪刀音画大师天籁妙音妙笔生花

    发表于 2024-6-6 15:33 | 显示全部楼层
    这样的分析真清楚,对复杂的动画不知道是否可用!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-6-6 17:19 | 显示全部楼层
    非常详细的教程哎。。
    中午看了一次。。
    小白看了全部代码再回去看分析,更清晰一些。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-6-6 17:20 | 显示全部楼层
    小白能看得懂一些的就是超级好的教程。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-6-6 17:40 | 显示全部楼层
    南无月 发表于 2024-6-6 17:20
    小白能看得懂一些的就是超级好的教程。

    animate之前有过介绍或使用
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-6-6 17:41 | 显示全部楼层
    南无月 发表于 2024-6-6 17:19
    非常详细的教程哎。。
    中午看了一次。。
    小白看了全部代码再回去看分析,更清晰一些。。

    这个实现的功能相对简单,况且,和我们经常使用的CSS关键帧动画是紧密相连的,理解起来应该不会太难
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-6-6 17:42 | 显示全部楼层
    亚伦影音工作室 发表于 2024-6-6 15:33
    这样的分析真清楚,对复杂的动画不知道是否可用!

    比起控制纯CSS关键帧动画,这个自由度要高得多
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-6-6 20:01 | 显示全部楼层
    马黑黑 发表于 2024-6-6 17:41
    这个实现的功能相对简单,况且,和我们经常使用的CSS关键帧动画是紧密相连的,理解起来应该不会太难

    就看着眼熟~~友好的JS
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-6-6 20:02 | 显示全部楼层
    马黑黑 发表于 2024-6-6 17:40
    animate之前有过介绍或使用

    几乎贴贴都在用啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-6-6 20:10 | 显示全部楼层
    南无月 发表于 2024-6-6 20:02
    几乎贴贴都在用啊

    不是。你要弄清楚CSS关键帧动画和JS animate动画的区别:

    CSS关键帧动画是自驱动,一个元素,如果有 animation 属性,如下面所示,

    .mypic {
        /* 其他代码 */
        animation: rot 4s linear infinite;
    }

    那么,class="mypic" 的元素就会运行 rot 动画,rot 动画可能是酱紫:

    @keyframes rot { transform: rotate(360deg); }

    这些,都是CSS的,JS的 animate 函数不需要元素去设定。而是通过函数来设定动画,你可以理解为JS使用 animate 函数封装CSS动画。

    评分

    参与人数 1威望 +30 金钱 +60 经验 +30 收起 理由
    南无月 + 30 + 60 + 30 很给力!

    查看全部评分

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-6-6 20:11 | 显示全部楼层
    南无月 发表于 2024-6-6 20:01
    就看着眼熟~~友好的JS

    友好陌生
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-6-6 20:31 | 显示全部楼层

    友好的大怪兽。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-6-6 20:35 | 显示全部楼层
    马黑黑 发表于 2024-6-6 20:10
    不是。你要弄清楚CSS关键帧动画和JS animate动画的区别:

    CSS关键帧动画是自驱动,一个元素,如果有 a ...


    我以为我在单词差不多的份上理解了个大概
    原来有着根本的差别。
    亏得老师有耐心又说一遍
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-6-6 20:36 | 显示全部楼层
    又想请老师喝酒了咋办
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-6-6 20:38 | 显示全部楼层
    南无月 发表于 2024-6-6 20:36
    又想请老师喝酒了咋办

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-6-6 20:47 | 显示全部楼层
    本帖最后由 马黑黑 于 2024-6-6 20:49 编辑
    南无月 发表于 2024-6-6 20:35
    我以为我在单词差不多的份上理解了个大概
    原来有着根本的差别。
    亏得老师有耐心又说一遍

    做音画帖,离不开三样东东:

    CSS(<style>...</style>)
    HTML (<div>...</div>)
    JS (<script>...</script>)

    CSS制定样式表,就是各个元素的样纸;
    HTML是帖子构架;
    JS是控制帖子相关东东的编程语言,它可以动态管理CSS和HTML。

    如果把HTML比作人,那么,这是人最基本的结构,素面朝天的样纸;而CSS则是化妆师、甚至是整容师,人的穿着和打扮主要由CSS负责;至于JS,那忒厉害了,它可以通过修改CSS设定的样式给人重新打扮、化妆、整容等,还可以把人干掉或给他装个假肢什么的,并赋予人以智慧。

    CSS也可以做一些JS的工作,极少量,比如动画、hover交互,将来CSS能干更多。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-6-6 20:49 | 显示全部楼层
    南无月 发表于 2024-6-6 20:31
    友好的大怪兽。。

    是滴
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-6-6 20:54 | 显示全部楼层
    马黑黑 发表于 2024-6-6 20:47
    做音画帖,离不开三样东东:

    CSS(...)

    这个可真是生动形象。。
    CSS大概打扮打扮也能出场,长宽高位置啥的摆一摆
    JS就是中枢神经,控制啥的都在这里。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-6-6 20:55 | 显示全部楼层

    干脆的酒喝着痛快
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-6-6 20:56 | 显示全部楼层
    马黑黑 发表于 2024-6-6 20:47
    做音画帖,离不开三样东东:

    CSS(...)

    其实CSS也挺厉害的是吧。。很多动画它都能设定
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-12-16 02:00 , Processed in 0.097073 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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