基于键盘事件控制CSS动画的播放与暂停

基于键盘事件控制CSS动画的播放与暂停

本文详细介绍了如何利用javascript的`keydown`和`keyup`事件,实现对css动画的精确播放与暂停控制。通过动态修改元素的`animation-play-state`属性,并结合`animation-iteration-count: infinite`确保动画循环播放,开发者可以为网页元素创建直观且响应式的交互体验。

在现代网页设计中,为用户提供丰富的交互体验至关重要。其中,通过用户输入(如键盘按键)来控制页面元素的动画是常见的需求。本教程将指导您如何利用JavaScript的键盘事件结合CSS动画属性,实现按键时播放动画、松开按键时暂停动画的功能,并确保动画能够无限次循环播放。

1. CSS动画基础与初始状态设置

首先,我们需要定义元素的动画行为,并设置其初始状态为暂停。这涉及到@keyframes规则和animation属性。

1.1 定义关键帧动画

@keyframes规则用于定义动画的各个阶段。例如,我们定义一个名为rulle的动画,使一个球形元素在水平方向上移动并旋转,以及一个名为roter的动画用于内部文本的旋转。

@keyframes rulle {    0%{        top: 40px;        left: 0;        transform: rotate(0deg);    }    12.5%{        top: 40px;        left: 50px;        transform: rotate(45deg);    }    25%{        top: 40px;        left: 100px;        transform: rotate(90deg);    }    37.5%{        top: 40px;        left: 150px;        transform: rotate(135deg);    }    50%{        top: 40px;        left: 200px;        transform: rotate(180deg);    }    62.5%{        top: 40px;        left: 250px; /* 注意:原问题此处缺少'px'单位,已修正 */        transform: rotate(225deg);    }    75%{        top: 40px;        left: 300px;        transform: rotate(270deg);    }    87.5%{        top: 40px;        left: 350px;        transform: rotate(315deg);    }    100%{        top: 40px;        left: 250px; /* 最终位置可根据需求调整,原问题100%回到250px */        transform: rotate(360deg);    }}@keyframes roter {    0%{ }    25%{ transform: rotate(90deg); }    50%{ transform: rotate(180deg); }    75%{ transform: rotate(270deg); }    100%{ transform: rotate(360deg); }}

1.2 应用动画并设置初始状态

接下来,我们将这些动画应用到相应的HTML元素上。关键在于使用animation简写属性来定义动画的持续时间、缓动函数和迭代次数,并显式地将animation-play-state设置为paused,确保动画在页面加载时不会自动播放。

立即学习“前端免费学习笔记(深入)”;

.linje{    width: 1000px;    height: 500px;}#ball{    position: relative;    top: 40px;    left: 0;    width: 100px;    height: 100px;    background-color: rgb(114, 240, 214);    border-radius: 50%;    /* 动画简写属性:名称 持续时间 迭代次数 缓动函数 */    animation: rulle 4s infinite linear;    animation-play-state: paused; /* 初始状态为暂停 */    text-align: center;    line-height: 100px;}#roter{    animation: roter 4s linear infinite;    animation-play-state: paused; /* 初始状态为暂停 */}

在上述CSS中:

animation: rulle 4s infinite linear; 定义了名为rulle的动画,持续4秒,无限循环(infinite),并以线性(linear)速度播放。animation-play-state: paused; 是至关重要的一步,它确保了动画在页面加载完成后处于暂停状态,等待用户交互。

2. JavaScript事件监听与动画控制

现在,我们将使用JavaScript来监听键盘事件,并根据按键的状态来切换动画的播放状态。

2.1 获取DOM元素

首先,获取需要控制动画的DOM元素。

const ball = document.querySelector("#ball");const roter = document.querySelector("#roter");

2.2 监听键盘事件

我们将监听window对象的keydown和keyup事件。

keydown事件在用户按下任意键时触发。keyup事件在用户释放任意键时触发。

在这两个事件的回调函数中,我们将修改元素的animation-play-state属性。

