讲师中心 微信公众号
AI工具推荐 视频效率加速

如何用 CSS 动画与 animationend 事件实现循环渐进式圆圈动画

夏宇吖_5822

夏宇吖_5822

发布时间:2026-03-27 09:27:23

|

749人浏览过

|

来源于php中文网

原创

如何用 CSS 动画与 animationend 事件实现循环渐进式圆圈动画

本文详解如何通过分离动画类、利用 animationend 事件触发链式执行,配合 setTimeout 控制毫秒级时序,实现 10 个随机位置圆圈逐个绽放并无限循环的流畅动画效果。

本文详解如何通过分离动画类、利用 `animationend` 事件触发链式执行,配合 `settimeout` 控制毫秒级时序,实现 10 个随机位置圆圈逐个绽放并无限循环的流畅动画效果。

要实现“10 个圆圈在 1 秒内(每 100ms 一个)依次从屏幕随机位置中心绽放、放大并淡出,且整个过程无限循环”,关键在于避免动画复用失效和确保时序可控、可重入。原代码中直接在 forEach 中连续调用 circ() 导致所有圆圈同时启动;而将 setTimeout 放在外部 go() 调用中又无法维持单轮动画的连贯性——根本原因在于:CSS 动画一旦已应用且未重置状态,再次添加相同 animation 类不会重新触发。

✅ 正确解法:动画类动态切换 + animationend 驱动下一轮

核心思路是:

  • 将动画逻辑完全交由 CSS 管理(性能更优、声明式清晰);
  • 用独立的 .anim 类控制动画播放,每次播放前先移除该类,再异步添加,强制浏览器重新触发动画;
  • 利用 animationend 事件监听单个圆圈动画结束,自动触发下一个圆圈(本例中用于无缝循环:最后一个圆圈动画结束后,立即重启第一轮);
  • 使用 setTimeout(..., N * 100) 精确控制 10 个圆圈的启动偏移,保证 0.1 秒间隔。

以下是完整、可直接运行的实现:

✅ HTML(精简结构)

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <!-- 10 个占位圆圈 -->
  <span class="circle"></span>
  <span class="circle"></span>
  <span class="circle"></span>
  <span class="circle"></span>
  <span class="circle"></span>
  <span class="circle"></span>
  <span class="circle"></span>
  <span class="circle"></span>
  <span class="circle"></span>
  <span class="circle"></span>
  <script src="script.js"></script>
</body>
</html>

✅ CSS(分离静态样式与动画行为)

body {
  background-color: #000;
  width: 100vw;
  height: 100vh;
  margin: 0;
  overflow: hidden; /* 防止滚动条干扰 */
  position: relative; /* 确保绝对定位子元素以 viewport 为参考 */
}

.circle {
  position: absolute;
  border-radius: 50%;
  transform: translate(-50%, -50%) scale(0.1); /* 初始极小尺寸 */
  opacity: 1;
}

.anim {
  animation: scale 1s ease-out forwards; /* forwards 保持最终状态(opacity: 0) */
}

@keyframes scale {
  from {
    transform: translate(-50%, -50%) scale(0.1);
    opacity: 1;
  }
  to {
    transform: translate(-50%, -50%) scale(3);
    opacity: 0;
  }
}

? 注意:animation-fill-mode: forwards(简写为 forwards)至关重要——它确保动画结束后元素保留 to 状态(即 opacity: 0),避免闪烁或回弹。

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

✅ JavaScript(精准时序 + 循环驱动)

function go() {
  const circles = document.querySelectorAll('.circle');
  const width = window.innerWidth;
  const height = window.innerHeight;

  // 单个圆圈初始化 & 播放函数
  const initCircle = (circle, index) => {
    // 随机位置、尺寸、颜色
    const X = Math.floor(Math.random() * width);
    const Y = Math.floor(Math.random() * height);
    const Size = Math.floor((Math.random() * 6) + 5) * 10;
    const R = Math.floor(Math.random() * 255).toString(16).padStart(2, '0');
    const G = Math.floor(Math.random() * 255).toString(16).padStart(2, '0');
    const B = Math.floor(Math.random() * 255).toString(16).padStart(2, '0');

    circle.style.left = `${X}px`;
    circle.style.top = `${Y}px`;
    circle.style.width = `${Size}px`;
    circle.style.height = `${Size}px`;
    circle.style.backgroundColor = `#${R}${G}${B}`;

    // 关键:移除动画类 → 强制重置 → 异步添加 → 触发新动画
    circle.classList.remove('anim');
    setTimeout(() => circle.classList.add('anim'), 0);
  };

  // 启动第一轮:10 个圆圈按 100ms 间隔依次启动
  circles.forEach((circle, i) => {
    // 监听自身动画结束,触发下一轮(即重启整个序列)
    circle.addEventListener('animationend', () => {
      if (i === circles.length - 1) { // 最后一个圆圈结束时,重启
        go();
      }
    });
    // 按索引错开启动时间:0ms, 100ms, 200ms...900ms
    setTimeout(initCircle, i * 100, circle, i);
  });
}

