react-loading-skeleton vs react-content-loader vs react-placeholder
Placeholder Libraries for React Comparison
1 Year
react-loading-skeletonreact-content-loaderreact-placeholderSimilar Packages:
What's Placeholder Libraries for React?

These libraries are designed to create placeholder components in React applications, enhancing user experience during data loading. They provide visual feedback to users, indicating that content is being fetched or processed, which can help reduce perceived loading times and improve overall application responsiveness. Each library offers unique features and customization options to suit different design needs and performance considerations.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
react-loading-skeleton809,2924,09726.7 kB75 months agoMIT
react-content-loader611,49013,854162 kB189 months agoMIT
react-placeholder34,7061,613-234 years agoISC
Feature Comparison: react-loading-skeleton vs react-content-loader vs react-placeholder

Customization

  • react-loading-skeleton:

    react-loading-skeleton offers limited customization options, focusing on basic skeleton shapes. You can adjust the width, height, and border radius, but it lacks the advanced customization features of react-content-loader, making it less flexible for complex layouts.

  • react-content-loader:

    react-content-loader allows extensive customization of the placeholder shapes and sizes using SVG. You can define the exact layout of your content, making it possible to create loaders that match your application's design and structure closely.

  • react-placeholder:

    react-placeholder provides a moderate level of customization, allowing you to define the shape and size of placeholders. It supports various types of placeholders, enabling you to create a mix of text and image loaders, but it may not offer the same level of detail as react-content-loader.

Ease of Use

  • react-loading-skeleton:

    react-loading-skeleton is very easy to use, with a straightforward API that allows developers to quickly implement skeleton screens with minimal configuration. This makes it an excellent choice for rapid development and prototyping.

  • react-content-loader:

    react-content-loader has a steeper learning curve due to its SVG-based approach, requiring some familiarity with SVG syntax to fully utilize its capabilities. However, once understood, it offers powerful features for creating visually appealing loaders.

  • react-placeholder:

    react-placeholder is also user-friendly, providing a simple API that allows for quick integration of various placeholder types. It strikes a balance between ease of use and flexibility, making it accessible for developers of all skill levels.

Performance

  • react-loading-skeleton:

    react-loading-skeleton is lightweight and designed for performance, ensuring minimal impact on loading times. Its simplicity allows for quick rendering, making it ideal for applications that prioritize speed.

  • react-content-loader:

    react-content-loader is optimized for performance, but the use of SVG can lead to increased rendering times if not managed properly. It is important to optimize SVG assets to ensure that they do not negatively impact application performance.

  • react-placeholder:

    react-placeholder performs well in most scenarios, but its performance can vary depending on the complexity of the placeholders used. It is generally efficient but may require optimization for more complex loading states.

Visual Appeal

  • react-loading-skeleton:

    react-loading-skeleton provides a clean and minimalistic design that fits well with modern UI trends. While it may not be as visually detailed as react-content-loader, its simplicity can be appealing in many contexts.

  • react-content-loader:

    react-content-loader excels in visual appeal, allowing developers to create realistic and engaging loaders that enhance the user experience. Its ability to closely mimic the final content layout makes it a favorite for applications where aesthetics matter.

  • react-placeholder:

    react-placeholder offers a variety of placeholder styles, making it versatile for different design needs. Its visual appeal is decent, but it may not match the level of customization available in react-content-loader.

Community and Support

  • react-loading-skeleton:

    react-loading-skeleton is widely used and has a supportive community, though it may not have as extensive documentation as react-content-loader. However, its simplicity often reduces the need for extensive support.

  • react-content-loader:

    react-content-loader has a strong community and good documentation, making it easier for developers to find resources and support when needed. Its popularity ensures ongoing maintenance and updates.

  • react-placeholder:

    react-placeholder has a smaller community compared to the others, but it is still actively maintained. Documentation is adequate, providing enough guidance for developers to implement the library effectively.

How to Choose: react-loading-skeleton vs react-content-loader vs react-placeholder
  • react-loading-skeleton:

    Opt for react-loading-skeleton if you prefer a simple and lightweight solution for creating skeleton screens. This package is easy to implement and offers a minimalistic approach to loading indicators, making it suitable for applications where speed and simplicity are key.

  • react-content-loader:

    Choose react-content-loader if you need highly customizable SVG-based placeholders that can mimic the actual layout of your content. This package is ideal for projects where visual fidelity is important, allowing you to create loaders that closely resemble the final content structure.

  • react-placeholder:

    Select react-placeholder if you want a versatile library that supports multiple types of placeholders, including text and image placeholders. This package is great for applications that require a mix of loading indicators and offers a straightforward API for quick integration.

README for react-loading-skeleton
Logo

React Loading Skeleton

Make beautiful, animated loading skeletons that automatically adapt to your app.

Open on CodeSandbox

Gif of the skeleton in action

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

PropDescriptionDefault
count?: number The number of lines of skeletons to render. If count is a decimal number like 3.5, three full skeletons and one half-width skeleton will be rendered. 1
wrapper?: React.FunctionComponent
<PropsWithChildren<unknown>>
A custom wrapper component that goes around the individual skeleton elements.
circle?: boolean Makes the skeleton circular by setting border-radius to 50%. 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 a data-testid attribute. Use it with screen.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.

Skeleton and SkeletonTheme

PropDescriptionDefault
baseColor?: stringThe background color of the skeleton.#ebebeb
highlightColor?: stringThe highlight color in the skeleton animation.#f5f5f5
width?: string | numberThe width of the skeleton.100%
height?: string | numberThe height of each skeleton line.The font size
borderRadius?: string | numberThe 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. When inline is true, no line breaks are inserted. false
duration?: numberThe 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 is false. You could use this prop to stop the animation if an error occurs. true
customHighlightBackground?: string Allows you to override the background-image property of the highlight element, enabling you to fully customize the gradient. See example below. undefined

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>
);

Custom Highlight Background

You may want to make the gradient used in the highlight element narrower or wider. To do this, you can set the customHighlightBackground prop. Here's an example of a narrow highlight:

<Skeleton customHighlightBackground="linear-gradient(90deg, var(--base-color) 40%, var(--highlight-color) 50%, var(--base-color) 60%)" />

If you use this prop, the baseColor and highlightColor props are ignored, but you can still reference their corresponding CSS variables as shown in the above example.

Custom highlight background example

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!