定价

Skeleton 使用手册

v1.4.0 · @snowui-design-system/components

许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。

组件介绍

在内容加载时展示占位轮廓,帮助用户预先理解页面结构,并保持加载过程中的布局连续。

使用选择

用于内容加载占位。已有组件支持 loading / skeleton 时先声明状态,让组件提供正确形状,不在页面重画它的骨架。

  • loading=false 渲染真实 children;加载时按 variant / width / height 或 renderHints 显示占位。

  • 优先让已有组件通过 loading 提供形状;独立骨架的尺寸和圆角仍使用设计系统 Token。

快速开始

以下示例展示推荐的基本组合。更多场景与组合限制见后文。

<script lang="ts">	import { Skeleton, Frame } from '@snowui-design-system/components';</script> <Frame row enableAutoLayout={false} style="width: min(100%, 20rem); display: flex; align-items: center; gap: var(--gap-3);">	<Skeleton variant="circle" width={48} height={48} />	<Frame column enableAutoLayout={false} style="flex: 1; min-width: 0; gap: var(--gap-2);"><Skeleton variant="line" width="42%" height={14} /><Skeleton variant="line" width="92%" height={12} /><Skeleton variant="line" width="68%" height={12} /></Frame>	<Skeleton variant="rect" width={72} height={32} /></Frame>

API

关键字 类型 默认值 描述
variant SkeletonVariant — 显式指定骨架形状;别名会归一化到 line / circle / rect
width string | number — 显式宽度;数字会自动转成 rem
height string | number — 显式高度;数字会自动转成 rem
componentClass string — 旧调用方兼容入口;仅在没有 renderHints 时匹配历史默认布局,新组件不得以此登记
renderHints FrameRenderHints — 组件自注册协议,支持 variant / width / height / radius / rows
loading boolean true 是否显示骨架;为 false 时回退渲染 children
responsive ResponsiveConfig — 响应式宽高覆写
class string "" 外部类名;多项骨架时挂到布局容器,单项骨架时挂到骨架块本身
style string "" 行内样式;多项骨架时挂到布局容器,单项骨架时挂到骨架块本身
children Snippet — 未显示骨架时渲染的真实子内容,无参数;骨架激活期间按组件骨架布局渲染。

未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。

使用边界与详细说明

布局模型

主布局模型:内禀原子布局。

  • Skeleton 作为占位原语时,尺寸优先由组件自注册的 renderHints 决定;显式 variant / width / height 可覆盖 hints,旧 componentClass 映射只作兼容。作为外部布局子项时表现为 Hug 或按调用方传入的固定尺寸渲染。

  • 多条 text skeleton、avatar-group skeleton overlap 等只是 Skeleton 私有渲染布局,用于模拟目标组件占位,不向外提供通用区域协议。

  • Skeleton 不输出 data-auto-layout;Frame 的 loading 协议负责决定是否渲染 Skeleton,Skeleton 本身不接管宿主布局。

适用范围

  • 直接在 test / demo 中显式渲染骨架,用于观察默认样式。

  • 被 Frame 在 loading + skeleton 协议中内部调用,作为默认占位渲染器。

  • 配合组件侧的 renderHints 接收最终的骨架尺寸与行数提示。

2.2 renderHints 规则

字段 类型 描述
variant "line" | "circle" | "rect" 覆盖默认骨架形状
width string | number 覆盖默认宽度
height string | number 覆盖默认高度
radius string | number 覆盖骨架圆角;数字按 16px 名义基准转为 rem
rows number 大于 1 时展开为多条 line,最后一行宽度为容器的 30%

未传 radius 时,非圆形 Skeleton 使用 var(--radius-3, 0.75rem);circle 始终使用 50%。旧 Icon class 映射仍保留 rect + 50% 的兼容外观。

解析顺序

Skeleton 的布局解析顺序固定如下:

  1. 存在 renderHints 时视为组件已自注册,直接以 hints 创建布局;显式 variant / width / height 逐字段优先。

  2. 没有 hints 但传了显式 variant / width / height 时,按显式单项骨架渲染。

  3. 仅旧调用方没有 hints / 显式几何时,才根据 componentClass 读取历史默认布局。

  4. 完全未命中时回退为通用 rect 骨架。

4.1 通用样式

