跳到正文
GitHub

反馈

Skeleton

页面到来之前,页面的形状。

什么时候用它

长到读者会以为页面坏了的等待。描述“接下来是什么”的形状,胜过什么都不描述的一个点。

示例

record list

Loading projects

parts

Loading the example

说明

所有骨架部件的填充色都来自这里:--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

一段文字。

最后一行是短的,因为真实的文字会在半行处结束。一堆等宽的满行条读起来像表格,等真的来了一段文字,读者会愣一下。

SkeletonText props
属性类型默认值说明
linesnumber3替几行文字站位。

同时接受 HTMLAttributes<HTMLDivElement> 里的全部属性,它们会直接透传给底层元素,不再逐条列出。

SkeletonPage

骨架所在的框架:live region,以及那唯一一次脉动。

animate-pulse 只在外层包一次,而不是每个部件一次,这样整页一起呼吸,而不是各自错拍地闪——二十根各自动画的条是一层视觉噪声底,不是加载状态。

一个形状和替换它的东西对不上的骨架,比没有骨架更糟:它承诺了一个布局,然后页面从读者脚下跳走了。请照着真实的东西去组合这些部件,并且两边一起改。

SkeletonPage props
属性类型默认值说明
children必填ReactNode
label必填string正在加载什么,用文字说。只播报一次;形状本身是 `aria-hidden` 的,所以对读屏用户来说这句话就是全部体验,而光说一个“加载中”等于什么都没说。

同时接受 HTMLAttributes<HTMLDivElement> 里的全部属性,它们会直接透传给底层元素,不再逐条列出。

无障碍

  • 一个 live region 在外层,里面每个形状都是 aria-hidden。
  • 脉冲也只有外层一个,所以整页一起呼吸,而不是各闪各的。