用::before实现加载动画需三步:父元素设position: relative;content用零宽空格或字体图标Unicode;通过.is-loading类控制显示与@keyframes动画。
::before 实现加载中图标动画直接上手:用 ::before 插入一个带 animation 的小图标,比 JS 插 DOM 轻量,也比改 class 切换更干净。关键是它得「动态显示/隐藏」,不能一刷新就一直转。
position: relative,否则 ::before 定位会飘走content 不能为空字符串(""),否则伪元素不渲染;推荐用 "200B"(零宽空格)或字体图标 Unicode(如 "e900")@keyframes 单独定义,别写在 ::before 里——CSS 预处理器或构建工具可能抽风,导致 animation 不生效is-loading,再用 .is-loading::before 触发显示和动画::before 加载图标的常见错觉:明明写了却没出现最常卡在这几步:
position: relative,::before 默认按文档流渲染,可能被挤到看不见的位置,甚至被父容器 overflow: hidden 剪掉content 写成 content: "" 且没配 display 或尺寸,伪元素存在但宽高为 0,转也白转font-family 拼错,结果只显示方块或空白-webkit-animation 在 Safari 旧版仍必要)、或 animation-duration 设为 0s
font-icon 还是 svg 或纯 CSS 画?选哪个更稳不是越炫越好,而是看维护成本和兼容性:
border 旋转做 spinner):零依赖,但 IE11 及以下对 transform-origin 和 animation-timing-function 支持差,容易卡顿content: "f110"):需确保字体加载完成,否则闪白;建议配合 font-display: block 防止 FOITcontent: url("data:image/svg+xml,...")):兼容性好、可缩放、无网络请求,但 base64 编码后体积略大,且部分老安卓 WebView 对 data URL 解析异常background-image 替代 content,规避 content 对字体/编码的依赖,也更容易控制尺寸和颜色光写好 CSS 不够,JS 绑定时机不对,照样白搭:
立即学习“前端免费学习笔记(深入)”;
is-loading 类——如果接口秒回,用户会看到一闪而过的 loading,体验反而更差;应在 fetch 发出后、且响应未返回前才添加finally 里移除 class,而不是只在 then 或 catch 里删——否则请求被取消、超时、网络中断时,loading 图标会永远挂着AbortController 配合状态标记,避免某个请求失败后误删整个 loading 状态transform: translateZ(0) 强制开启 GPU 渲染