跳到主要内容

Skeleton 骨架屏

页面加载占位,呈现内容大致结构。区别于 Shimmer(聊天专属流式占位)——Skeleton 是页面级。

实时预览

下方渲染的就是 src/components/ui/Skeleton/* 本体(reanimated 4 worklet 驱动 opacity 脉冲),通过 react-native-web 翻译成浏览器节点。

列表项骨架
卡片骨架

视觉规范

来源:src/components/ui/Skeleton/Skeleton.tsxtypes.ts、共享 usePulse

元素规则
颜色c.surfaceContainerHigh(亮色 #F0F0F0
圆角line:3px / rect:8px / circle:size/2(均可用 radius 覆盖)
动画opacity 脉冲(共享 usePulse hook,传 from: 0.5),半周期 700ms、全周期 1.4s,0.5 ↔ 1 循环

形状

shape默认值用途
'line'width 100% / height 11 / radius 3文本占位
'rect'(默认)width 100% / height 80 / radius 8图片 / 卡片占位
'circle'size 40 / radius = size/2头像占位

API

来源:src/components/ui/Skeleton/types.tsSkeleton.tsx

Prop类型默认说明
shape'line' | 'rect' | 'circle''rect'形状,决定默认尺寸与圆角
widthDimensionValue?形状相关宽度(line / rect);circle 忽略,走 size
heightnumber?形状相关高度(line / rect);circle 忽略,走 size
sizenumber?40直径(circle);line / rect 忽略
radiusnumber?形状相关覆盖圆角(line 3 / rect 8 / circle size/2
styleStyleProp<ViewStyle>?额外样式覆盖
testIDstring?E2E / 测试定位

用法

import { Skeleton } from '@unif/react-native-design';

{/* 列表项骨架 */}
<View>
<Skeleton shape="circle" size={40} />
<View style={{ flex: 1, gap: 8 }}>
<Skeleton shape="line" width="60%" height={14} />
<Skeleton shape="line" width="80%" height={11} />
</View>
</View>

{/* 卡片骨架 */}
<Skeleton shape="rect" width="100%" height={120} radius={12} />

单一组件 + shape prop(MUI Skeleton 同款 variant 模式),旧的 Skeleton.Line / .Rect / .Circle 命名空间访问已移除。

无障碍(a11y)

来源:src/components/ui/Skeleton/Skeleton.tsxtypes.ts

加载占位骨架为纯视觉元素,无交互。源码在其 <Animated.View> 上显式设 accessibilityElementsHidden + importantForAccessibility="no-hide-descendants",对 SR 完全隐藏——占位块没有朗读价值,隐藏可避免在加载阶段读出无意义节点。无 accessibilityRole / accessibilityLabel,也无可传的 a11y prop(仅 shape / width / height / size / radius / style / testID)。加载完成后用真实内容整体替换骨架即可,真实内容自带其语义。

与 Shimmer 的区别

SkeletonShimmer (chat)
页面级,初次加载单个气泡里,AI 思考中
整体块状(卡片、行)几行不等宽 + 头像
加载完成后整体替换气泡内文字流式填充