规则 值
背景色 var(--black-10, #0000001a)
动画 snowui-skeleton-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite
交互 pointer-events: none; user-select: none;
显示 display: block

4.2 布局容器样式

规则 值
布局模式 display: flex
默认对齐 align-items: center
默认间距 var(--gap-2)
字号变量 --snowui-skeleton-font-size: var(--text-14)
行高变量 --snowui-skeleton-line-height: var(--leading-14)

补充规则:

  • .snowui-skeleton-layout-single 会切回 display: block。

  • .snowui-skeleton-layout-text 会改为纵向布局:width: 100%; flex-direction: column; align-items: stretch;

  • .snowui-skeleton-layout-avatar-group 保持 gap: 0。

4.3 形状默认值

形状 默认宽度 默认高度 默认圆角
line 6rem 1.25rem var(--radius-3, 0.75rem)
circle 2.5rem 2.5rem 50%
rect 6rem 3rem var(--radius-3, 0.75rem)

补充规则:

  • line 和 rect 默认圆角统一为 12px。

  • circle 永远保持 border-radius: 50%。

  • line / circle / rect 都有 max-width: 100%; max-height: 100%; 兜底。

文本骨架规则

任何已注册组件都可以用 renderHints.rows 展开成多条文字骨架;Text 会根据内容自动计算行数。

6.1 行数来源

  • Text 自身在骨架态下会统计第一层块级文本段落节点数量。

  • 当前统计的标签集合是:

    • div

    • p

    • li

    • blockquote

    • h1-h6

  • 第一层存在纯文本内容时,会额外记作 1 条。

  • 最终最少渲染 1 条。

6.2 多条文字骨架布局

规则 值
布局方向 上下排列
容器宽度 renderHints.width / 第一行宽度;未提供时 100%
前置行宽度 100%
最后一行宽度 30%
单行高度 1.25rem

第一层渲染规则

Skeleton 本身不负责递归拆解整棵组件树,当前规则固定为“只看第一层”。

  • 当组件自身进入 loading + skeleton 时,优先渲染当前组件自己的 Skeleton。

  • 不继续展开组件内部的 Icon / Text / Avatar 等子组件。

  • 当 Frame 进入 loading + skeleton 时:

    • 若第一层存在已自注册的直接子组件,则只渲染这些第一层组件对应的 Skeleton。

    • 若第一层不存在组件,则 Frame 自身回退为文字形态 Skeleton。

尺寸规则

  • 数字型 width / height 会统一转成 rem。

  • Skeleton 优先使用组件通过 renderHints.width / height / radius / rows 提供的最终几何。

  • 这意味着圆角矩形 Skeleton 在组件已经提供尺寸提示时,会跟随组件的最终宽高,而不是回退成通用短宽。

  • 当前没有启用“读取真实 DOM 实测尺寸”的通用机制。

使用示例

 <div class="flex flex-col gap-8">    <Skeleton variant="text" width="12rem" />    <Skeleton variant="circular" width={40} height={40} />    <Skeleton variant="rectangular" width="16rem" height="6rem" /></div>  <Frame loading={pageLoading}>    <Button>提交</Button>    <Text>加载中的文本</Text></Frame>  <Frame loading skeleton>    <Button variant="filled">        <Icon />        <Text>Search</Text>    </Button></Frame>  <Text loading skeleton class="w-full">    <div>段落一</div>    <div>段落二</div>    <div>段落三</div></Text>  <Frame    loading={pageLoading}    skeleton={false}    whileLoad={{ opacity: 0.6, scale: 0.98 }}>    <Button>提交</Button></Frame>

Skeleton 样式覆盖

先阅读 完整 LICENSE;同任务、同版本、同范围去重。

优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。

变量 用途与默认参考
--snowui-skeleton-background-override 背景(默认值见组件源码)
--snowui-skeleton-font-size-override font-size(默认值见组件源码)
--snowui-skeleton-gap-override layout 容器 gap(默认 var(--gap-2) = 8px)
--snowui-skeleton-height-override 高度(默认值见组件源码)
--snowui-skeleton-line-height-override line-height(默认值见组件源码)
--snowui-skeleton-line-radius-override line 圆角(默认 var(--radius-3) = 12px)
--snowui-skeleton-radius-override border-radius(默认值见组件源码)
--snowui-skeleton-rect-radius-override rect 圆角(默认 var(--radius-3) = 12px)
--snowui-skeleton-width-override 宽度(默认值见组件源码)

设计指南 · Token · 组合边界

Skeleton 类型与状态

必填属性:无具名必填属性。

可双向绑定:本组件未声明具名双向绑定属性;状态更新通过公开回调或所属宿主处理。

继承声明:无接口继承。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。

共享 Frame API · 返回 API

以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。

SkeletonVariant

来源:components/src/components/Skeleton.svelte

export type SkeletonVariant =        | "line"        | "circle"        | "rect"        | "text"        | "circular"        | "rectangular";

RenderHints

来源:components/src/logic/frame-types.ts

export interface RenderHints {    variant?: SkeletonRenderVariant;    width?: string | number;    height?: string | number;    radius?: string | number;    rows?: number;}

SkeletonRenderVariant

来源:components/src/logic/frame-types.ts

export type SkeletonRenderVariant = "line" | "circle" | "rect";

ResponsiveConfig

来源:components/src/logic/responsive.svelte.ts

export type ResponsiveConfig = Partial<Record<Breakpoint, ResponsiveRule>>;

Breakpoint

来源:components/src/logic/responsive.svelte.ts

export type Breakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';

ResponsiveRule

来源:components/src/logic/responsive.svelte.ts

export interface ResponsiveRule {    collapsed?: boolean;    expanded?: boolean;    style?: string;    class?: string;    props?: Record<string, any>;}