3.4.0 • Published 3 months ago

react-loading-skeleton v3.4.0

Weekly downloads
116,368
License
MIT
Repository
github
Last release
3 months ago

Learn about the changes in version 3, or view the v2 documentation.

Basic Usage

Install via one of:

yarn add react-loading-skeleton
npm install react-loading-skeleton
import Skeleton from 'react-loading-skeleton'
import 'react-loading-skeleton/dist/skeleton.css'

<Skeleton /> // Simple, single-line loading skeleton
<Skeleton count={5} /> // Five-line loading skeleton

Principles

Adapts to the styles you have defined

The Skeleton component should be used directly in your components in place of content that is loading. While other libraries require you to meticulously craft a skeleton screen that matches the font size, line height, and margins of your content, the Skeleton component is automatically sized to the correct dimensions.

For example:

function BlogPost(props) {
  return (
    <div>
      <h1>{props.title || <Skeleton />}</h1>
      {props.body || <Skeleton count={10} />}
    </div>
  );
}

...will produce correctly-sized skeletons for the heading and body without any further configuration.

This ensures the loading state remains up-to-date with any changes to your layout or typography.

Don't make dedicated skeleton screens

Instead, make components with built-in skeleton states.

This approach is beneficial because:

  1. It keeps styles in sync.
  2. Components should represent all possible states — loading included.
  3. 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 both pieces of content show loading skeletons at the right time.

Theming

Customize individual skeletons with props, or render a SkeletonTheme to style all skeletons below it in the React hierarchy:

import Skeleton, { SkeletonTheme } from 'react-loading-skeleton';

return (
  <SkeletonTheme baseColor="#202020" highlightColor="#444">
    <p>
      <Skeleton count={3} />
    </p>
  </SkeletonTheme>
);

Props Reference

Skeleton only

Skeleton and SkeletonTheme

Examples

Custom Wrapper

There are two ways to wrap a skeleton in a container:

function Box({ children }: PropsWithChildren<unknown>) {
  return (
    <div
      style={{
        border: '1px solid #ccc',
        display: 'block',
        lineHeight: 2,
        padding: '1rem',
        marginBottom: '0.5rem',
        width: 100,
      }}
    >
      {children}
    </div>
  );
}

// Method 1: Use the wrapper prop
const wrapped1 = <Skeleton wrapper={Box} count={5} />;

// Method 2: Do it "the normal way"
const wrapped2 = (
  <Box>
    <Skeleton />
  </Box>
);

Troubleshooting

The skeleton width is 0 when the parent has display: flex!

In the example below, the width of the skeleton will be 0:

<div style={{ display: 'flex' }}>
  <Skeleton />
</div>

This happens because the skeleton has no intrinsic width. You can fix it by applying flex: 1 to the skeleton container via the containerClassName prop.

For example, if you are using Tailwind, your code would look like this:

<div style={{ display: 'flex' }}>
  <Skeleton containerClassName="flex-1" />
</div>

The height of my container is off by a few pixels!

In the example below, the height of the <div> will be slightly larger than 30 even though the react-loading-skeleton element is exactly 30px.

<div>
  <Skeleton height={30} />
</div>

This is a consequence of how line-height works in CSS. If you need the <div> to be exactly 30px tall, set its line-height to 1. See here for more details.

Contributing

Contributions are welcome! See CONTRIBUTING.md to get started.

Acknowledgements

Our logo is based off an image from Font Awesome. Thanks!

@wicadu/ui@preply/chat@grafana/ui@flyteorg/console@flyteoss/consolereact-ui-components-libpax-design-systemzenstateparcel-test-projectse-panelboard-schedulecom.sportlink.club.web@motive.io/core-uiclassroom-sharekhodroinja-ui-coreinnopix-atomic-uiquantic-uispfxspfx-testodge-lib-latestodge-test33odge-test00odge-lib@itsrennyman/formidable-ui@decooda_inc/media-carouselelelive-uicustomizable-react-uireis-integrationsmediastoresdk-test-libraryauto-components-idabyss-uiwhitebrickgatsby-theme-whitebrickpylot-frameworkwedia-storefront-uikderno-editorw-stories-app1@infinitebrahmanuniverse/nolb-react-locra-template-redux-tailwind-typescript@raphaelcamar/my-financial-storybookdemotestpublish@skala/reactka-loginka-productpageka-receiptladys-npm-baserect-components-007jawwygamification@everything-registry/sub-chunk-2565react-components-007bqcsui-componentsbqcsuie-componentsjawwy_gamificationjawwy_gamification_webordering-uiordering-ui-adminordering-ui-admin-externalordering-ui-externalotp-react-reduxpandora-modelnotion-to-reactnotealy-link-previewnouns-builder-componentsntb-alpine-event-resultperfarm-ui-kitplurall-waitoder-uinvest-sidebar-videoplayeronchain-sdkonchain-uiong-react-link-previewpxp-buyer-survey@devpaps/paps-ui@dhaiwat10/react-link-preview@dilicorp/ui@chargedeals/uikit@charge-deals/ui@cpchain-foundation/ui@cpchain-foundation/editorc10amityui@commonninja/nindo@commonninja/nindo-ui@cliqmind/rv-components@classmate_technolabs/serego-common@clutch-marketplace/react-loading-skeleton@citygross/components@city-dna/experience@cleeng/mediastore-sdk@connectwithravisharma/synopsvaluemeter@crystaldesign/diva-chat-react@creaditor/cdtr-blogcb-design-systemcarrent-ke-uikitchatnext-ui@datalayer/primer-addonschinhcdevui@ftw-js/fetch-paginatechatversevuchatwebiny-uizui-test-publish
3.4.0

3 months ago

3.3.1

12 months ago

3.3.0

12 months ago

3.2.1

1 year ago

3.2.0

1 year ago

3.1.1

1 year ago

3.1.0

2 years ago

3.0.3

2 years ago

3.0.2

2 years ago

3.0.1

3 years ago

3.0.0

3 years ago

2.2.0

3 years ago

2.1.1

4 years ago

2.1.0

4 years ago

2.0.1

4 years ago

2.0.0

4 years ago

1.3.0

4 years ago

1.2.0

5 years ago

1.1.2

5 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.0.0

5 years ago

0.6.1

6 years ago

0.6.0

6 years ago

0.5.0

6 years ago

0.4.0

6 years ago

0.3.2

6 years ago

0.3.1

7 years ago

0.3.0

7 years ago

0.2.0

7 years ago

0.1.0

7 years ago