解决JavaScript重复触发CSS动画失效的方案

解决javascript重复触发css动画失效的方案

本文旨在解决JavaScript控制的CSS动画在首次执行后无法重复播放的问题。核心原因是浏览器优化机制可能导致动画类重复添加时动画不重置。解决方案是先移除动画类,然后利用setTimeout引入微小延迟后再重新添加,强制浏览器重新渲染并触发动画,从而实现动画的可靠重复播放。

为什么CSS动画无法重复触发?

当一个CSS动画类被添加到元素上时,浏览器会根据该类定义的@keyframes规则开始播放动画。然而,如果这个动画类在动画播放完毕后,被立即移除并再次添加,浏览器出于性能优化的考虑,可能会认为元素的动画状态没有发生实质性变化,从而不会重新触发动画。这种情况下,动画状态在浏览器内部可能仍停留在“已完成”的阶段,导致动画无法如预期般重复播放。

解决方案核心:移除与延迟重添加

要强制浏览器重新评估动画并再次触发它,我们需要确保在动画类的移除和重新添加之间存在一个明确的状态变化。最有效的实现方式是:

移除动画类: 使用 element.classList.remove() 方法明确地从元素中移除动画类。这一步是清除任何可能残留的动画状态的关键。延迟重添加: 利用 setTimeout() 函数,即使是设置0毫秒的延迟,也能将重新添加动画类的操作推迟到当前JavaScript执行清空之后。这使得浏览器有机会在重新添加类之前处理DOM更新和样式计算,从而“重置”动画状态,使其准备好再次被触发。

示例代码:问题复现

考虑以下HTML结构和CSS样式,其中.animatedBaseHit类用于触发一个名为pulseBaseHit的闪烁动画:

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



.animatedBaseHit {  animation: pulseBaseHit 0.8s 3; /* 动画持续0.8秒,重复3次 */}@keyframes pulseBaseHit {  0% {    transform: scale(1.05);    background: yellow;  }  50% {    transform: scale(0.9);    background: rgb(44, 44, 44);    box-shadow: -2px 2px 20px black;  }  100% {    transform: scale(1.05);    background: yellow;  }}/* 其他相关CSS */#bases {  position: absolute;  top: 0px;  left: 0px;  height: 20vw;  width: 20vw;  margin-top: 5vw;  margin-right: 5vw;}#b1 {  bottom: 0;  left: 0;}#b2 {  top: 0;  left: 0;}.base {  background: rgb(44, 44, 44);  border-style: solid;  border-width: thick;  box-shadow: -8px 8px 20px black;  width: 42%;  height: 42%;  position: absolute;}.occupiedBase {  background: blue;}

最初的JavaScript代码尝试通过 flashBaseColor 函数来添加这个动画类:

// 原始的JavaScript代码片段,存在重复触发问题function flashBaseColor(b, a) {  if (a == "H") {    // 首次点击有效,再次点击无效    BaseHTMLCollection[b].classList.add("animatedBaseHit");  }}

在这种实现下,首次点击按钮时动画会正常播放。但如果再次点击,由于 .animatedBaseHit 类已经被添加且动画已完成,浏览器不会再次触发动画。

解决方案实现

为了确保动画能够重复播放,我们需要修改 flashBaseColor 函数,在添加动画类之前,先移除它,并引入一个微小的延迟:

const BaseHTMLCollection = [document.getElementById("b1"), document.getElementById("b2")];function clearBase(b) {  BaseHTMLCollection[b].classList.remove("occupiedBase");  // 确保在任何操作前移除动画类,以防状态残留  BaseHTMLCollection[b].classList.remove("animatedBaseHit"); }function flashBaseColor(b, a) {  if (a == "H") {    // 关键修改:先移除动画类    BaseHTMLCollection[b].classList.remove("animatedBaseHit");    // 引入微小延迟后重新添加动画类,强制浏览器重新渲染并触发动画    setTimeout(() => {      BaseHTMLCollection[b].classList.add("animatedBaseHit");    }, 0); // 0ms延迟将任务推入事件队列末尾  }}function updateBaseColor(b, a) {  BaseHTMLCollection[b].classList.add("occupiedBase");  if (b == 1) {    BaseHTMLCollection[b - 1].classList.remove("occupiedBase");  }}function baseAction(base, action) {  clearBase(base);  flashBaseColor(base, action);  updateBaseColor(base, action);}

关键修改解释:

BaseHTMLCollection[b].classList.remove(“animatedBaseHit”);:这一步是至关重要的。它将元素从动画状态中完全“解放”出来,清除任何可能残留的动画状态,使得元素恢复到没有动画类的初始状态。setTimeout(() => { … }, 0);:尽管延迟为0毫秒,setTimeout 仍然会将回调函数(即 classList.add(“animatedBaseHit”))放入浏览器的事件队列中,等待当前JavaScript执行栈中的所有任务完成后再执行。这为浏览器提供了一个短暂的“喘息”时间,使其能够完成动画类的移除操作,并可能触发一次DOM的重新渲染或样式计算。当回调函数在下一个事件循环周期中执行时,浏览器会“感知”到动画类确实被移除过,并准备好再次触发动画。

完整示例代码

以下是包含HTML、CSS和JavaScript的完整代码,展示了如何实现CSS动画的可靠重复播放:

            JavaScript控制CSS动画重复播放            #bases {            position: absolute;            top: 0px;            left: 0px;            height: 20vw;            width: 20vw;            margin-top: 5vw;            margin-right: 5vw;        }        #b1 {            bottom: 0;            left: 0;        }        #b2 {            top: 0;            left: 0;        }        .base {            background: rgb(44, 44, 44);            border-style: solid;            border-width: thick;            box-shadow: -8px 8px 20px black;            width: 42%;            height: 42%;            position: absolute;        }        .animatedBaseHit {            animation: pulseBaseHit 0.8s 3; /* 动画持续0.8秒,重复3次 */        }        @keyframes pulseBaseHit {            0% {                transform: scale(1.05);                background: yellow;            }            50% {                transform: scale(0.9);                background: rgb(44, 44, 44);                box-shadow: -2px 2px 20px black;            }            100% {                transform: scale(1.05);                background: yellow;            }        }        .occupiedBase {            background: blue;        }                

const BaseHTMLCollection = [document.getElementById("b1"), document.getElementById("b2")]; function clearBase(b) { BaseHTMLCollection[b].classList.remove("occupiedBase"); // 确保在任何操作前移除动画类,以防状态残留 BaseHTMLCollection[b].classList.remove("animatedBaseHit"); } function flashBaseColor(b, a) { if (a == "H") { // 关键修改:先移除动画类 BaseHTMLCollection[b].classList.remove("animatedBaseHit"); // 引入微小延迟后重新添加动画类,强制浏览器重新渲染并触发动画 setTimeout(() => { BaseHTML

以上就是解决JavaScript重复触发CSS动画失效的方案的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月23日 00:10:34
下一篇 2025年12月23日 00:10:49

相关推荐

  • css3怎么实现3d翻转效果

    在css3中,可以使用transform属性配合rotateY()、rotateX()等3d旋转函数来实现3d翻转效果。rotateX()可以使元素绕其X轴旋转给定角度,rotateY()可以使元素绕其Y轴旋转给定角度。 本教程操作环境:windows7系统、CSS3&&HTML5版…

    2025年12月24日 好文分享
    000
  • css如何设置内边距

    在css中,可以使用padding属性设置内边距,只需要给元素设置“padding:数值+单位|百分比数值”即可。padding属性设置元素所有内边距的宽度,或者设置各边上内边距的宽度。padding属性不允许指定负边距值。 本教程操作环境:windows7系统、CSS3&&HTML…

    2025年12月24日
    000
  • css如何设置缩放

    在css中,可以使用transfrom属性的scale()方法设置缩放,语法格式为“transfrom:scale(方向)”。scale()方法用于修改元素的大小,通过向量形式定义的缩放值来放大或缩小元素,同时可在不同方向设置不同缩放值。 本教程操作环境:windows7系统、CSS3&&a…

    2025年12月24日 好文分享
    000
  • css如何设置td溢出隐藏

    方法:首先使用“word-break:keep-all”语句设置不换行;然后使用“overflow:hidden”语句设置超出隐藏部分;最后使用“text-overflow:ellipsis”语句设置溢出显示省略号。 本教程操作环境:windows7系统、CSS3&&HTML5版、D…

    2025年12月24日
    000
  • css如何实现元素不随滚动条滚动

    css中可以使用position属性设置元素不随滚动条滚动,语法“position:fixed”。position属性规定元素的定位类型,当值为fixed时,元素以相对浏览器窗口进行定位,无论怎样移动滑动条,都会固定在浏览器窗口的同一位置。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • css如何实现点击改变颜色

    方法:1、使用“:active”伪类,配合“:focus”伪类,只需要将“:active”伪类和“:focus”伪类设置相同背景颜色即可实现效果;2、使用tabindex属性控制次序,配合“:focus”伪类实现点击后变色,且不消失效果。 本教程操作环境:windows7系统、CSS3&&a…

    2025年12月24日
    000
  • css如何实现下拉菜单

    方法:首先使用div元素来创建下拉菜单的内容,并设置“display:none”样式将其隐藏;然后创建打开下拉菜单的HTML元素;最后使用“:hover”选择器设置“display:block”样式,用于鼠标移动到下拉按钮上时显示下拉菜单。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • 详解使用纯CSS实现滚动进度条效果的几种技巧

    本篇文章给大家介绍介绍一下几种不可思议的纯 css 滚动进度条效果。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 问题先行,如何使用 CSS 实现下述滚动条效果? 就是顶部黄色的滚动进度条,随着页面的滚动进度而变化长短。 在继续阅读下文之前,你可以先缓一缓。尝试思考一下上面的效果…

    2025年12月24日 好文分享
    000
  • css怎么显示svg图片

    显示方法:1、使用embed标签,语法“”;2、使用object标签,语法“”;3、使用iframe标签,语法“”。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 SVG 文件可通过以下标签嵌入 HTML 文档,显示出来:、或者 详解: 1、使…

    2025年12月24日
    000
  • css怎么让盒子并排显示

    盒子并排显示的方法:1、使用float属性设置并排显示,只需要给div设置“float:right|left;”即可;2、使用display属性设置同行显示,只需要给div设置“display:inline;”即可。 本教程操作环境:windows7系统、CSS3&&HTML5版、D…

    2025年12月24日 好文分享
    000
  • css如何去隐藏滚动条

    隐藏滚动条的方法:首先使用“::-webkit-scrollbar”伪类选择器选中元素的滚动条,然后使用“display:none;”样式隐藏滚动条即可;具体语法格式“::-webkit-scrollbar{display:none;}”。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • css怎么设置td的宽度

    在css中,可以使用width属性来设置td宽度,只需要给td元素设置“width:宽度值;”样式即可。width属性可以设置元素的宽度,定义的是元素内容区的宽度,不包括填充,边框,或页边距。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 定义…

    2025年12月24日
    000
  • css怎么设置文件编码

    在css中,可以使用“@charset”规则来设置编码,语法格式“@charset “字符编码类型”;”。“@charset”规则可以指定样式表中使用的字符编码,它必须是样式表中的第一个元素,并且不能以任何字符开头。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • css内边框如何设置

    方法:首先在元素中使用border属性定义边框;然后使用“box-sizing:border-box”语句设置内边框。box-sizing属性用于以某种方式定义某些元素,以适应指定区域;当值设置为“border-box”时可定义内边框。 本教程操作环境:windows7系统、CSS3&&am…

    2025年12月24日
    000
  • css超链接如何去掉下划线

    在css中,可以使用text-decoration属性去掉超链接的下划线,只需要给a标签设置“text-decoration:none”样式即可。text-decoration属性规定添加到文本的修饰,当值为none时,表示无文字修饰。 本教程操作环境:windows7系统、CSS3&&am…

    2025年12月24日
    000
  • css怎么给表格设置边框

    css表格设置边框的方法:1、使用border属性给table元素添加边框,语法“table{border:宽度 样式 颜色;}”;2、使用border属性给td元素添加边框,语法“td{border:宽度 样式 颜色;}”。 本教程操作环境:windows7系统、CSS3&&HTM…

    2025年12月24日 好文分享
    000
  • css如何隐藏表格

    在css中,可以使用display属性隐藏表格,只需要给tr元素设置“display:none”样式即可。display属性用于定义建立布局时元素生成的显示框类型,当值为none时,表示该元素不会被显示,并脱离文档流,不占实际空间。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • css怎么设置div的边框样式

    在css中,可以使用border-style属性来设置div的边框样式,只需要给div元素添加“border-style:属性值;”样式代码即可。border-style属性的常用值有:dotted点状、dashed虚线、solid实线等。 本教程操作环境:windows7系统、CSS3&&…

    好文分享 2025年12月24日
    000
  • css如何设置背景图片的大小

    在css中,可以利用background-size属性设置背景图片的大小,该属性可以指定背景图像的尺寸,语法格式“background-size: 带长度单位的数值|百分比值|cover|contain;”。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell …

    2025年12月24日
    000
  • css怎么设置边框内颜色

    css中可使用background-color属性改变边框内颜色,只需要给input元素设置“background-color:颜色值”样式即可。background-color属性设置元素的背景颜色,值为颜色名称、十六进制值和rgb代码。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信