window.addEventListener("keydown", () => {    // 按下任意键时,将动画播放状态设置为“运行”    ball.style.animationPlayState = "running";    roter.style.animationPlayState = "running";});window.addEventListener("keyup", () => {    // 释放任意键时,将动画播放状态设置为“暂停”    ball.style.animationPlayState = "paused";    roter.style.animationPlayState = "paused";});

关键点:

我们直接修改element.style.animationPlayState属性,而不是重新设置整个animation属性。这种方法更加高效和精确,因为它只改变动画的播放状态,而不会重置动画的进度或其他属性。通过将事件监听器附加到window对象,我们可以捕获页面上的任何键盘事件,而无需关心焦点在哪一个特定元素上。

3. 完整的代码示例

将HTML结构、CSS样式和JavaScript代码整合在一起,即可实现所需功能。

3.1 HTML结构

161519

3.2 整合后的CSS

.linje{    width: 1000px;    height: 500px;}#ball{    position: relative;    top: 40px;    left: 0;    width: 100px;    height: 100px;    background-color: rgb(114, 240, 214);    border-radius: 50%;    animation: rulle 4s infinite linear;    animation-play-state: paused; /* 初始暂停 */    text-align: center;    line-height: 100px;}@keyframes rulle {    0%{ top: 40px; left: 0; transform: rotate(0deg); }    12.5%{ top: 40px; left: 50px; transform: rotate(45deg); }    25%{ top: 40px; left: 100px; transform: rotate(90deg); }    37.5%{ top: 40px; left: 150px; transform: rotate(135deg); }    50%{ top: 40px; left: 200px; transform: rotate(180deg); }    62.5%{ top: 40px; left: 250px; transform: rotate(225deg); }    75%{ top: 40px; left: 300px; transform: rotate(270deg); }    87.5%{ top: 40px; left: 350px; transform: rotate(315deg); }    100%{ top: 40px; left: 250px; transform: rotate(360deg); }}#roter{    animation: roter 4s linear infinite;    animation-play-state: paused; /* 初始暂停 */}@keyframes roter {    0%{ }    25%{ transform: rotate(90deg); }    50%{ transform: rotate(180deg); }    75%{ transform: rotate(270deg); }    100%{ transform: rotate(360deg); }}

3.3 整合后的JavaScript

const ball = document.querySelector("#ball");const roter = document.querySelector("#roter");window.addEventListener("keydown", () => {    ball.style.animationPlayState = "running";    roter.style.animationPlayState = "running";});window.addEventListener("keyup", () => {    ball.style.animationPlayState = "paused";    roter.style.animationPlayState = "paused";});

4. 注意事项与优化

动画平滑性: 如果动画看起来不平滑,通常与关键帧之间的过渡、缓动函数(animation-timing-function)的选择以及帧率有关。确保关键帧定义清晰,并尝试不同的缓动函数(如ease-in-out)来优化视觉效果。性能考量: 尽管animation-play-state的修改通常性能良好,但如果页面中有大量动画元素需要同时控制,仍需注意性能。对于复杂动画,可以考虑使用Web Animations API (WAAPI) 获取更精细的控制。特定按键控制: 如果您希望动画只在按下特定按键时触发,可以在keydown事件监听器内部检查event.key属性,例如:if (event.key === “q”) { … }。防止默认行为: 在某些情况下,按下按键可能会触发浏览器的默认行为(如滚动页面)。您可以使用event.preventDefault()来阻止这些默认行为。

总结

通过结合CSS的animation属性(特别是animation-play-state和animation-iteration-count)与JavaScript的keydown和keyup事件监听器,我们可以轻松实现对网页元素动画的交互式控制。这种方法不仅功能强大,而且代码结构清晰,易于维护,为创建动态和响应式的用户界面提供了坚实的基础。掌握这些技术,将有助于您在网页开发中实现更丰富的用户体验。

以上就是基于键盘事件控制CSS动画的播放与暂停的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1604236.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
优化点击区域:使用事件委托实现DIV内图标切换
上一篇 2025年12月23日 17:53:33
自己做的html不能运行怎么办_解自制html运行失败问题【技巧】
下一篇 2025年12月23日 17:53:40

相关推荐

  • java中的runnable关键字用途 Runnable接口的3个实现技巧

    java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧

    runnable接口与thread类协同工作的核心机制是:将实现runnable接口的任务对象传递给thread类构造函数,再通过start()方法启动线程。1. runnable接口定义任务逻辑,通过run()方法实现;2. thread类负责执行任务,需将runnable对象传入其构造函数;3.…

    2026年8月25日 用户投稿
    100
  • 免费PPT生成速度快吗_提升免费PPT生成速度的实用技巧

    使用AI工具、导入文档、预设主题和套用模板可快速制作专业PPT。首先选择迅捷AIPPT等AI平台输入主题生成大纲并应用模板;其次通过Gamma等平台导入Word或文本自动生成幻灯片;再提前设置主题风格以便一键渲染;最后利用Slides%ignore_a_2%等模板库按场景筛选并批量调整格式,全面提升…

    2026年8月25日
    300
  • 电脑网络连接图标不见了如何恢复 介绍多种方法

    电脑网络连接图标不见了如何恢复 介绍多种方法电脑网络连接图标不见了如何恢复 介绍多种方法电脑网络连接图标不见了如何恢复 介绍多种方法电脑网络连接图标不见了如何恢复 介绍多种方法

    不少用户会遭遇网络连接图标莫名消失的问题。尽管这看起来只是个小故障,但若未能及时处理,可能会影响日常上网和网络管理。下面将分享几种实用的方法,帮你找回丢失的网络图标。 一、重启Windows资源管理器 有时候,系统资源管理器(Explorer.exe)出现临时异常,会导致任务栏图标不显示。通过重启该…

    2026年8月25日 用户投稿
    200
  • 手动优化小参:tRFC、tFAW 等次级时序调校指南

    tRFC和tFAW调校可提升内存性能与稳定性,tRFC影响刷新延迟,需根据颗粒类型逐步降低并测试;tFAW控制行激活窗口,压缩时需配合tRRD_L优化,并以5为步进调试避免性能下降;两者均需结合tREFI、tRRD_S/L及VDDQ电压协同调整,最终在当前频率电压下找到稳定边界,实现高效稳定运行。 …

    2026年8月25日
    000
  • BOOTSQM.dat文件可以删除吗的介绍

    BOOTSQM.dat文件可以删除吗的介绍BOOTSQM.dat文件可以删除吗的介绍BOOTSQM.dat文件可以删除吗的介绍BOOTSQM.dat文件可以删除吗的介绍

    最近有用户反映,在使用windows 7系统时,发现c盘里经常会出现一个名为bootsqm.dat的文件。那么这个bootsqm.dat究竟是什么?是否可以安全地删除它呢?接下来我们就来详细探讨一下bootsqm.dat文件能否被删除。 首先,我们可以通过以下步骤检查系统是否存在相关问题,并尝试解决…

    2026年8月25日 用户投稿
    000
  • Laravel与CDN集成的最佳实践

    为什么要将laravel与cdn集成?将laravel与cdn集成可以显著提升网站的加载速度和用户体验。具体做法包括:1. 在.env文件中配置cdn_url。2. 在blade模板中使用环境变量引用静态资源。3. 只将对页面加载速度影响大的资源推送到cdn。4. 使用版本控制或哈希文件名管理cdn…

    2026年8月25日
    100
  • Java中如何实现二分查找 掌握二分查找的算法实现

    Java中如何实现二分查找 掌握二分查找的算法实现Java中如何实现二分查找 掌握二分查找的算法实现Java中如何实现二分查找 掌握二分查找的算法实现Java中如何实现二分查找 掌握二分查找的算法实现

    二分查找是一种高效的查找算法,其核心在于每次比较都排除一半的查找范围,从而快速定位目标值,但要求数据必须有序。实现方式有两种:1. 循环实现通过 while(left <= right) 不断调整 left 和 right 的值,计算 mid = left + (right – l…

    2026年8月25日 用户投稿
    000
  • Win10用户名无法更改怎么办?Win10用户名改不了解决方法

    windows 10 电脑具备新增用户以及修改用户名和密码的功能。当用户有需求时,可以添加一个账户,并设置相应的用户名与密码;如果想修改用户名同样可行。为确保用户名的选择恰当得体,以便于日后查看本机账户情况时能够清晰了解哪些账户可以被删除。如果您遇到无法修改的情况,可参照以下方法解决。 方法一: 尝…

    2026年8月25日
    100
  • 随便记录下系列 – node->express

    系列记录 – node.js到express的一站式指南 一、在Windows上安装Node.js环境:从官方网站下载Node.js,需替换下载链接 https://nodejs.org/dist/v6.2.0/node-v6.2.0-x64.msi 中的版本号6.2.0为所需版本即可。…

    2026年8月25日
    400
  • 华硕TUF GAMING A17对决宏碁暗影骑士·龙:AMD Advantage游戏本的性能与续航,3A平台加持下表现如何?

    华硕TUF GAMING A17在做工、散热和稳定性上优于宏碁暗影骑士·龙,搭载AMD锐龙处理器与RTX 30/40系显卡,性能强劲且通过军规测试,续航达6-8小时,接口丰富但无SD卡槽;暗影骑士·龙配置相似,性价比高但机身刚性稍弱,适合预算敏感用户。 当考虑购买一款主打性价比和稳定性能的游戏本时,…

    2026年8月25日
    000
  • Window XP 源码泄露!网友发现隐藏功能和趣味细节

    Window XP 源码泄露!网友发现隐藏功能和趣味细节Window XP 源码泄露!网友发现隐藏功能和趣味细节Window XP 源码泄露!网友发现隐藏功能和趣味细节Window XP 源码泄露!网友发现隐藏功能和趣味细节

    阅读本文大约需要 3 分钟。 距离首个代号为 Whistler 的 Windows XP 版本发布,已有近 20 年的时间。 然而,最近,Twitter 用户 Albacore 分享了一些来自 Windows XP 泄露代码的隐藏功能。通过调整特定的注册表项,你可以解锁一些有趣的视图,并体验到之前未…

    2026年8月25日 用户投稿
    000
  • 更强大的PHP反射!wingu/reflection如何解决复杂类型分析难题

    在大型PHP项目中,类型信息的准确性和完整性至关重要。例如,在使用依赖注入容器时,我们需要准确地知道构造函数的参数类型,才能正确地注入依赖。又或者,在进行代码生成时,我们需要从DocBlock中提取信息,生成相应的代码。PHP原生的反射API在处理这些场景时,往往需要编写大量的代码,而且容易出错。 …

    用户投稿 2026年8月25日
    100
  • 硬件监控软件横评:HWiNFO64、AIDA64、CPU-Z 功能对比

    CPU-Z适合快速查看硬件配置,AIDA64提供全面信息与压力测试,HWiNFO64则以深度传感器数据成为专业监控首选,三者各有侧重,按需选用。 说到看电脑硬件信息和监控状态,HWiNFO64、AIDA64和CPU-Z是很多人会用的工具。它们都能告诉你电脑里有什么,但侧重点和功能深度差别不小。简单说…

    2026年8月25日
    100
  • 内存不能为read怎么处理?

    内存不能为read怎么处理?内存不能为read怎么处理?内存不能为read怎么处理?内存不能为read怎么处理?

    在使用windows 10系统时,用户可能会遇到内存无法读取的问题,这通常是许多用户常见的故障之一。针对这一问题,小编整理了相关的解决方案,现在分享给大家。 如何解决内存无法读取的问题: 1、按住“Win+R”组合键,打开“运行”窗口,并输入 msconfig。 2、将“常规”选项卡中的“正常启动”…

    2026年8月25日 用户投稿
    000
  • Java中IoC是什么概念 图解控制反转和依赖注入的实现原理

    Java中IoC是什么概念 图解控制反转和依赖注入的实现原理Java中IoC是什么概念 图解控制反转和依赖注入的实现原理Java中IoC是什么概念 图解控制反转和依赖注入的实现原理Java中IoC是什么概念 图解控制反转和依赖注入的实现原理

    ioc反转的是对象的控制权。传统开发中对象自己管理依赖,而ioc将对象创建和依赖管理交给外部容器,从而实现控制权的反转。ioc是一种设计原则,di是其具体实现方式,通过构造器、setter或接口注入依赖。java中依赖注入主要有三种方式:1.构造器注入,通过构造函数传递依赖,优点是依赖明确且不可变;…

    2026年8月25日 用户投稿
    000
  • win10复制管理员账户(亲测有效)

    win10复制管理员账户(亲测有效)win10复制管理员账户(亲测有效)win10复制管理员账户(亲测有效)win10复制管理员账户(亲测有效)

    1、首先,右键点击“我的电脑”并选择“管理”选项。 2、在弹出的管理窗口中,点击“本地用户和组”并进入“用户”界面,在空白处右键点击并选择“新用户”。 3、在新用户窗口中输入用户名和描述,密码可以选择不填,并勾选“密码永不过期”选项。 4、完成新用户创建后,注销当前账户并切换到新创建的账户。 此时,…

    2026年8月25日 用户投稿
    000
  • java中的field有什么用 字段field的3个访问控制技巧

    java中的field有什么用 字段field的3个访问控制技巧java中的field有什么用 字段field的3个访问控制技巧java中的field有什么用 字段field的3个访问控制技巧java中的field有什么用 字段field的3个访问控制技巧

    java中的field主要用于反射,允许运行时检查和修改类的字段,包括私有字段。具体步骤如下:1. 获取class对象后,使用getfield()或getdeclaredfield()获取field对象,前者用于获取public字段(包括继承的),后者用于获取本类声明的所有字段;2. 使用setac…

    2026年8月25日 用户投稿
    000
  • Java中如何包装异常传递给上层方法

    使用异常链包装并传递异常时,需将原始异常作为新异常的cause参数传入,例如捕获IOException后抛出包含该异常的ServiceException。自定义异常类应提供接收Throwable的构造函数以支持异常链,确保堆栈信息完整。此策略适用于将技术异常转换为业务异常、隐藏底层细节及添加上下文信…

    2026年8月25日
    000
  • Java中锁的分类有哪些 详解Java中的各种锁机制

    Java中锁的分类有哪些 详解Java中的各种锁机制Java中锁的分类有哪些 详解Java中的各种锁机制Java中锁的分类有哪些 详解Java中的各种锁机制Java中锁的分类有哪些 详解Java中的各种锁机制

    java中的锁主要分为悲观锁与乐观锁、公平锁与非公平锁、可重入锁与不可重入锁、独占锁与共享锁等类型。1.悲观锁如synchronized和reentrantlock适用于写多场景,每次操作都加锁保证数据一致性;2.乐观锁通过版本号或cas实现,适用于读多写少的场景,提高吞吐量;3.公平锁按申请顺序获…

    2026年8月25日 用户投稿
    100
  • 电脑提示DirectX错误导致玩不了游戏怎么办 4种实用方法

    电脑提示DirectX错误导致玩不了游戏怎么办 4种实用方法电脑提示DirectX错误导致玩不了游戏怎么办 4种实用方法电脑提示DirectX错误导致玩不了游戏怎么办 4种实用方法电脑提示DirectX错误导致玩不了游戏怎么办 4种实用方法

    directx是windows平台上运行游戏和图形应用的关键技术组件。当启动游戏时出现“directx错误”“缺少dx11/12”等提示,可能导致程序闪退、画面异常或无法正常运行。以下是几种有效的解决方式。 方法1:更新或修复DirectX组件 DirectX 12等新版组件通常随系统更新一并发布。…

    2026年8月25日 用户投稿
    000

发表回复

登录后才能评论
关注微信