news 2026/9/10 3:21:36

daisyUI Skeleton 骨架屏组件:加载占位动画的类名用法与源码级实现原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
daisyUI Skeleton 骨架屏组件:加载占位动画的类名用法与源码级实现原理

daisyUI Skeleton 骨架屏组件:加载占位动画的类名用法与源码级实现原理

【免费下载链接】daisyui🌼 🌼 🌼 🌼 🌼 The most popular, free and open-source Tailwind CSS component library项目地址: https://gitcode.com/GitHub_Trending/da/daisyui

Skeleton(骨架屏)是 daisyUI 中用于展示组件加载状态的基础组件,在真实数据尚未到达前,用带呼吸扫光动画的占位区块预先撑起页面结构,从而避免内容突然出现造成的布局跳动。本文以 Skeleton 组件文档/components/skeleton/+page.md) 为核心,系统讲解skeletonskeleton-text两个类的完整用法,并结合 skeleton.css 的实现源码,剖析其扫光渐变、主题配色联动、RTL 适配与无障碍降级的底层原理。

Skeleton 组件是什么、用在哪里

Skeleton 常被称作"骨架屏"或"加载占位符",它不是一个渲染真实内容的元素,而是一个带加载动画的占位 div。在文档 frontmatter 中,其定位被准确概括为:

"Skeleton is a component that can be used to show a loading state of a component."

典型应用场景包括:

  • 异步请求数据时,先渲染一个与最终卡片轮廓一致的灰色块;
  • 加载评论区、用户头像、列表项时,用圆块与细长条组合模拟真实布局;
  • 等待 AI/大模型生成文本时,用文字扫光效果提示"正在思考中"(本文案例示例即为此场景)。

类名一览

类型类名作用
component(组件类)skeleton一个带加载扫光动画的占位 div
modifier(修饰类)skeleton-text将扫光动画作用于文字本身(只扫文字颜色而非背景色)

对应的类名元数据可在文档 frontmatter 的classnames.componentclassnames.modifier字段中找到,源码实现见 skeleton.css。

基础用法:一个纯占位方块

最简单的情况下,只需给一个空元素挂上skeleton类,并用 Tailwind 的h-*/w-*工具类指定尺寸——skeleton自身不携带任何宽高,尺寸完全由你决定:

<div class="skeleton h-32 w-32"></div>

在官方文档的代码示例中,类名会写作$$skeleton$$是"可被配置前缀替换"的占位标记,即文档站上的前缀演示)。如果项目没有配置 daisyUI 前缀,实际使用时应去掉$$,直接写skeleton;若你在 Tailwind 中配置了前缀,则将其替换为对应前缀。

使用规则(来自技能文档与官方说明):

  • skeleton本身只负责背景、圆角与动画,必须配合h-*w-*工具类才能确定占位区域的大小,否则元素会因为没有内容而高度为 0、无法显示;
  • 需要圆形占位(如头像)时,追加rounded-full;需要默认组件圆角时无需额外操作,源码中的rounded-box已提供了与主题圆角令牌一致的圆角。

实战示例一:圆形头像 + 内容(典型评论加载态)

下方结构模拟了一条"头像 + 两行昵称/文字 + 整块正文"的社交评论骨架。外层用flexgap布局,头像使用rounded-full变成圆形,并用shrink-0防止其在 flex 容器中被压缩:

<div class="flex w-52 flex-col gap-4"> <div class="flex items-center gap-4"> <div class="skeleton h-16 w-16 shrink-0 rounded-full"></div> <div class="flex flex-col gap-4"> <div class="skeleton h-4 w-20"></div> <div class="skeleton h-4 w-28"></div> </div> </div> <div class="skeleton h-32 w-full"></div> </div>

这段结构的关键点在于:

  • 外层宽度由w-52限定,flex-col gap-4负责纵向排布与 4 个单位间距;
  • 头像占位h-16 w-16与文本占位h-4 w-20 / w-28的宽高比,基本对齐真实内容渲染后的视觉节奏;
  • 因为所有占位块共享同一个扫光动画且间距一致,视觉上如同一个整体在"呼吸",观感统一。

实战示例二:矩形封面 + 多行正文(典型卡片加载态)

下面的结构模拟"封面大图 + 标题 + 两行正文"的文章卡片,是内容社区中最常见的骨架形态:

