react-loading-skeleton
3.5.0 • Public • PublishedLearn about thechanges in version3, or viewthev2documentation.
Install via one of:
yarn add react-loading-skeletonnpm install react-loading-skeleton
importSkeletonfrom'react-loading-skeleton'import'react-loading-skeleton/dist/skeleton.css'<Skeleton/>// Simple, single-line loading skeleton<Skeletoncount={5}/>// Five-line loading skeleton
TheSkeleton
component should be used directly in your components in place ofcontent that is loading. While other libraries require you to meticulously crafta skeleton screen that matches the font size, line height, and margins of yourcontent, theSkeleton
component is automatically sized to the correctdimensions.
For example:
functionBlogPost(props){return(<div><h1>{props.title||<Skeleton/>}</h1>{props.body||<Skeletoncount={10}/>}</div>);}
...will produce correctly-sized skeletons for the heading and body without anyfurther configuration.
This ensures the loading state remains up-to-date with any changesto your layout or typography.
Instead, make components withbuilt-in skeleton states.
This approach is beneficial because:
- It keeps styles in sync.
- Components should represent all possible states — loading included.
- It allows for more flexible loading patterns. In the blog post example above,it's possible to have the title load before the body, while having bothpieces of content show loading skeletons at the right time.
Customize individual skeletons with props, or render aSkeletonTheme
to styleall skeletons below it in the React hierarchy:
importSkeleton,{SkeletonTheme}from'react-loading-skeleton';return(<SkeletonThemebaseColor="#202020"highlightColor="#444"><p><Skeletoncount={3}/></p></SkeletonTheme>);
Prop | Description | Default |
---|---|---|
count?: number | The number of lines of skeletons to render. Ifcount is a decimal number like 3.5, three full skeletons and one half-width skeleton will be rendered. | 1 |
wrapper?: React.FunctionComponent | A custom wrapper component that goes around the individual skeleton elements. | |
circle?: boolean | Makes the skeleton circular by settingborder-radius to50% . | false |
className?: string | A custom class name for the individual skeleton elements which is used alongside the default class,react-loading-skeleton . | |
containerClassName?: string | A custom class name for the<span> that wraps the individual skeleton elements. | |
containerTestId?: string | A string that is added to the container element as adata-testid attribute. Use it withscreen.getByTestId('...') from React Testing Library. | |
style?: React.CSSProperties | This is an escape hatch for advanced use cases and is not the preferred way to style the skeleton. Props (e.g.width ,borderRadius ) take priority over this style object. |
Prop | Description | Default |
---|---|---|
baseColor?: string | The background color of the skeleton. | #ebebeb |
highlightColor?: string | The highlight color in the skeleton animation. | #f5f5f5 |
width?: string | number | The width of the skeleton. | 100% |
height?: string | number | The height of each skeleton line. | The font size |
borderRadius?: string | number | The border radius of the skeleton. | 0.25rem |
inline?: boolean | By default, a<br /> is inserted after each skeleton so that each skeleton gets its own line. Wheninline is true, no line breaks are inserted. | false |
duration?: number | The length of the animation in seconds. | 1.5 |
direction?: 'ltr' | 'rtl' | The direction of the animation, either left-to-right or right-to-left. | 'ltr' |
enableAnimation?: boolean | Whether the animation should play. The skeleton will be a solid color when this isfalse . You could use this prop to stop the animation if an error occurs. | true |
customHighlightBackground?: string | Allows you to override thebackground-image property of the highlight element, enabling you to fully customize the gradient. See example below. | undefined |
There are two ways to wrap a skeleton in a container:
functionBox({ children}:PropsWithChildren<unknown>){return(<divstyle={{border:'1px solid #ccc',display:'block',lineHeight:2,padding:'1rem',marginBottom:'0.5rem',width:100,}}>{children}</div>);}// Method 1: Use the wrapper propconstwrapped1=<Skeletonwrapper={Box}count={5}/>;// Method 2: Do it "the normal way"constwrapped2=(<Box><Skeleton/></Box>);
You may want to make the gradient used in the highlight element narrower or wider. To do this, you can set thecustomHighlightBackground
prop. Here's an example of a narrow highlight:
<SkeletoncustomHighlightBackground="linear-gradient(90deg, var(--base-color) 40%, var(--highlight-color) 50%, var(--base-color) 60%)"/>
If you use this prop, thebaseColor
andhighlightColor
props are ignored, but you can still reference their corresponding CSS variables as shown in the above example.
In the example below, the width of the skeleton will be 0:
<divstyle={{display:'flex'}}><Skeleton/></div>
This happens because the skeleton has no intrinsic width. You can fix it byapplyingflex: 1
to the skeleton container via thecontainerClassName
prop.
For example, if you are using Tailwind, your code would look like this:
<divstyle={{display:'flex'}}><SkeletoncontainerClassName="flex-1"/></div>
In the example below, the height of the<div>
will be slightly larger than 30even though thereact-loading-skeleton
element is exactly 30px.
<div><Skeletonheight={30}/></div>
This is a consequence of howline-height
works in CSS. If you need the<div>
to be exactly 30px tall, set itsline-height
to 1.Seeherefor more details.
Contributions are welcome! SeeCONTRIBUTING.md
to get started.
Our logo is based off an image fromFontAwesome. Thanks!
Package Sidebar
Install
npm i react-loading-skeleton
Repository
Weekly Downloads
849,836
Version
3.5.0
License
MIT
Unpacked Size
26.7 kB
Total Files
11