Skip to content
Knsept
Free playbook

Skeleton loader

Shimmering placeholders that hold the layout while content loads, so nothing jumps when it arrives.

CSSUI Widgets Updated Oct 23, 2026
Live demo Reduced motion is on, so effects are toned down
<div class="skeleton-demo">
  <article class="profile is-loading" aria-busy="true" aria-live="polite">
    <div class="avatar"></div>
    <div class="profile-text">
      <h3 class="line" data-text="Ada Lovelace"></h3>
      <p class="line" data-text="Wrote the first algorithm meant for a machine."></p>
      <p class="line short" data-text="London · 1843"></p>
    </div>
  </article>
  <button class="reload" type="button">Load again</button>
</div>

Skeletons work because they hold the layout. Each placeholder bar is the same element that will hold the text, with a minimum height of one line, so when the content arrives nothing shifts. That avoids the layout jump (and the Cumulative Layout Shift penalty) of a spinner being replaced by content.

The shimmer is one oversized gradient whose background-position slides across, which is cheap to animate. aria-busy="true" tells assistive tech the region is still loading, and switching it off lets the polite live region announce the content.

With reduced motion on, the shimmer slows to a gentle three-second sweep.

More from the library

Feedback live

Loading-state button

A submit button that shows a spinner while it works, then success or an error, without changing width.

Feedback live

Confetti burst

A celebration burst from a button, drawn on a canvas with simple physics. Under 60 lines, no library.

Feedback live

Progress ring

A circular progress indicator from one SVG circle and stroke-dasharray, with an accessible progressbar role.