Skip to content

Skeleton

Skeleton components provide loading placeholders with a subtle pulse animation. They match the shape of content being loaded, reducing perceived load time.


The fundamental skeleton with customizable dimensions.

<Skeleton width={80} height={80} borderRadius={8} />
<Skeleton width={120} height={40} borderRadius={20} />
<Skeleton width={40} height={40} borderRadius={40} />

Multi-line text placeholder with natural variation.

<SkeletonText lines={3} lastLineWidth="60%" />

For stat cards in dashboards.


For reading list items with hexagram visual.



PropTypeDefaultDescription
widthnumber | string'100%'Element width
heightnumber20Element height
borderRadiusnumber4Corner radius
styleViewStyle-Additional styles
PropTypeDefaultDescription
linesnumber3Number of lines
lineHeightnumber16Height per line
lastLineWidthstring'60%'Width of last line

The skeleton uses a subtle pulse animation:

const pulse = Animated.loop(
Animated.sequence([
Animated.timing(pulseAnim, {
toValue: 0.7,
duration: 800,
useNativeDriver: true,
}),
Animated.timing(pulseAnim, {
toValue: 0.4,
duration: 800,
useNativeDriver: true,
}),
])
);
PropertyValue
Duration800ms per phase (1.6s cycle)
Opacity Range0.4 - 0.7
DriverNative (60fps)

  • Match skeleton shapes to actual content
  • Use consistent skeleton heights for text
  • Show skeletons briefly (under 3 seconds ideally)
  • Combine with Suspense for data loading
  • Use skeletons for instant actions
  • Make skeletons too prominent
  • Animate skeleton position (only opacity)
  • Show skeletons for more than 10 seconds