反馈
Skeleton
页面到来之前,页面的形状。
什么时候用它
示例
record list
parts
说明
所有骨架部件的填充色都来自这里:--stone,没有别的。
刻意不做流光。流光会把一道高光扫过形状,那意味着有光源;白色重置没有光源,所以这一扫读起来像 bug 而不像加载中。取而代之的是整页一起呼吸——见 SkeletonPage,那一次脉动归它管。
属性
同时接受 HTMLAttributes<HTMLDivElement> 里的全部属性,它们会直接透传给底层元素,不再逐条列出。
组成部分
Composed at the call site rather than configured through props, so a layout this component did not anticipate is still expressible.
SkeletonLine
一行文字。高度是行高;宽度是它排到多远。
同时接受 HTMLAttributes<HTMLDivElement> 里的全部属性,它们会直接透传给底层元素,不再逐条列出。
SkeletonBlock
一个块:图片位、底板、图表。
同时接受 HTMLAttributes<HTMLDivElement> 里的全部属性,它们会直接透传给底层元素,不再逐条列出。
SkeletonCircle
一个圆:头像、标记点。
同时接受 HTMLAttributes<HTMLDivElement> 里的全部属性,它们会直接透传给底层元素,不再逐条列出。
SkeletonText
一段文字。
最后一行是短的,因为真实的文字会在半行处结束。一堆等宽的满行条读起来像表格,等真的来了一段文字,读者会愣一下。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| lines | number | 3 | 替几行文字站位。 |
同时接受 HTMLAttributes<HTMLDivElement> 里的全部属性,它们会直接透传给底层元素,不再逐条列出。
SkeletonPage
骨架所在的框架:live region,以及那唯一一次脉动。
animate-pulse 只在外层包一次,而不是每个部件一次,这样整页一起呼吸,而不是各自错拍地闪——二十根各自动画的条是一层视觉噪声底,不是加载状态。
一个形状和替换它的东西对不上的骨架,比没有骨架更糟:它承诺了一个布局,然后页面从读者脚下跳走了。请照着真实的东西去组合这些部件,并且两边一起改。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| children必填 | ReactNode | — | |
| label必填 | string | 正在加载什么,用文字说。只播报一次;形状本身是 `aria-hidden` 的,所以对读屏用户来说这句话就是全部体验,而光说一个“加载中”等于什么都没说。 |
同时接受 HTMLAttributes<HTMLDivElement> 里的全部属性,它们会直接透传给底层元素,不再逐条列出。
无障碍
- 一个 live region 在外层,里面每个形状都是 aria-hidden。
- 脉冲也只有外层一个,所以整页一起呼吸,而不是各闪各的。