A skeleton is a type of loading state that allows you to expose content incrementally. For content that may take a long time to load, use a progress bar in place of a skeleton.


A skeleton is a type of loading state that allows you to expose content incrementally, once the structure of the page has been loaded in. A skeleton should match the exact structure of the element you’re loading in and can be used in components on top of the page, such as in a drop down menu, or a card. Skeleton loading should be progressive –– it should load static text first, followed by variable elements of the UI.

When to use a skeleton vs. a loading spinner

Use a skeleton when:

  • The structure of a page has loaded in but the content has not.
  • Some content of a page has loaded, but not all. For example, in a dashboard, you may have some loaded cards, while others are still loading.
  • You want to show loading content inside of a card, table, data list or more.

Show a skeleton when:

  • You know what the populated data is going to look like (even if it results in an empty state).

Do not show a skeleton when:

  • You don’t know what the structure of the component is going to look like.

Show a spinner when:

  • You have multiple elements on the page that are loading at different speeds, use a spinner once the structure of at least one element is loaded on the page.
  • You are attempting to load in a component that sits on top of a page with an expected structure.
  • It is likely it will fail or show an empty state while waiting for actions to complete.


For information regarding accessibility, visit the skeleton accessibility tab.

View source on GitHub