<div class="flex w-52 flex-col gap-4"> <div class="skeleton h-32 w-full"></div> <div class="skeleton h-4 w-28"></div> <div class="skeleton h-4 w-full"></div> <div class="skeleton h-4 w-full"></div> </div>

这里封面占位宽度w-full、高度h-32;标题行故意比正文行短(w-28),正文行铺满(w-full),模仿真实文字排版中的换行收缩,让骨架接近最终内容的轮廓——这正是骨架屏降低"内容突变感"的核心手法:先让用户看清即将出现什么,再平滑替换为真实内容

实战示例三:skeleton-text 文字扫光效果

当需要为"一段即将出现的文字"预留位置(例如等待 AI 生成结果)时,使用skeleton skeleton-text组合类可以让扫光动画直接作用在文字笔画上:

<span class="skeleton skeleton-text">AI is thinking harder...</span>

此时占位区显示的不是灰色块,而是一行带有往复扫光高亮的渐变文字,视觉语义更接近"内容在生成中"。注意:skeleton-text必须与skeleton一同使用,原因见下文源码剖析——扫光的位移动画与背景尺寸均由.skeleton提供,.skeleton-text只负责把渐变"剪"进文字笔画。

源码级剖析:扫光动画是怎么实现的

所有用法背后的样式都集中在 packages/daisyui/src/components/skeleton.css。把它拆开看,可以还原骨架屏的完整工作原理。

1..skeleton的静态外观

