index.html如何实现简单的CSS动画循环?并不只看表面做法,关键还要理解相关条件、限制和后续影响。
CSS动画实现需两步:先用@keyframes定义关键帧(名称必须准确),再用animation简写属性绑定到class上;缺名称、漏infinite、误用内联样式或触发重排均会导致失败。
核心是两步:先声明关键帧,再绑定到 HTML 元素。不写 @keyframes 名称或拼错,动画就完全不会触发——这是最常卡住的地方。
比如让一个按钮左右轻微晃动:
@keyframes wiggle { 0%, 100% { transform: translateX(0); } 25% { transform: translateX(-5px); } 75% { transform: translateX(5px); }}
然后在按钮的 class 中引用:
.btn { animation: wiggle 0.6s ease-in-out infinite;}
infinite 是实现「循环」的关键值,缺了它只播一次s 或 ms,写成 0.6 不生效@keyframes 里写 vendor 前缀(如 -webkit-transform),现代浏览器已原生支持单独写 animation-iteration-count: infinite 没问题,但容易漏掉其他必要属性(比如 animation-duration),导致动画不启动。推荐优先用简写 animation 一次性配齐。
animation: [name] [duration] [timing-function] [delay] [iteration-count] [direction] [fill-mode] [play-state];
[direction] 可设为 alternate 让每次循环反向播放,避免生硬折返CSS 动画必须通过 class 或标签选择器生效,style="animation: ..." 写在 HTML 标签里会失效——因为内联样式无法调用 @keyframes 定义的动画名。
<button class="wiggle-btn">点我</button>,然后在 CSS 中写 .wiggle-btn { animation: wiggle 0.6s infinite; }
:hover 伪类即可,无需 JS@keyframes 放在 <style> 标签外(比如误写进 <body>),它必须在 CSS 作用域内用 transform 和 opacity 做动画几乎不会卡,但改 width、height、top、left 就会强制浏览器反复计算布局,尤其在低端设备上明显掉帧。
transform: translateX() 就别用 margin-left 或 left
will-change: transform;(仅对复杂动画),但别滥用,可能引发内存占用升高@keyframes 名称一致、infinite 写对位置、且作用在 class 上,90% 的循环动画都能跑起来。