React component that uses SVG to create a collection of loaders which simulates the structure of the content that will be loaded, similar to Facebook cards loaders.
- βοΈ Completely customizable: you can change the colors, speed and sizes;
- βοΈ Create your own loading: use the create-content-loader to create your own custom loadings easily;
- π You can use right now: there are a lot of presets to use it, see the examples;
- π Performance: it uses pure SVG to work, so it works without any extra scripts, canvas, etc;
Yarn: $ yarn add react-content-loader
Npm: $ npm i react-content-loader --save
CDN: from JSDELIVR
You can use it in two ways (See the options):
// import the component
import ContentLoader, { Facebook } from 'react-content-loader'
const MyLoader = () => <ContentLoader />
const MyFacebookLoader = () => <Facebook />Or in custom mode, using the online tool
const MyLoader = () => (
<ContentLoader>
{/* Pure SVG */}
<rect x="0" y="0" rx="5" ry="5" width="70" height="70" />
<rect x="80" y="17" rx="4" ry="4" width="300" height="13" />
<rect x="80" y="40" rx="3" ry="3" width="250" height="10" />
</ContentLoader>
)| Name | Type | Default | Description |
|---|---|---|---|
| animate | {Boolean} |
true |
false to render with no animation |
| speed | {Number} |
2 |
Animation speed in seconds |
| className | {String} |
'' |
Classname in the <svg/> |
| width | {Number} |
400 |
viewBox width of <svg/> |
| height | {Number} |
130 |
viewBox height of <svg/> |
| preserveAspectRatio | {String} |
xMidYMid meet |
Aspect ratio option of <svg/> |
| primaryColor | {String} |
#f3f3f3 |
Background |
| secondaryColor | {String} |
#ecebeb |
Animation color |
| primaryOpacity | {Number} |
1 |
Background opacity (0 = transparent, 1 = opaque) |
| secondaryOpacity | {Number} |
1 |
Animation opacity (0 = transparent, 1 = opaque) |
| style | {Object} |
null |
Ex: { width: '100%', height: '70px' } |
| uniquekey | {String} |
random unique id | Use the same value of prop key, that will solve inconsistency on the SSR. |
// import the component
import { Facebook } from 'react-content-loader'
const MyFacebookLoader = () => <Facebook />// import the component
import { Instagram } from 'react-content-loader'
const MyInstagramLoader = () => <Instagram />// import the component
import { Code } from 'react-content-loader'
const MyCodeLoader = () => <Code />// import the component
import { List } from 'react-content-loader'
const MyListLoader = () => <List />// import the component
import { BulletList } from 'react-content-loader'
const MyBulletListLoader = () => <BulletList />For the custom mode, use the online tool
const MyLoader = () => (
<ContentLoader height={140} speed={1} primaryColor={'#333'} secondaryColor={'#999'}>
{/* Pure SVG */}
<rect x="0" y="0" rx="5" ry="5" width="70" height="70" />
<rect x="80" y="17" rx="4" ry="4" width="300" height="13" />
<rect x="80" y="40" rx="3" ry="3" width="250" height="10" />
</ContentLoader>
)- React Native;
- Preact;
- Vue.js: vue-content-loading, vue-content-loader;
- Angular.
Fork the repo then clone it
$ git clone [email protected]:YourUsername/react-content-loader.git && cd react-content-loader
Install the dependencies
$ yarn
Run the storybook to see your changes
$ yarn storybook
-
Safari / iOS
When using
rgbaas aprimaryColororsecondaryColorvalue, Safari does not respect the alpha channel, meaning that the color will be opaque. To prevent this, instead of using anrgbavalue forprimaryColor/secondaryColor, use thergbequivalent and move the alpha channel value to theprimaryOpacity/secondaryOpacityprops.{/* Opaque color in Safari and iOS */} <ContentLoader primaryColor="rgba(0,0,0,0.06)" secondaryColor="rgba(0,0,0,0.12)"> {/* Semi-transparent color in Safari and iOS */} <ContentLoader primaryColor="rgb(0,0,0)" secondaryColor="rgb(0,0,0)" primaryOpacity={0.06} secondaryOpacity={0.12}>






