CSS 动画迭代间添加暂停:正确实现循环动画的间隔控制

发布时间 - 2025-12-26 00:00:00    点击率:

`animation-delay` 仅作用于动画首次启动前,无法控制每次循环之间的间隔;要实现在每轮动画结束后暂停一段时间再开始下一轮,需通过延长动画周期并合理分配关键帧时间占比来模拟“停顿”效果。

在 CSS 中,animation-delay 的设计初衷是定义动画第一次播放前的等待时间,而非两次迭代之间的间隔。因此,即使你设置 animation-delay: 1s 并配合 animation-iteration-count: infinite,动画仍会无缝循环——第 2 次、第 3 次……迭代均不会插入额外延迟。

✅ 正确解法:将“停顿”作为动画周期的一部分
即:拉长 animation-duration,并在 @keyframes 中,用关键帧(如 90% → 100%)让元素保持静止状态,从而视觉上形成“播放 → 暂停 → 播放”的节奏。

以你的 .fa-shake 为例,原动画时长为 1s,无停顿。若希望每次抖动后暂停 0.5s,可将总时长设为 1.5s,并调整关键帧分布:

.fa-shake {
  animation-name: fa-shake;
  animation-duration: 1.5s;           /* 总周期 = 动画时长 + 暂停时长 */
  animation-timing-function: linear;
  animation-iteration-count: infinite;
  animation-fill-mode: forwards;
  width: 150px;
  height: auto;
}

@keyframes fa-shake {
  /* 0% → 66.7%:完成完整抖动动画(原1s映射为1s/1.5s ≈ 66.7%) */
  0%, 6.7%, 13.3%, 20%, 26.7%, 33.3%, 40%, 46.7%, 53.3%, 60%, 66.7% {
    transform: rotate(0deg);
  }
  6.7%, 20%, 33.3%, 46.7%, 60% {
    transform: rotate(10deg);
  }
  13.3%, 26.7%, 40%, 53.3% {
    transform: rotate(-20deg);
  }

  /* 66.7% → 100%:静止暂停(0.5s 占比 = 0.5 / 1.5 ≈ 33.3%) */
  66.7%, 100% {
    transform: rotate(0deg); /* 保持起始态,视觉暂停 */
  }
}

? 关键技巧:

  • 计算比例:若原动画耗时 T₁,期望暂停 T₂,则新 animation-duration = T₁ + T₂,暂停段应覆盖 (T₂ / (T₁ + T₂)) × 100% 的关键帧区间;
  • 使用 animation-fill-mode: forwards 可确保最后一帧状态被保留(虽本例中 0% 和 100% 相同,但增强健壮性);
  • 避免在 0% 和 100% 同时定义不同状态,否则可能引发意外跳变。

⚠️ 注意事项:

  • 不要依赖 animation-delay 实现循环间隔——它对后续迭代完全无效;
  • 若需复杂节奏(如渐进暂停、多阶段延迟),建议改用 JavaScript 控制 animation-play-state 或使用 @property + transition(现代浏览器);
  • 所有关键帧百分比必须严格递增且覆盖 0% 和 100%,否则动画行为不可预测。

通过将暂停“内化”为动画逻辑的一部分,你既能保持纯 CSS 实现的简洁性,又能精准控制每一次迭代间的呼吸感。


# css  # javascript  # java  # 浏览器 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 浅谈javascript alert和confirm的美化  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  如何用西部建站助手快速创建专业网站?  如何在服务器上配置二级域名建站?  电商网站制作价格怎么算,网上拍卖流程以及规则?  Python高阶函数应用_函数作为参数说明【指导】  Laravel如何为API生成Swagger或OpenAPI文档  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  JavaScript如何实现路由_前端路由原理是什么  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  如何在七牛云存储上搭建网站并设置自定义域名?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  如何在云主机上快速搭建多站点网站?  深圳网站制作平台,深圳市做网站好的公司有哪些?  如何快速生成高效建站系统源代码?  如何在IIS中配置站点IP、端口及主机头?  详解Android图表 MPAndroidChart折线图  JavaScript如何实现继承_有哪些常用方法  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  java ZXing生成二维码及条码实例分享  如何在IIS管理器中快速创建并配置网站?  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Android滚轮选择时间控件使用详解  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  网站制作大概多少钱一个,做一个平台网站大概多少钱?  专业商城网站制作公司有哪些,pi商城官网是哪个?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  用v-html解决Vue.js渲染中html标签不被解析的问题  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  Python制作简易注册登录系统  Laravel如何创建自定义Artisan命令?(代码示例)  如何在IIS中新建站点并配置端口与IP地址?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  javascript中的try catch异常捕获机制用法分析  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  如何用搬瓦工VPS快速搭建个人网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何正确选择百度移动适配建站域名?  详解jQuery中基本的动画方法  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  详解Android——蓝牙技术 带你实现终端间数据传输  Laravel如何配置和使用缓存?(Redis代码示例)  php 三元运算符实例详细介绍  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?