骨架按钮(骨架屏占位加载/微光扫过特效源码)
骨架屏按钮组件:加载时显示微光扫过的骨架占位,数据返回后淡入真实按钮,原生 JS 模拟异步加载,减少用户等待焦虑。
效果演示(真实可交互)
粤喵组件库
骨架按钮:先占位、后填充,减少用户等待焦虑。
骨架屏用微光扫过动画,加载完成淡入真实内容
完整代码
HTML 结构:
<div class="sk-card">
<!-- 骨架层 -->
<div id="sk-skeleton" class="sk-skeleton">
<span class="sk-block sk-line"></span>
<span class="sk-block sk-line sk-line-short"></span>
<span class="sk-block sk-btn-ph"></span>
</div>
<!-- 真实内容层 -->
<div id="sk-real" class="sk-real" hidden>
<h4 class="sk-title">粤喵组件库</h4>
<p class="sk-desc">骨架按钮:先占位、后填充。</p>
<button class="sk-action">立即体验</button>
</div>
</div>
CSS 核心代码:
/* 骨架块:微光扫过 */
.sk-block { position: relative; background: #262c3f;
border-radius: 8px; overflow: hidden; }
.sk-block::after {
content: ''; position: absolute; inset: 0;
background: linear-gradient(100deg, transparent 30%,
rgba(255,255,255,.08) 50%, transparent 70%);
transform: translateX(-100%);
animation: sk-shimmer 1.4s infinite;
}
@keyframes sk-shimmer { to { transform: translateX(100%); } }
.sk-btn-ph { height: 42px; border-radius: 10px; width: 100%; }
JS 切换逻辑:
const skeleton = document.getElementById('sk-skeleton');
const real = document.getElementById('sk-real');
trigger.addEventListener('click', () => {
skeleton.hidden = true; // 隐藏骨架
real.hidden = false; // 显示真实内容(CSS 淡入)
});
参数说明
| 参数 | 取值 | 说明 |
|---|---|---|
.sk-block::after | translateX(-100%) → 100% | 光带扫过路径 |
sk-shimmer | 1.4s infinite | 扫光速度,网络快时可调短 |
| 光带透明度 | rgba(255,255,255,.08) | 太亮抢眼、太暗无感,建议 .06~.12 |
sk-btn-ph | 42px | 骨架按钮占位高度,对齐真实按钮 |
| 淡入 | sk-fade .5s | 真实内容切换动画 |
兼容性与性能
- 骨架屏方案完全基于 CSS 伪元素 + transform 动画,零依赖零 JS 依赖(切换逻辑可换任意框架)
- transform 动画不触发重排,多骨架块同时扫光也不卡顿;
overflow: hidden确保光带不溢出圆角 - 骨架颜色建议用
currentColor或 CSS 变量,方便跟随明暗主题 - 真实场景中把
setTimeout换成接口返回的 Promise,在 then/finally 中执行切换即可
常见问题
Q: 骨架按钮和普通 loading 有什么区别? 骨架展示的是「结构占位」——文字、按钮等形状先画出来,适合页面级加载;普通 loading 是按钮内的转圈,适合单点操作。两者常配合使用。
Q: 光带扫过的方向能改吗? 可以,改 translateX(-100%) 为 translateY(-100%) 并配合 linear-gradient(180deg, ...) 即变为垂直扫光。
Q: 如何适配暗色主题? 把骨架底色和光带颜色抽成 CSS 变量,如 --sk-bg / --sk-shine,在 @media (prefers-color-scheme: dark) 下覆盖即可。
Q: 数据加载失败时怎么处理? 保留骨架层,在骨架层内追加一条错误占位(如「加载失败,点击重试」),点击后重新请求并再次进入骨架态。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布: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(缓动曲线)等属性即可,代码中有注释说明。