@apply bg-base-300 rounded-box motion-reduce:[transition-duration:15s]; will-change: background-position; background-image: linear-gradient( 105deg, #0000 0% 40%, var(--color-base-100) 50%, #0000 60% 100% ); background-size: 200% auto; background-position-x: -50%;
  • 底色bg-base-300:取自主题色阶中较暗的一档,圆角rounded-box对应主题圆角令牌--radius-box(圆角令牌的定义见 radius.css);
  • 扫光渐变:在 105 度方向上,从透明(#0000,占 0%–40%)过渡到高亮色var(--color-base-100)(位于 50%)再回到透明(60%–100%),形成一条"亮带";
  • background-size: 200% autobackground-position-x: -50%:把渐变的横向尺寸拉大两倍并将亮带推出可视区,为动画预留位移空间。

因为高亮色是--color-base-100(主题中最亮的背景色),而底色是--color-base-300,所以骨架在浅色与深色主题中会自动呈现"底暗、亮带略亮"的相对对比,无需任何额外适配。

2.@keyframes skeleton驱动扫光往复

@keyframes skeleton { 0% { background-position: 150%; } 100% { background-position: -50%; } }

动画从横向位置150%扫到-50%,配合.skeleton上的:

animation: skeleton 1.8s ease-in-out infinite;

实现每 1.8 秒一次的往复扫光。由于背景尺寸被拉长为 200%,亮带沿 105 度方向从右上方滑向左下方,产生类似"探照灯"的扫过效果,并通过will-change: background-position提前告知浏览器该属性会变化以优化合成层。

3. RTL 方向自动反转

&:dir(rtl) { animation-direction: reverse; }

在从右向左书写的语言环境中(如阿拉伯语、希伯来语页面),扫光方向会随文字阅读方向自动反向,避免观感上"逆着阅读方向扫动"带来的违和。

4. 尊重系统"减弱动态效果"设置

动画声明被包在媒体查询中,只有当用户系统未开启减弱动态效果时才会播放:

@media (prefers-reduced-motion: no-preference) { animation: skeleton 1.8s ease-in-out infinite; ... }

也就是说,对于开启了prefers-reduced-motion: reduce的用户,扫光动画会被整体关闭,页面只呈现静态的灰色占位,符合无障碍最佳实践。

5..skeleton-text:把渐变"剪"进文字

.skeleton-text { background-clip: text; -webkit-background-clip: text; color: transparent; background-image: linear-gradient( 105deg, color-mix(in oklab, var(--color-base-content) 20%, transparent) 0% 40%, var(--color-base-content) 50%, color-mix(in oklab, var(--color-base-content) 20%, transparent) 60% 100% ); }

它的原理是典型的"渐变文字扫光":

  1. background-clip: text(含-webkit-前缀)让背景只在文字笔画内可见;
  2. 把文字颜色设为color: transparent,使笔画本身透明、只露出背景;
  3. 背景渐变在"base-content的 20% 透明混合色 ↔ 完整base-content"之间往复,配合来自.skeleton的同名扫光动画,形成一条在文字上滑过的高亮带。

这里用到的color-mix(in oklab, ...)与 daisyUI 5 全链路 OKLCH 色彩体系一致,渐变端点由主题令牌--color-base-content派生,因此文字扫光在任意主题下都与正文颜色保持同源(各主题令牌的实际取值可对照 themes/light.css 或 themes/dark.css 中的--color-base-content)。

这也解释了为什么skeleton-text被定义为modifier(修饰类):它复用了.skeleton提供的动画、background-size等基础设施,自身只负责"换肤成文字渐变"。若单独使用.skeleton-text而不带.skeleton,将因为没有动画与背景尺寸定义而退化为一段静态渐变文字。

主题联动与定制

Skeleton 不写死任何颜色,全部颜色均引用主题令牌:

CSS 变量在骨架中的作用典型值(light 主题)
--color-base-300占位底色oklch(95% 0 0)
--color-base-100扫光高亮色oklch(100% 0 0)
--color-base-contentskeleton-text文字渐变端点oklch(21% 0.006 285.885)
--radius-box占位块默认圆角0.5rem

因此,切换 daisyUI 的 contenteditable="false">【免费下载链接】daisyui🌼 🌼 🌼 🌼 🌼 The most popular, free and open-source Tailwind CSS component library项目地址: https://gitcode.com/GitHub_Trending/da/daisyui

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 3:21:35

MoE大模型显存不够?Megatron下专家权重CPU Offload实战指南

最近在折腾大规模MoE模型时&#xff0c;我几乎被显存问题整崩溃。单卡80GB看着很大&#xff0c;可一旦模型里挂了64个专家&#xff0c;光专家模块的权重就能把显存吃掉大半。Megatron这套框架在模型并行上确实做得很极致&#xff0c;但面对MoE的海量专家权重&#xff0c;它默认…

作者头像 李华
网站建设 2026/9/10 3:21:33

昇腾/GE SetAttr算子属性设置

SetAttr 【免费下载链接】ge GE&#xff08;Graph Engine&#xff09;是面向昇腾的图编译器和执行器&#xff0c;提供了计算图优化、多流并行、内存复用和模型下沉等技术手段&#xff0c;加速模型执行效率&#xff0c;减少模型内存占用。 GE 提供对 PyTorch、TensorFlow 前端的…

作者头像 李华
网站建设 2026/9/10 3:18:31

Refine 中的 React 18 升级指南:新特性、API 迁移与工程实践

Refine 中的 React 18 升级指南&#xff1a;新特性、API 迁移与工程实践 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitHub_Trending/re…

作者头像 李华
网站建设 2026/9/10 3:17:24

STM32 RS485通信实战:从硬件电路到HAL库代码

简介&#xff1a;面向STM32F103平台的RS485通信参考工程&#xff0c;适合嵌入式开发入门者、工业自动化及远程监控项目技术人员&#xff0c;重点解决长距离多节点串行通信中的UART配置、485驱动器控制与收发切换问题。压缩包含122个文件&#xff0c;以C源码、H头文件和启动汇编…

作者头像 李华
网站建设 2026/9/10 3:17:19

TMS320VC5509A上McBSP与DMA协同驱动实战指南

简介&#xff1a;本资源是面向嵌入式DSP开发者的TMS320VC5509A芯片DMA实战工程&#xff0c;聚焦McBSP外设与DMA协同工作的底层驱动实现&#xff0c;适用于通信、音频实时处理等对数据吞吐与时序敏感的应用场景&#xff0c;适合具备C语言基础和TI C55x架构初步认知的中级开发者学…

作者头像 李华
网站建设 2026/9/10 3:15:50

Verification Report

Verification Report 【免费下载链接】oh-my-claudecode Teams-first Multi-agent orchestration for Claude Code 项目地址: https://gitcode.com/GitHub_Trending/oh/oh-my-claudecode Verdict Status: PASS | FAIL | INCOMPLETE Confidence: high | medium | low Bl…

作者头像 李华