骨架屏加载动画(Skeleton Screen 占位加载 4 款)
4 种骨架屏加载方案:文章卡片、个人主页、消息列表、图片网格,纯 CSS 扫光动画实现,附加载完成切换演示,复制即用零依赖。
效果演示(真实可交互)
点击上方「加载完成」按钮,即可体验骨架屏切换为真实内容的完整流程;再点「重新加载」恢复骨架屏状态。
粤喵前端组件库 · 骨架屏实践
骨架屏(Skeleton Screen)用灰色占位块模拟页面最终布局,让用户感知内容正在加载,能显著降低跳出率、提升感知性能。
完整代码
HTML(以文章卡片骨架为例):
<div class="skeleton-card">
<div class="sk-media"></div>
<div class="sk-line w70"></div>
<div class="sk-line w90"></div>
<div class="sk-line w55"></div>
</div>
CSS(扫光核心 + 占位块):
.skeleton-card { background: #fff; border-radius: 14px; padding: 16px; }
/* 占位块:灰色圆角块 */
.sk-media, .sk-line {
position: relative; overflow: hidden;
background: #e9edf6; border-radius: 6px;
}
.sk-media { height: 96px; margin-bottom: 12px; }
.sk-line { height: 12px; margin: 10px 0; }
.w70 { width: 70%; } .w90 { width: 90%; } .w55 { width: 55%; }
/* 扫光动画:一道高光从左向右循环掠过 */
.sk-media::after, .sk-line::after {
content: ''; position: absolute; inset: 0;
background: linear-gradient(100deg, transparent 30%, rgba(255,255,255,.7) 50%, transparent 70%);
transform: translateX(-100%);
animation: sweep 1.5s ease-in-out infinite;
}
@keyframes sweep { 100% { transform: translateX(100%); } }
其余 3 种骨架(个人主页、消息列表、图片网格)的结构见演示区 .sk-* 系列,只需把占位块换成头像(圆形)、标签(小圆角块)、网格瓦片等形状即可,动画共用同一套扫光。加载完成切换逻辑见演示区脚本:用 hidden 属性在骨架容器与真实内容容器之间切换,零成本实现。
参数说明
| 参数 | 位置 | 说明 |
|---|---|---|
| 扫光速度 | animation: sweep 1.5s | 数字越大越慢,推荐 1.2s - 2s |
| 高光强度 | rgba(255,255,255,.7) | 调透明度控制高光亮暗 |
| 占位块颜色 | background: #e9edf6 | 改成比页面背景略深的颜色 |
| 占位块尺寸 | .sk-line 的 height/width | 模拟真实内容的宽高比例 |
| 切换逻辑 | hidden 属性 + 按钮事件 | 数据到达后隐藏骨架、显示内容 |
兼容性与性能
- 动画仅使用
transform: translateX(GPU 合成层),扫光过程 60fps 流畅,不触发重排 - 兼容 Chrome / Firefox / Safari / Edge 最新版,移动端表现一致
- 骨架屏只在首屏数据请求期间渲染,请求完成后即从 DOM 移除,无长期性能开销
- 与懒加载、图片占位(
aspect-ratio)组合使用效果更佳;建议同一屏骨架数量不超过 10 个,避免占位块过多造成的视觉噪音
常见问题
Q: 骨架屏能商用吗? 可以。本组件为粤喵自研,MIT 友好的免费商用,无需署名。
Q: 数据加载很快,骨架屏一闪而过怎么办? 可给骨架屏设置最小展示时长(如 300ms),或在 requestAnimationFrame 中延迟移除,避免闪烁(FOUC)。
Q: 怎么让扫光只扫一次而不是无限循环? 把 infinite 去掉,并在数据到达时移除整个骨架容器即可;也可以把 animation-iteration-count 设为 2-3 次。
Q: 图片加载时想用骨架屏占位怎么办? 给图片外层包一个 .sk-media 占位块,图片加载完成(load 事件)后给占位块加 display: none 或移除类名即可。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布:2026-09-01 · 最近更新:2026-09-01
- 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
- 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。