You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动画迭代间隔的animation-delay失效问题及解决方法

为什么animation-delay没法在动画每次循环间生效?怎么加迭代暂停?

问题根源

animation-delay的设计逻辑是仅在动画首次启动前触发延迟,当设置animation-iteration-count: infinite开启无限循环后,后续每一轮动画都会直接衔接上一轮的结束状态,不会再次触发延迟。你设置的1s延迟只会在第一次摇晃开始前生效,之后的循环就直接连起来了,所以看不到每次迭代间的暂停。

解决办法

方法1:把暂停时间融入动画总时长(最直接的纯CSS方案)

将原动画时长(1s)加上想要的暂停时长(比如1s),把总时长设为2s,然后在关键帧里让最后一段时间保持静止状态,模拟暂停效果。

修改后的CSS代码:

.fa-shake {
    animation-name: fa-shake;
    animation-duration: 2s; /* 1s动画执行 + 1s暂停 */
    animation-timing-function: linear;
    animation-iteration-count: infinite;
    width: 150px;
    height: auto;
}

@keyframes fa-shake {
    /* 前50%时间(1s)执行摇晃动作 */
    0%, 10%, 30%, 50% {
        transform: rotate(10deg);
    }
    20%, 40% {
        transform: rotate(-20deg);
    }
    /* 后50%时间(1s)保持静止,实现暂停 */
    50.1%, 100% {
        transform: rotate(0deg);
    }
}

这样每一轮循环都会是「1秒摇晃 + 1秒暂停」,完全符合需求。

方法2:用CSS变量灵活控制时长(适合需频繁调整的场景)

如果后续需要随时修改动画或暂停的时长,可以用CSS变量把两者分离,不用手动计算总时长:

.fa-shake {
    --shake-duration: 1s;
    --pause-duration: 1s;
    animation-name: fa-shake;
    animation-duration: calc(var(--shake-duration) + var(--pause-duration));
    animation-timing-function: linear;
    animation-iteration-count: infinite;
    width: 150px;
    height: auto;
}

@keyframes fa-shake {
    0% {
        transform: rotate(0deg);
    }
    10%, 30%, 50%, 70%, 90% {
        transform: rotate(10deg);
    }
    20%, 40%, 60%, 80% {
        transform: rotate(-20deg);
    }
    /* 按比例计算动画结束的节点,之后保持静止 */
    calc(100% * var(--shake-duration) / (var(--shake-duration) + var(--pause-duration))) {
        transform: rotate(0deg);
    }
    100% {
        transform: rotate(0deg);
    }
}

之后只要修改--shake-duration或--pause-duration的数值,就能快速调整动画和暂停的时长,不用改动关键帧的百分比。

方法3:JS控制动画播放状态(适合复杂交互场景)

如果需要和用户交互结合(比如点击触发暂停),可以用JS切换animation-play-state属性:

const shakeElement = document.querySelector('.fa-shake');
// 每次动画结束后暂停1秒,再继续播放
shakeElement.addEventListener('animationend', () => {
    shakeElement.style.animationPlayState = 'paused';
    setTimeout(() => {
        shakeElement.style.animationPlayState = 'running';
    }, 1000);
});

这种方法适合纯CSS方案满足不了的复杂交互需求。

测试代码

替换原有CSS后,用以下HTML即可看到效果:

<img class="fa-shake" src="https://parspng.com/wp-content/uploads/2022/03/telephonepng.parspng.com-2-600x643.png">

内容的提问来源于stack exchange,提问作者Lucas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:40:19