一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

html如何制作加载动画_html纯css实现loading效果

时间:2026-08-03 09:23:49 编辑:袖梨 来源:一聚教程网

处理html如何制作加载动画_html纯css实现loading效果这类问题时,先确认目标场景,再按步骤核对配置或玩法细节。

最简纯CSS加载动画需两步:定义@keyframes旋转帧并绑定animation;关键细节包括用border-top-color配合transparent实现单色弧线、加border-radius:50%、硬件加速修复Safari闪烁、aspect-ratio自适应、visibility+opacity平滑隐藏。

用 @keyframes + animation 实现最简 loading 圆圈

纯 CSS 加载动画核心就两步:定义旋转帧、绑定到元素。不需要 JS,也不依赖外部资源。

常见错误是直接给 borderanimation,但默认不生效——因为 border 不是独立可动画属性,得用 border-top-color 或整个 border 配合 transparent 才能出“旋转缺口”效果。

推荐写法:

.loader {  width: 40px;  height: 40px;  border: 4px solid #eee;  border-top-color: #333;  border-radius: 50%;  animation: spin 1s linear infinite;}<p>@keyframes spin {to { transform: rotate(360deg); }}
  1. border 设为四边同色,再单独覆盖 border-top-color,形成视觉上的“单色弧线”
  2. border-radius: 50% 必须加,否则是方框转圈
  3. 动画时长建议 0.8s–1.2s,太慢显卡顿,太快像闪屏

避免 transform: rotate() 在 Safari 上闪烁

Safari(尤其是 iOS 15–16)对纯 transform 动画渲染不稳定,可能偶发掉帧或白屏闪动。

解决方法不是换动画类型,而是加硬件加速提示:

.loader {  transform: rotate(0deg);  transform-style: preserve-3d; /* 关键 */  backface-visibility: hidden;   /* 关键 */}
  1. 只加 transform: translateZ(0) 也行,但不如上面两个属性兼容性稳
  2. 不要滥用 will-change: transform,它在低内存设备上反而拖慢首帧
  3. 这个修复对 Chrome/Firefox 无害,可全端写上

让 loading 动画随父容器大小自适应

固定 width/height 在响应式布局里很脆弱,尤其用在按钮或卡片内部时。

更健壮的做法是用 aspect-ratio + min-width

.loader {  aspect-ratio: 1;  min-width: 1em;  border: 0.15em solid #eee;  border-top-color: currentColor;  animation: spin 1s linear infinite;}
  1. aspect-ratio: 1 保证永远是正圆,不用管宽高是否相等
  2. min-width: 1em 让它随父级字体大小缩放(比如父级设了 font-size: 12px,loader 就是 12px 宽)
  3. borderem 单位,border-top-color: currentColor 可继承文字色,方便主题切换

加载完成时如何平滑隐藏动画

直接 display: none 会突兀消失,用户可能没意识到操作已结束;用 opacity: 0 又占文档流位置。

正确做法是结合 visibilityopacity,并控制过渡时机:

.loader {  opacity: 1;  visibility: visible;  transition: opacity 0.2s ease, visibility 0.2s;}<p>.loader.hide {opacity: 0;visibility: hidden;}
  1. 必须同时设 visibility: hiddenopacity: 0,否则 opacity: 0 仍可点击或影响 tab 键顺序
  2. transition 不要加 all,只声明具体属性,避免意外触发其他 CSS 变化
  3. JS 控制时,先加 .hide 类,别用 setTimeout 去 remove,容易和动画时间错拍

真正难的不是画个转圈,而是让它在各种尺寸、主题、浏览器和状态切换中都不出戏。细节比如 backface-visibilityvisibility + opacity 组合,恰恰是上线后被 QA 抓出来的高频问题。

热门栏目