// 启动首轮
go();

? 关键细节说明:

  • setTimeout(..., 0) 是必要的“微任务延迟”,确保 DOM 样式更新完成后再触发动画,否则移除/添加 .anim 类可能被浏览器合并,导致动画不触发;
  • padStart(2, '0') 修复了原代码中十六进制颜色值不足两位(如 a → 0a)导致的显示异常;
  • animationend 仅绑定一次(在 go() 初始化时),避免重复监听;
  • 循环逻辑简洁:仅当最后一个圆圈动画结束时调用 go(),自然形成无限序列,无需全局定时器,无累积延迟风险。

✅ 总结:为什么这样更健壮?

问题点 原方案缺陷 本方案优势
动画不重播 直接复用 .anim 类,浏览器跳过重复动画 动态 remove + add + setTimeout(0) 强制重触发
时序失控 外层 setTimeout(go, 1000) 导致整轮硬同步,无法衔接上一轮末尾 由 animationend 精确驱动下一轮起点,节奏稳定
颜色/尺寸异常 toString(16) 可能生成 1, f 等单字符,拼接后颜色错误 padStart(2, '0') 保证标准 6 位 HEX
内存与性能 每次 go() 重复绑定事件 事件监听在初始化时一次性注册,无泄漏

此模式不仅适用于圆圈动画,更是实现任意序列化 CSS 动画循环(如加载指示器、粒子路径、卡片翻转流)的通用范式:状态归零 → 数据更新 → 异步触发动画 → 事件接力。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
css
css

css是层叠样式表,用来表现HTML或XML等文件样式的计算机语言,不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

4916

2023.06.15

css居中
css居中

css居中:1、通过“margin: 0 auto; text-align: center”实现水平居中;2、通过“display:flex”实现水平居中;3、通过“display:table-cell”和“margin-left”实现居中。本专题为大家提供css居中的相关的文章、下载、课程内容,供大家免费下载体验。

1057

2023.07.27

css如何插入图片
css如何插入图片

cssCSS是层叠样式表(Cascading Style Sheets)的缩写。它是一种用于描述网页或应用程序外观和样式的标记语言。CSS可以控制网页的字体、颜色、布局、大小、背景、边框等方面,使得网页的外观更加美观和易于阅读。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1938

2023.07.28

css超出显示...
css超出显示...

在CSS中,当文本内容超出容器的宽度或高度时,可以使用省略号来表示被隐藏的文本内容。本专题为大家提供css超出显示...的相关文章,相关教程,供大家免费体验。

3786

2023.08.01

css字体颜色
css字体颜色

CSS中,字体颜色可以通过属性color来设置,用于控制文本的前景色,字体颜色在网页设计中起到很重要的作用,具有以下表现作用:1、提升可读性;2、强调重点信息;3、营造氛围和美感;4、用于呈现品牌标识或与品牌形象相符的风格。

7745

2023.08.10

什么是css
什么是css

CSS是层叠样式表(Cascading Style Sheets)的缩写,是一种用于描述网页(或其他基于 XML 的文档)样式与布局的标记语言,CSS的作用和意义如下:1、分离样式和内容;2、页面加载速度优化;3、实现响应式设计;4、确保整个网站的风格和样式保持统一。

6551

2023.08.10

css三角形怎么写
css三角形怎么写

CSS可以通过多种方式实现三角形形状,本专题为大家提供css三角形怎么写的相关教程,大家可以免费体验。

2177

2023.08.21

css设置文字颜色
css设置文字颜色

CSS(层叠样式表)可以用于设置文字颜色,这样做有以下好处和优势:1、增加网页的可视化效果;2、突出显示某些重要的信息或关键字;3、增强品牌识别度;4、提高网页的可访问性;5、引起不同的情感共鸣。

3131

2023.08.22

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn