$ cat docs/skeleton-loaders.md
updated Recently · 18 min read · published
Skeleton Loaders ◆ CSS◆ HTML◆ Tailwind◆ Bootstrap◆ UI◆ Intermediate🎯 Free Tools Introduction
Skeleton loaders are empty placeholders that mirror the final layout while content loads. This guide covers production-ready skeleton patterns in plain HTML/CSS, Tailwind CSS, and Bootstrap — including text, avatars, cards, tables, media, forms, stats, and accessibility.
ℹ info
Match the skeleton shape to the real content as closely as possible. When the layout does not change after data arrives, the transition feels instant rather than jarring.
Text Skeleton
Paragraph-shaped skeleton lines with varying widths to mimic natural text wrapping.
text-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="wrap"> 2 <div class="sk-line w100"> 3 </div> 4 <div class="sk-line w95"> 5 </div> 6 <div class="sk-line w80"> 7 </div> 8 <div class="sk-line w60"> 9 </div> 10 </div>
Copy 1 .wrap { 2 max-width:400px; 3 margin:20px auto; 4 display:flex; 5 flex-direction:column; 6 gap:10px; 7 padding:24px 8 } 9 .sk-line { 10 height:12px; 11 border-radius:6px; 12 background:linear-gradient(90deg, 13 #1A1A2E 25%, 14 #2A2A3E 50%, 15 #1A1A2E 75%); 16 background-size:200% 100%; 17 animation:shimmer 1.5s ease-in-out infinite 18 } 19 .w100 { 20 width:100% 21 } 22 .w95 { 23 width:95% 24 } 25 .w80 { 26 width:80% 27 } 28 .w60 { 29 width:60% 30 } 31 @keyframes shimmer { 32 0% { 33 background-position:200% 0 34 } 35 100% { 36 background-position:-200% 0 37 } 38 }
Copy 1 <style> 2 .shimmer{background:linear-gradient(90deg,#1A1A2E 25%,#2A2A3E 50%,#1A1A2E 75%);background-size:200% 100%;animation:shimmer 1.5s ease-in-out infinite}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 3 </style> 4 <div class="max-w-md mx-auto flex flex-col gap-2.5 p-6 bg-[#0A0A0A]"> 5 <div class="shimmer h-3 rounded-md w-full"> 6 </div> 7 <div class="shimmer h-3 rounded-md" style="width:95%"> 8 </div> 9 <div class="shimmer h-3 rounded-md" style="width:80%"> 10 </div> 11 <div class="shimmer h-3 rounded-md" style="width:60%"> 12 </div> 13 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important;animation:placeholder-glow 2s ease-in-out infinite!important} 3 </style> 4 <div class="container p-4 d-flex flex-column gap-2" style="max-width:400px;background:#0A0A0A"> 5 <div class="placeholder-glow"> 6 <span class="placeholder rounded d-block" style="height:12px"> 7 </span> 8 </div> 9 <div class="placeholder-glow"> 10 <span class="placeholder rounded d-block" style="width:95%;height:12px"> 11 </span> 12 </div> 13 <div class="placeholder-glow"> 14 <span class="placeholder rounded d-block" style="width:80%;height:12px"> 15 </span> 16 </div> 17 <div class="placeholder-glow"> 18 <span class="placeholder rounded d-block" style="width:60%;height:12px"> 19 </span> 20 </div> 21 </div>
preview
ℹ info
Make the last line shorter than the others (60-70% width) to mimic natural text wrapping. This small detail makes the skeleton feel much more realistic than uniform-width lines.
Avatar + Text
Skeleton for a user row with circular avatar placeholder and text lines — common in feeds and lists.
avatar-text-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="list"> 2 <div class="row"> 3 <div class="sk-circle"> 4 </div> 5 <div class="lines"> 6 <div class="sk-line w40"> 7 </div> 8 <div class="sk-line w70"> 9 </div> 10 </div> 11 </div> 12 <div class="row"> 13 <div class="sk-circle"> 14 </div> 15 <div class="lines"> 16 <div class="sk-line w35"> 17 </div> 18 <div class="sk-line w60"> 19 </div> 20 </div> 21 </div> 22 <div class="row"> 23 <div class="sk-circle"> 24 </div> 25 <div class="lines"> 26 <div class="sk-line w50"> 27 </div> 28 <div class="sk-line w80"> 29 </div> 30 </div> 31 </div> 32 <div class="row"> 33 <div class="sk-circle"> 34 </div> 35 <div class="lines"> 36 <div class="sk-line w30"> 37 </div> 38 <div class="sk-line w55"> 39 </div> 40 </div> 41 </div> 42 </div>
Copy 1 .list { 2 max-width:400px; 3 margin:16px auto; 4 padding:0 16px 5 } 6 .row { 7 display:flex; 8 align-items:center; 9 gap:12px; 10 padding:12px 0; 11 border-bottom:1px solid #1A1A2E 12 } 13 .sk-circle { 14 width:40px; 15 height:40px; 16 border-radius:50%; 17 flex-shrink:0; 18 background:linear-gradient(90deg, 19 #1A1A2E 25%, 20 #2A2A3E 50%, 21 #1A1A2E 75%); 22 background-size:200% 100%; 23 animation:shimmer 1.5s ease-in-out infinite 24 } 25 .lines { 26 display:flex; 27 flex-direction:column; 28 gap:8px; 29 flex:1 30 } 31 .sk-line { 32 height:10px; 33 border-radius:5px; 34 background:linear-gradient(90deg, 35 #1A1A2E 25%, 36 #2A2A3E 50%, 37 #1A1A2E 75%); 38 background-size:200% 100%; 39 animation:shimmer 1.5s ease-in-out infinite 40 } 41 .w30 { 42 width:30% 43 } 44 .w35 { 45 width:35% 46 } 47 .w40 { 48 width:40% 49 } 50 .w50 { 51 width:50% 52 } 53 .w55 { 54 width:55% 55 } 56 .w60 { 57 width:60% 58 } 59 .w70 { 60 width:70% 61 } 62 .w80 { 63 width:80% 64 } 65 @keyframes shimmer { 66 0% { 67 background-position:200% 0 68 } 69 100% { 70 background-position:-200% 0 71 } 72 }
Copy 1 <style> 2 .shimmer{background:linear-gradient(90deg,#1A1A2E 25%,#2A2A3E 50%,#1A1A2E 75%);background-size:200% 100%;animation:shimmer 1.5s ease-in-out infinite}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 3 </style> 4 <div class="max-w-md mx-auto px-4 bg-[#0A0A0A]"> 5 <div class="flex items-center gap-3 py-3 border-b border-[#1A1A2E]"> 6 <div class="shimmer w-10 h-10 rounded-full flex-shrink-0"> 7 </div> 8 <div class="flex flex-col gap-2 flex-1"> 9 <div class="shimmer h-2.5 rounded w-2/5"> 10 </div> 11 <div class="shimmer h-2.5 rounded w-3/5"> 12 </div> 13 </div> 14 </div> 15 <div class="flex items-center gap-3 py-3 border-b border-[#1A1A2E]"> 16 <div class="shimmer w-10 h-10 rounded-full flex-shrink-0"> 17 </div> 18 <div class="flex flex-col gap-2 flex-1"> 19 <div class="shimmer h-2.5 rounded w-[35%]"> 20 </div> 21 <div class="shimmer h-2.5 rounded w-3/5"> 22 </div> 23 </div> 24 </div> 25 <div class="flex items-center gap-3 py-3 border-b border-[#1A1A2E]"> 26 <div class="shimmer w-10 h-10 rounded-full flex-shrink-0"> 27 </div> 28 <div class="flex flex-col gap-2 flex-1"> 29 <div class="shimmer h-2.5 rounded w-1/2"> 30 </div> 31 <div class="shimmer h-2.5 rounded w-4/5"> 32 </div> 33 </div> 34 </div> 35 <div class="flex items-center gap-3 py-3 border-b border-[#1A1A2E]"> 36 <div class="shimmer w-10 h-10 rounded-full flex-shrink-0"> 37 </div> 38 <div class="flex flex-col gap-2 flex-1"> 39 <div class="shimmer h-2.5 rounded w-[30%]"> 40 </div> 41 <div class="shimmer h-2.5 rounded w-[55%]"> 42 </div> 43 </div> 44 </div> 45 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important;animation:placeholder-glow 2s ease-in-out infinite!important} 3 </style> 4 <div class="container px-3 bg-dark" style="max-width:400px"> 5 <div class="d-flex align-items-center gap-3 py-3 border-bottom border-secondary"> 6 <div class="placeholder-glow"> 7 <span class="placeholder rounded-circle flex-shrink-0" style="width:40px;height:40px"> 8 </span> 9 </div> 10 <div class="d-flex flex-column gap-2 flex-fill"> 11 <span class="placeholder rounded d-block" style="width:40%;height:10px"> 12 </span> 13 <span class="placeholder rounded d-block" style="width:70%;height:10px"> 14 </span> 15 </div> 16 </div> 17 <div class="d-flex align-items-center gap-3 py-3 border-bottom border-secondary"> 18 <div class="placeholder-glow"> 19 <span class="placeholder rounded-circle flex-shrink-0" style="width:40px;height:40px"> 20 </span> 21 </div> 22 <div class="d-flex flex-column gap-2 flex-fill"> 23 <span class="placeholder rounded d-block" style="width:35%;height:10px"> 24 </span> 25 <span class="placeholder rounded d-block" style="width:60%;height:10px"> 26 </span> 27 </div> 28 </div> 29 <div class="d-flex align-items-center gap-3 py-3 border-bottom border-secondary"> 30 <div class="placeholder-glow"> 31 <span class="placeholder rounded-circle flex-shrink-0" style="width:40px;height:40px"> 32 </span> 33 </div> 34 <div class="d-flex flex-column gap-2 flex-fill"> 35 <span class="placeholder rounded d-block" style="width:50%;height:10px"> 36 </span> 37 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 38 </span> 39 </div> 40 </div> 41 <div class="d-flex align-items-center gap-3 py-3 border-bottom border-secondary"> 42 <div class="placeholder-glow"> 43 <span class="placeholder rounded-circle flex-shrink-0" style="width:40px;height:40px"> 44 </span> 45 </div> 46 <div class="d-flex flex-column gap-2 flex-fill"> 47 <span class="placeholder rounded d-block" style="width:30%;height:10px"> 48 </span> 49 <span class="placeholder rounded d-block" style="width:55%;height:10px"> 50 </span> 51 </div> 52 </div> 53 </div>
preview
Card Skeleton
Skeleton placeholder for a content card with image area, title, text lines, and action buttons.
card-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="card-sk"> 2 <div class="sk-img"> 3 </div> 4 <div class="card-body"> 5 <div class="sk-line w60 title"> 6 </div> 7 <div class="sk-line w100"> 8 </div> 9 <div class="sk-line w90"> 10 </div> 11 <div class="sk-line w75"> 12 </div> 13 <div class="actions"> 14 <div class="sk-btn"> 15 </div> 16 <div class="sk-btn"> 17 </div> 18 </div> 19 </div> 20 </div>
Copy 1 .card-sk { 2 max-width:340px; 3 margin:16px auto; 4 border-radius:12px; 5 overflow:hidden; 6 border:1px solid #1A1A2E; 7 background:#0A0A0F 8 } 9 .sk-img { 10 width:100%; 11 height:140px; 12 background:linear-gradient(90deg, 13 #1A1A2E 25%, 14 #252538 50%, 15 #1A1A2E 75%); 16 background-size:200% 100%; 17 animation:shimmer 1.5s ease-in-out infinite 18 } 19 .card-body { 20 padding:16px; 21 display:flex; 22 flex-direction:column; 23 gap:10px 24 } 25 .sk-line { 26 height:10px; 27 border-radius:5px; 28 background:linear-gradient(90deg, 29 #1A1A2E 25%, 30 #2A2A3E 50%, 31 #1A1A2E 75%); 32 background-size:200% 100%; 33 animation:shimmer 1.5s ease-in-out infinite 34 } 35 .sk-line.title { 36 height:14px; 37 border-radius:7px 38 } 39 .w60 { 40 width:60% 41 } 42 .w75 { 43 width:75% 44 } 45 .w90 { 46 width:90% 47 } 48 .w100 { 49 width:100% 50 } 51 .actions { 52 display:flex; 53 gap:10px; 54 margin-top:4px 55 } 56 .sk-btn { 57 height:32px; 58 width:80px; 59 border-radius:6px; 60 background:linear-gradient(90deg, 61 #1A1A2E 25%, 62 #2A2A3E 50%, 63 #1A1A2E 75%); 64 background-size:200% 100%; 65 animation:shimmer 1.5s ease-in-out infinite 66 } 67 @keyframes shimmer { 68 0% { 69 background-position:200% 0 70 } 71 100% { 72 background-position:-200% 0 73 } 74 }
Copy 1 <style> 2 .shimmer{background:linear-gradient(90deg,#1A1A2E 25%,#2A2A3E 50%,#1A1A2E 75%);background-size:200% 100%;animation:shimmer 1.5s ease-in-out infinite}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 3 </style> 4 <div class="max-w-[340px] mx-auto rounded-xl overflow-hidden border border-[#1A1A2E] bg-[#0A0A0F]"> 5 <div class="shimmer w-full h-[140px]"> 6 </div> 7 <div class="p-4 flex flex-col gap-2.5"> 8 <div class="shimmer h-3.5 rounded-md w-3/5"> 9 </div> 10 <div class="shimmer h-2.5 rounded-md w-full"> 11 </div> 12 <div class="shimmer h-2.5 rounded-md w-[90%]"> 13 </div> 14 <div class="shimmer h-2.5 rounded-md w-3/4"> 15 </div> 16 <div class="flex gap-2.5 mt-1"> 17 <div class="shimmer h-8 w-20 rounded-md"> 18 </div> 19 <div class="shimmer h-8 w-20 rounded-md"> 20 </div> 21 </div> 22 </div> 23 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important;animation:placeholder-glow 2s ease-in-out infinite!important} 3 </style> 4 <div class="card bg-dark border-secondary mx-auto" style="max-width:340px"> 5 <div class="placeholder-glow"> 6 <div class="placeholder w-100" style="height:140px"> 7 </div> 8 </div> 9 <div class="card-body"> 10 <span class="placeholder col-7 rounded mb-2 d-block" style="height:14px"> 11 </span> 12 <span class="placeholder col-12 rounded mb-2 d-block" style="height:10px"> 13 </span> 14 <span class="placeholder col-10 rounded mb-2 d-block" style="height:10px"> 15 </span> 16 <span class="placeholder col-8 rounded mb-3 d-block" style="height:10px"> 17 </span> 18 <div class="d-flex gap-2"> 19 <span class="placeholder rounded" style="width:80px;height:32px"> 20 </span> 21 <span class="placeholder rounded" style="width:80px;height:32px"> 22 </span> 23 </div> 24 </div> 25 </div>
preview
✓ best practice
Match the skeleton shape to the actual content layout. If your card has an image on the left, don't show a full-width image skeleton. The closer the skeleton matches the final layout, the less jarring the transition.
📝 note
Form skeletons should preserve label-to-field spacing and input heights. If real inputs use helper text or error messages, leave room for those regions so the form does not jump when validation messages appear.
Table Skeleton
Skeleton rows and columns mimicking a data table while content loads from the server.
table-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="table-sk"> 2 <div class="sk-header"> 3 <div class="sk-cell w20"> 4 </div> 5 <div class="sk-cell w30"> 6 </div> 7 <div class="sk-cell w25"> 8 </div> 9 <div class="sk-cell w15"> 10 </div> 11 </div> 12 <div class="sk-row"> 13 <div class="sk-cell w20"> 14 </div> 15 <div class="sk-cell w30"> 16 </div> 17 <div class="sk-cell w25"> 18 </div> 19 <div class="sk-cell w15"> 20 </div> 21 </div> 22 <div class="sk-row"> 23 <div class="sk-cell w20"> 24 </div> 25 <div class="sk-cell w30"> 26 </div> 27 <div class="sk-cell w25"> 28 </div> 29 <div class="sk-cell w15"> 30 </div> 31 </div> 32 <div class="sk-row"> 33 <div class="sk-cell w20"> 34 </div> 35 <div class="sk-cell w30"> 36 </div> 37 <div class="sk-cell w25"> 38 </div> 39 <div class="sk-cell w15"> 40 </div> 41 </div> 42 <div class="sk-row"> 43 <div class="sk-cell w20"> 44 </div> 45 <div class="sk-cell w30"> 46 </div> 47 <div class="sk-cell w25"> 48 </div> 49 <div class="sk-cell w15"> 50 </div> 51 </div> 52 </div>
Copy 1 .table-sk { 2 max-width:440px; 3 margin:16px auto; 4 border:1px solid #1A1A2E; 5 border-radius:8px; 6 overflow:hidden 7 } 8 .sk-header, 9 .sk-row { 10 display:flex; 11 gap:12px; 12 padding:12px 16px 13 } 14 .sk-header { 15 background:#0F0F1A; 16 border-bottom:1px solid #1A1A2E 17 } 18 .sk-row { 19 border-bottom:1px solid #12121E 20 } 21 .sk-row:last-child { 22 border-bottom:none 23 } 24 .sk-cell { 25 height:10px; 26 border-radius:5px; 27 background:linear-gradient(90deg, 28 #1A1A2E 25%, 29 #2A2A3E 50%, 30 #1A1A2E 75%); 31 background-size:200% 100%; 32 animation:shimmer 1.5s ease-in-out infinite 33 } 34 .w15 { 35 width:15% 36 } 37 .w20 { 38 width:20% 39 } 40 .w25 { 41 width:25% 42 } 43 .w30 { 44 width:30% 45 } 46 @keyframes shimmer { 47 0% { 48 background-position:200% 0 49 } 50 100% { 51 background-position:-200% 0 52 } 53 }
Copy 1 <style> 2 .shimmer{background:linear-gradient(90deg,#1A1A2E 25%,#2A2A3E 50%,#1A1A2E 75%);background-size:200% 100%;animation:shimmer 1.5s ease-in-out infinite}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 3 </style> 4 <div class="max-w-md mx-auto border border-[#1A1A2E] rounded-lg overflow-hidden bg-[#0A0A0A]"> 5 <div class="flex gap-3 px-4 py-3 bg-[#0F0F1A] border-b border-[#1A1A2E]"> 6 <div class="shimmer h-2.5 rounded w-[20%]"> 7 </div> 8 <div class="shimmer h-2.5 rounded w-[30%]"> 9 </div> 10 <div class="shimmer h-2.5 rounded w-[25%]"> 11 </div> 12 <div class="shimmer h-2.5 rounded w-[15%]"> 13 </div> 14 </div> 15 <div class="flex gap-3 px-4 py-3 border-b border-[#12121E]"> 16 <div class="shimmer h-2.5 rounded w-[20%]"> 17 </div> 18 <div class="shimmer h-2.5 rounded w-[30%]"> 19 </div> 20 <div class="shimmer h-2.5 rounded w-[25%]"> 21 </div> 22 <div class="shimmer h-2.5 rounded w-[15%]"> 23 </div> 24 </div> 25 <div class="flex gap-3 px-4 py-3 border-b border-[#12121E]"> 26 <div class="shimmer h-2.5 rounded w-[20%]"> 27 </div> 28 <div class="shimmer h-2.5 rounded w-[30%]"> 29 </div> 30 <div class="shimmer h-2.5 rounded w-[25%]"> 31 </div> 32 <div class="shimmer h-2.5 rounded w-[15%]"> 33 </div> 34 </div> 35 <div class="flex gap-3 px-4 py-3 border-b border-[#12121E]"> 36 <div class="shimmer h-2.5 rounded w-[20%]"> 37 </div> 38 <div class="shimmer h-2.5 rounded w-[30%]"> 39 </div> 40 <div class="shimmer h-2.5 rounded w-[25%]"> 41 </div> 42 <div class="shimmer h-2.5 rounded w-[15%]"> 43 </div> 44 </div> 45 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important;animation:placeholder-glow 2s ease-in-out infinite!important} 3 </style> 4 <div class="table-responsive border border-secondary rounded mx-auto" style="max-width:440px"> 5 <table class="table table-dark table-borderless mb-0"> 6 <thead> 7 <tr class="border-bottom border-secondary"> 8 <th> 9 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 10 </span> 11 </th> 12 <th> 13 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 14 </span> 15 </th> 16 <th> 17 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 18 </span> 19 </th> 20 <th> 21 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 22 </span> 23 </th> 24 </tr> 25 </thead> 26 <tbody> 27 <tr class="border-bottom border-secondary"> 28 <td> 29 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 30 </span> 31 </td> 32 <td> 33 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 34 </span> 35 </td> 36 <td> 37 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 38 </span> 39 </td> 40 <td> 41 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 42 </span> 43 </td> 44 </tr> 45 <tr class="border-bottom border-secondary"> 46 <td> 47 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 48 </span> 49 </td> 50 <td> 51 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 52 </span> 53 </td> 54 <td> 55 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 56 </span> 57 </td> 58 <td> 59 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 60 </span> 61 </td> 62 </tr> 63 <tr class="border-bottom border-secondary"> 64 <td> 65 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 66 </span> 67 </td> 68 <td> 69 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 70 </span> 71 </td> 72 <td> 73 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 74 </span> 75 </td> 76 <td> 77 <span class="placeholder rounded d-block" style="width:80%;height:10px"> 78 </span> 79 </td> 80 </tr> 81 </tbody> 82 </table> 83 </div>
preview
Dashboard Stats
Metric cards for dashboards — labels, large values, and micro-trends rendered as skeleton blocks.
stats-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="stats"> 2 <div class="stat-card"> 3 <div class="sk-line w40"> 4 </div> 5 <div class="sk-num w60"> 6 </div> 7 <div class="sk-line w80"> 8 </div> 9 </div> 10 <div class="stat-card"> 11 <div class="sk-line w40"> 12 </div> 13 <div class="sk-num w50"> 14 </div> 15 <div class="sk-line w70"> 16 </div> 17 </div> 18 <div class="stat-card"> 19 <div class="sk-line w40"> 20 </div> 21 <div class="sk-num w70"> 22 </div> 23 <div class="sk-line w60"> 24 </div> 25 </div> 26 </div>
Copy 1 .stats { 2 display:grid; 3 grid-template-columns:repeat(3, 4 1fr); 5 gap:12px; 6 max-width:520px; 7 margin:16px auto; 8 padding:16px 9 } 10 .stat-card { 11 border:1px solid #1A1A2E; 12 border-radius:12px; 13 padding:16px; 14 background:#0A0A0F; 15 display:flex; 16 flex-direction:column; 17 gap:10px 18 } 19 .sk-line { 20 height:10px; 21 border-radius:5px; 22 background:linear-gradient(90deg, 23 #1A1A2E 25%, 24 #2A2A3E 50%, 25 #1A1A2E 75%); 26 background-size:200% 100%; 27 animation:shimmer 1.5s ease-in-out infinite 28 } 29 .sk-num { 30 height:28px; 31 border-radius:8px; 32 background:linear-gradient(90deg, 33 #1A1A2E 25%, 34 #2A2A3E 50%, 35 #1A1A2E 75%); 36 background-size:200% 100%; 37 animation:shimmer 1.5s ease-in-out infinite 38 } 39 .w40 { 40 width:40% 41 } 42 .w50 { 43 width:50% 44 } 45 .w60 { 46 width:60% 47 } 48 .w70 { 49 width:70% 50 } 51 .w80 { 52 width:80% 53 } 54 @keyframes shimmer { 55 0% { 56 background-position:200% 0 57 } 58 100% { 59 background-position:-200% 0 60 } 61 }
Copy 1 <style> 2 .shimmer{background:linear-gradient(90deg,#1A1A2E 25%,#2A2A3E 50%,#1A1A2E 75%);background-size:200% 100%;animation:shimmer 1.5s ease-in-out infinite}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 3 </style> 4 <div class="grid grid-cols-3 gap-3 max-w-lg mx-auto p-4 bg-[#0A0A0A]"> 5 <div class="border border-[#1A1A2E] rounded-xl p-4 bg-[#0A0A0F] flex flex-col gap-2.5"> 6 <div class="shimmer h-2.5 rounded w-2/5"> 7 </div> 8 <div class="shimmer h-7 rounded-lg w-3/5"> 9 </div> 10 <div class="shimmer h-2 rounded w-4/5"> 11 </div> 12 </div> 13 <div class="border border-[#1A1A2E] rounded-xl p-4 bg-[#0A0A0F] flex flex-col gap-2.5"> 14 <div class="shimmer h-2.5 rounded w-2/5"> 15 </div> 16 <div class="shimmer h-7 rounded-lg w-1/2"> 17 </div> 18 <div class="shimmer h-2 rounded w-[70%]"> 19 </div> 20 </div> 21 <div class="border border-[#1A1A2E] rounded-xl p-4 bg-[#0A0A0F] flex flex-col gap-2.5"> 22 <div class="shimmer h-2.5 rounded w-2/5"> 23 </div> 24 <div class="shimmer h-7 rounded-lg w-[70%]"> 25 </div> 26 <div class="shimmer h-2 rounded w-3/5"> 27 </div> 28 </div> 29 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important;animation:placeholder-glow 2s ease-in-out infinite!important} 3 </style> 4 <div class="container p-3 bg-dark" style="max-width:520px"> 5 <div class="row g-3"> 6 <div class="col-4"> 7 <div class="card bg-dark border-secondary h-100 p-3"> 8 <span class="placeholder rounded mb-2 d-block" style="width:40%;height:10px"> 9 </span> 10 <span class="placeholder rounded mb-2 d-block" style="width:60%;height:28px"> 11 </span> 12 <span class="placeholder rounded d-block" style="width:80%;height:8px"> 13 </span> 14 </div> 15 </div> 16 <div class="col-4"> 17 <div class="card bg-dark border-secondary h-100 p-3"> 18 <span class="placeholder rounded mb-2 d-block" style="width:40%;height:10px"> 19 </span> 20 <span class="placeholder rounded mb-2 d-block" style="width:50%;height:28px"> 21 </span> 22 <span class="placeholder rounded d-block" style="width:70%;height:8px"> 23 </span> 24 </div> 25 </div> 26 <div class="col-4"> 27 <div class="card bg-dark border-secondary h-100 p-3"> 28 <span class="placeholder rounded mb-2 d-block" style="width:40%;height:10px"> 29 </span> 30 <span class="placeholder rounded mb-2 d-block" style="width:70%;height:28px"> 31 </span> 32 <span class="placeholder rounded d-block" style="width:60%;height:8px"> 33 </span> 34 </div> 35 </div> 36 </div> 37 </div>
preview
Custom Shapes
Skeleton elements for buttons, badges, thumbnails, and circular shapes — build any layout.
shape-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="wrap"> 2 <div class="sk-circle lg"> 3 </div> 4 <div class="sk-circle md"> 5 </div> 6 <div class="sk-circle sm"> 7 </div> 8 <div class="sk-rect"> 9 </div> 10 <div class="sk-pill"> 11 </div> 12 <div class="sk-btn-sk"> 13 </div> 14 </div>
Copy 1 .wrap { 2 display:flex; 3 gap:16px; 4 align-items:center; 5 justify-content:center; 6 padding:32px 7 } 8 .sk-circle { 9 border-radius:50%; 10 background:linear-gradient(90deg, 11 #1A1A2E 25%, 12 #2A2A3E 50%, 13 #1A1A2E 75%); 14 background-size:200% 100%; 15 animation:shimmer 1.5s ease-in-out infinite; 16 flex-shrink:0 17 } 18 .sk-circle.lg { 19 width:56px; 20 height:56px 21 } 22 .sk-circle.md { 23 width:40px; 24 height:40px 25 } 26 .sk-circle.sm { 27 width:28px; 28 height:28px 29 } 30 .sk-rect { 31 width:80px; 32 height:60px; 33 border-radius:8px; 34 background:linear-gradient(90deg, 35 #1A1A2E 25%, 36 #2A2A3E 50%, 37 #1A1A2E 75%); 38 background-size:200% 100%; 39 animation:shimmer 1.5s ease-in-out infinite 40 } 41 .sk-pill { 42 width:100px; 43 height:24px; 44 border-radius:12px; 45 background:linear-gradient(90deg, 46 #1A1A2E 25%, 47 #2A2A3E 50%, 48 #1A1A2E 75%); 49 background-size:200% 100%; 50 animation:shimmer 1.5s ease-in-out infinite 51 } 52 .sk-btn-sk { 53 width:90px; 54 height:36px; 55 border-radius:8px; 56 background:linear-gradient(90deg, 57 #1A1A2E 25%, 58 #2A2A3E 50%, 59 #1A1A2E 75%); 60 background-size:200% 100%; 61 animation:shimmer 1.5s ease-in-out infinite 62 } 63 @keyframes shimmer { 64 0% { 65 background-position:200% 0 66 } 67 100% { 68 background-position:-200% 0 69 } 70 }
Copy 1 <style> 2 .shimmer{background:linear-gradient(90deg,#1A1A2E 25%,#2A2A3E 50%,#1A1A2E 75%);background-size:200% 100%;animation:shimmer 1.5s ease-in-out infinite}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 3 </style> 4 <div class="flex flex-wrap gap-4 items-center justify-center p-8 bg-[#0A0A0A]"> 5 <div class="shimmer w-14 h-14 rounded-full"> 6 </div> 7 <div class="shimmer w-10 h-10 rounded-full"> 8 </div> 9 <div class="shimmer w-7 h-7 rounded-full"> 10 </div> 11 <div class="shimmer w-20 h-[60px] rounded-lg"> 12 </div> 13 <div class="shimmer w-24 h-6 rounded-full"> 14 </div> 15 <div class="shimmer w-[90px] h-9 rounded-lg"> 16 </div> 17 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important;animation:placeholder-glow 2s ease-in-out infinite!important} 3 </style> 4 <div class="d-flex flex-wrap gap-4 align-items-center justify-content-center p-4 bg-dark"> 5 <span class="placeholder rounded-circle" style="width:56px;height:56px"> 6 </span> 7 <span class="placeholder rounded-circle" style="width:40px;height:40px"> 8 </span> 9 <span class="placeholder rounded-circle" style="width:28px;height:28px"> 10 </span> 11 <span class="placeholder rounded" style="width:80px;height:60px"> 12 </span> 13 <span class="placeholder rounded-pill" style="width:100px;height:24px"> 14 </span> 15 <span class="placeholder rounded" style="width:90px;height:36px"> 16 </span> 17 </div>
preview
Code Block
A terminal-style skeleton for documentation, logs, or snippet loaders with indented lines.
code-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="code-sk"> 2 <div class="sk-line"> 3 </div> 4 <div class="sk-line indent"> 5 </div> 6 <div class="sk-line indent"> 7 </div> 8 <div class="sk-line"> 9 </div> 10 <div class="sk-line indent"> 11 </div> 12 </div>
Copy 1 .code-sk { 2 max-width:420px; 3 margin:16px auto; 4 border-radius:8px; 5 background:#0F0F1A; 6 border:1px solid #1A1A2E; 7 padding:16px; 8 display:flex; 9 flex-direction:column; 10 gap:8px 11 } 12 .sk-line { 13 height:10px; 14 border-radius:5px; 15 background:linear-gradient(90deg, 16 #1A1A2E 25%, 17 #2A2A3E 50%, 18 #1A1A2E 75%); 19 background-size:200% 100%; 20 animation:shimmer 1.5s ease-in-out infinite 21 } 22 .sk-line.indent { 23 margin-left:24px; 24 width:calc(100% - 24px) 25 } 26 @keyframes shimmer { 27 0% { 28 background-position:200% 0 29 } 30 100% { 31 background-position:-200% 0 32 } 33 }
Copy 1 <style> 2 .shimmer{background:linear-gradient(90deg,#1A1A2E 25%,#2A2A3E 50%,#1A1A2E 75%);background-size:200% 100%;animation:shimmer 1.5s ease-in-out infinite}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 3 </style> 4 <div class="max-w-md mx-auto rounded-lg bg-[#0F0F1A] border border-[#1A1A2E] p-4 flex flex-col gap-2 bg-[#0A0A0A]"> 5 <div class="shimmer h-2.5 rounded w-full"> 6 </div> 7 <div class="shimmer h-2.5 rounded w-[calc(100%-1.5rem)] ml-6"> 8 </div> 9 <div class="shimmer h-2.5 rounded w-[calc(100%-1.5rem)] ml-6"> 10 </div> 11 <div class="shimmer h-2.5 rounded w-full"> 12 </div> 13 <div class="shimmer h-2.5 rounded w-[calc(100%-1.5rem)] ml-6"> 14 </div> 15 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important;animation:placeholder-glow 2s ease-in-out infinite!important} 3 </style> 4 <div class="container p-3 rounded border border-secondary bg-dark" style="max-width:420px"> 5 <span class="placeholder rounded d-block mb-2" style="width:100%;height:10px"> 6 </span> 7 <span class="placeholder rounded d-block mb-2" style="width:calc(100% - 24px);height:10px;margin-left:24px"> 8 </span> 9 <span class="placeholder rounded d-block mb-2" style="width:calc(100% - 24px);height:10px;margin-left:24px"> 10 </span> 11 <span class="placeholder rounded d-block mb-2" style="width:100%;height:10px"> 12 </span> 13 <span class="placeholder rounded d-block" style="width:calc(100% - 24px);height:10px;margin-left:24px"> 14 </span> 15 </div>
preview
Staggered Animation
Skeleton lines with staggered animation delays create a cascading shimmer effect that feels more natural.
staggered-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="wrap"> 2 <div class="row"> 3 <div class="sk-circle"> 4 </div> 5 <div class="lines"> 6 <div class="sk-line w50 d1"> 7 </div> 8 <div class="sk-line w80 d2"> 9 </div> 10 </div> 11 </div> 12 <div class="row"> 13 <div class="sk-circle d1"> 14 </div> 15 <div class="lines"> 16 <div class="sk-line w60 d2"> 17 </div> 18 <div class="sk-line w45 d3"> 19 </div> 20 </div> 21 </div> 22 <div class="row"> 23 <div class="sk-circle d2"> 24 </div> 25 <div class="lines"> 26 <div class="sk-line w40 d3"> 27 </div> 28 <div class="sk-line w70 d4"> 29 </div> 30 </div> 31 </div> 32 </div>
Copy 1 .wrap { 2 max-width:380px; 3 margin:16px auto; 4 padding:0 16px 5 } 6 .row { 7 display:flex; 8 align-items:center; 9 gap:12px; 10 padding:14px 0; 11 border-bottom:1px solid #1A1A2E 12 } 13 .sk-circle { 14 width:42px; 15 height:42px; 16 border-radius:50%; 17 flex-shrink:0; 18 background:linear-gradient(90deg, 19 #1A1A2E 25%, 20 #2A2A3E 50%, 21 #1A1A2E 75%); 22 background-size:200% 100%; 23 animation:shimmer 1.5s ease-in-out infinite 24 } 25 .lines { 26 display:flex; 27 flex-direction:column; 28 gap:8px; 29 flex:1 30 } 31 .sk-line { 32 height:10px; 33 border-radius:5px; 34 background:linear-gradient(90deg, 35 #1A1A2E 25%, 36 #2A2A3E 50%, 37 #1A1A2E 75%); 38 background-size:200% 100%; 39 animation:shimmer 1.5s ease-in-out infinite 40 } 41 .w40 { 42 width:40% 43 } 44 .w45 { 45 width:45% 46 } 47 .w50 { 48 width:50% 49 } 50 .w60 { 51 width:60% 52 } 53 .w70 { 54 width:70% 55 } 56 .w80 { 57 width:80% 58 } 59 .d1 { 60 animation-delay:.1s 61 } 62 .d2 { 63 animation-delay:.2s 64 } 65 .d3 { 66 animation-delay:.3s 67 } 68 .d4 { 69 animation-delay:.4s 70 } 71 @keyframes shimmer { 72 0% { 73 background-position:200% 0 74 } 75 100% { 76 background-position:-200% 0 77 } 78 }
Copy 1 <style> 2 .shimmer{background:linear-gradient(90deg,#1A1A2E 25%,#2A2A3E 50%,#1A1A2E 75%);background-size:200% 100%;animation:shimmer 1.5s ease-in-out infinite}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 3 </style> 4 <div class="max-w-md mx-auto px-4 bg-[#0A0A0A]"> 5 <div class="flex items-center gap-3 py-3 border-b border-[#1A1A2E]"> 6 <div class="shimmer w-[42px] h-[42px] rounded-full" style="animation-delay:.1s"> 7 </div> 8 <div class="flex flex-col gap-2 flex-1"> 9 <div class="shimmer h-2.5 rounded w-1/2" style="animation-delay:.2s"> 10 </div> 11 <div class="shimmer h-2.5 rounded w-4/5" style="animation-delay:.3s"> 12 </div> 13 </div> 14 </div> 15 <div class="flex items-center gap-3 py-3 border-b border-[#1A1A2E]"> 16 <div class="shimmer w-[42px] h-[42px] rounded-full" style="animation-delay:.2s"> 17 </div> 18 <div class="flex flex-col gap-2 flex-1"> 19 <div class="shimmer h-2.5 rounded w-3/5" style="animation-delay:.3s"> 20 </div> 21 <div class="shimmer h-2.5 rounded w-[45%]" style="animation-delay:.4s"> 22 </div> 23 </div> 24 </div> 25 <div class="flex items-center gap-3 py-3 border-b border-[#1A1A2E]"> 26 <div class="shimmer w-[42px] h-[42px] rounded-full" style="animation-delay:.3s"> 27 </div> 28 <div class="flex flex-col gap-2 flex-1"> 29 <div class="shimmer h-2.5 rounded w-2/5" style="animation-delay:.4s"> 30 </div> 31 <div class="shimmer h-2.5 rounded w-[70%]" style="animation-delay:.5s"> 32 </div> 33 </div> 34 </div> 35 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important;animation:placeholder-glow 2s ease-in-out infinite!important} 3 </style> 4 <div class="container px-3 bg-dark" style="max-width:380px"> 5 <div class="d-flex align-items-center gap-3 py-3 border-bottom border-secondary"> 6 <div class="placeholder-glow"> 7 <span class="placeholder rounded-circle flex-shrink-0" style="width:42px;height:42px;animation-delay:.1s"> 8 </span> 9 </div> 10 <div class="d-flex flex-column gap-2 flex-fill"> 11 <span class="placeholder rounded d-block" style="width:50%;height:10px;animation-delay:.2s"> 12 </span> 13 <span class="placeholder rounded d-block" style="width:80%;height:10px;animation-delay:.3s"> 14 </span> 15 </div> 16 </div> 17 <div class="d-flex align-items-center gap-3 py-3 border-bottom border-secondary"> 18 <div class="placeholder-glow"> 19 <span class="placeholder rounded-circle flex-shrink-0" style="width:42px;height:42px;animation-delay:.2s"> 20 </span> 21 </div> 22 <div class="d-flex flex-column gap-2 flex-fill"> 23 <span class="placeholder rounded d-block" style="width:60%;height:10px;animation-delay:.3s"> 24 </span> 25 <span class="placeholder rounded d-block" style="width:45%;height:10px;animation-delay:.4s"> 26 </span> 27 </div> 28 </div> 29 <div class="d-flex align-items-center gap-3 py-3 border-bottom border-secondary"> 30 <div class="placeholder-glow"> 31 <span class="placeholder rounded-circle flex-shrink-0" style="width:42px;height:42px;animation-delay:.3s"> 32 </span> 33 </div> 34 <div class="d-flex flex-column gap-2 flex-fill"> 35 <span class="placeholder rounded d-block" style="width:40%;height:10px;animation-delay:.4s"> 36 </span> 37 <span class="placeholder rounded d-block" style="width:70%;height:10px;animation-delay:.5s"> 38 </span> 39 </div> 40 </div> 41 </div>
preview
🔥 pro tip
Add staggered animation-delay values (0.1s increments) to each skeleton element. This creates a wave effect that's more visually pleasing than all elements shimmering in sync.
Profile Card Skeleton
Complete skeleton for a profile card with cover image, avatar, name, bio, and stats.
profile-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="profile-sk"> 2 <div class="sk-cover"> 3 </div> 4 <div class="sk-avatar-wrap"> 5 <div class="sk-avatar"> 6 </div> 7 </div> 8 <div class="profile-body"> 9 <div class="sk-line w40 centered"> 10 </div> 11 <div class="sk-line w60 centered sm"> 12 </div> 13 <div class="sk-line w100"> 14 </div> 15 <div class="sk-line w90"> 16 </div> 17 <div class="sk-line w70"> 18 </div> 19 <div class="sk-stats"> 20 <div class="sk-stat"> 21 <div class="sk-line w100"> 22 </div> 23 <div class="sk-line w60 sm"> 24 </div> 25 </div> 26 <div class="sk-stat"> 27 <div class="sk-line w100"> 28 </div> 29 <div class="sk-line w50 sm"> 30 </div> 31 </div> 32 <div class="sk-stat"> 33 <div class="sk-line w100"> 34 </div> 35 <div class="sk-line w70 sm"> 36 </div> 37 </div> 38 </div> 39 </div> 40 </div>
Copy 1 .profile-sk { 2 max-width:300px; 3 margin:16px auto; 4 border-radius:12px; 5 overflow:hidden; 6 border:1px solid #1A1A2E; 7 background:#0A0A0F 8 } 9 .sk-cover { 10 width:100%; 11 height:100px; 12 background:linear-gradient(90deg, 13 #1A1A2E 25%, 14 #252538 50%, 15 #1A1A2E 75%); 16 background-size:200% 100%; 17 animation:shimmer 1.5s ease-in-out infinite 18 } 19 .sk-avatar-wrap { 20 display:flex; 21 justify-content:center; 22 margin-top:-28px 23 } 24 .sk-avatar { 25 width:56px; 26 height:56px; 27 border-radius:50%; 28 border:3px solid #0A0A0F; 29 background:linear-gradient(90deg, 30 #1A1A2E 25%, 31 #2A2A3E 50%, 32 #1A1A2E 75%); 33 background-size:200% 100%; 34 animation:shimmer 1.5s ease-in-out infinite 35 } 36 .profile-body { 37 padding:16px; 38 display:flex; 39 flex-direction:column; 40 align-items:center; 41 gap:10px 42 } 43 .sk-line { 44 height:10px; 45 border-radius:5px; 46 background:linear-gradient(90deg, 47 #1A1A2E 25%, 48 #2A2A3E 50%, 49 #1A1A2E 75%); 50 background-size:200% 100%; 51 animation:shimmer 1.5s ease-in-out infinite 52 } 53 .centered { 54 align-self:center 55 } 56 .w40 { 57 width:40% 58 } 59 .w50 { 60 width:50% 61 } 62 .w60 { 63 width:60% 64 } 65 .w70 { 66 width:70% 67 } 68 .w90 { 69 width:90% 70 } 71 .w100 { 72 width:100% 73 } 74 .sm { 75 height:8px; 76 border-radius:4px 77 } 78 .sk-stats { 79 display:flex; 80 gap:20px; 81 margin-top:8px; 82 width:100% 83 } 84 .sk-stat { 85 flex:1; 86 display:flex; 87 flex-direction:column; 88 gap:6px; 89 align-items:center 90 } 91 @keyframes shimmer { 92 0% { 93 background-position:200% 0 94 } 95 100% { 96 background-position:-200% 0 97 } 98 }
Copy 1 <style> 2 .shimmer{background:linear-gradient(90deg,#1A1A2E 25%,#2A2A3E 50%,#1A1A2E 75%);background-size:200% 100%;animation:shimmer 1.5s ease-in-out infinite}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 3 </style> 4 <div class="max-w-[300px] mx-auto rounded-xl overflow-hidden border border-[#1A1A2E] bg-[#0A0A0F]"> 5 <div class="shimmer w-full h-[100px]"> 6 </div> 7 <div class="flex justify-center -mt-7"> 8 <div class="shimmer w-14 h-14 rounded-full border-[3px] border-[#0A0A0F]"> 9 </div> 10 </div> 11 <div class="p-4 flex flex-col items-center gap-2.5"> 12 <div class="shimmer h-3 rounded w-2/5"> 13 </div> 14 <div class="shimmer h-2 rounded w-3/5"> 15 </div> 16 <div class="shimmer h-2.5 rounded w-full"> 17 </div> 18 <div class="shimmer h-2.5 rounded w-[90%]"> 19 </div> 20 <div class="shimmer h-2.5 rounded w-3/4"> 21 </div> 22 <div class="flex gap-5 mt-2 w-full"> 23 <div class="flex-1 flex flex-col items-center gap-1.5"> 24 <div class="shimmer h-2 rounded w-full"> 25 </div> 26 <div class="shimmer h-2 rounded w-3/5"> 27 </div> 28 </div> 29 <div class="flex-1 flex flex-col items-center gap-1.5"> 30 <div class="shimmer h-2 rounded w-full"> 31 </div> 32 <div class="shimmer h-2 rounded w-1/2"> 33 </div> 34 </div> 35 <div class="flex-1 flex flex-col items-center gap-1.5"> 36 <div class="shimmer h-2 rounded w-full"> 37 </div> 38 <div class="shimmer h-2 rounded w-[70%]"> 39 </div> 40 </div> 41 </div> 42 </div> 43 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important;animation:placeholder-glow 2s ease-in-out infinite!important} 3 </style> 4 <div class="card bg-dark border-secondary mx-auto" style="max-width:300px"> 5 <div class="placeholder-glow"> 6 <div class="placeholder w-100" style="height:100px"> 7 </div> 8 </div> 9 <div class="text-center" style="margin-top:-28px"> 10 <div class="placeholder-glow d-inline-block"> 11 <span class="placeholder rounded-circle border border-dark" style="width:56px;height:56px"> 12 </span> 13 </div> 14 </div> 15 <div class="card-body text-center"> 16 <span class="placeholder col-5 rounded mb-2 d-block mx-auto" style="height:12px"> 17 </span> 18 <span class="placeholder col-7 rounded mb-3 d-block mx-auto" style="height:8px"> 19 </span> 20 <span class="placeholder col-12 rounded mb-2 d-block" style="height:10px"> 21 </span> 22 <span class="placeholder col-10 rounded mb-2 d-block" style="height:10px"> 23 </span> 24 <span class="placeholder col-8 rounded mb-3 d-block" style="height:10px"> 25 </span> 26 <div class="row g-3"> 27 <div class="col-4"> 28 <span class="placeholder rounded d-block mb-2" style="height:10px"> 29 </span> 30 <span class="placeholder rounded d-block mx-auto" style="width:60%;height:8px"> 31 </span> 32 </div> 33 <div class="col-4"> 34 <span class="placeholder rounded d-block mb-2" style="height:10px"> 35 </span> 36 <span class="placeholder rounded d-block mx-auto" style="width:50%;height:8px"> 37 </span> 38 </div> 39 <div class="col-4"> 40 <span class="placeholder rounded d-block mb-2" style="height:10px"> 41 </span> 42 <span class="placeholder rounded d-block mx-auto" style="width:70%;height:8px"> 43 </span> 44 </div> 45 </div> 46 </div> 47 </div>
preview
📝 note
Profile card skeletons need a negative margin on the avatar to overlap the cover image. Always account for this layout offset in the skeleton so it matches the final rendered card exactly.
Feed Skeleton
Skeleton for a social media feed post with user info, text content, image placeholder, and action buttons.
feed-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="feed-sk"> 2 <div class="post-sk"> 3 <div class="post-header"> 4 <div class="sk-circle sm"> 5 </div> 6 <div class="hdr-lines"> 7 <div class="sk-line w40"> 8 </div> 9 <div class="sk-line w25 xs"> 10 </div> 11 </div> 12 </div> 13 <div class="post-body"> 14 <div class="sk-line w100"> 15 </div> 16 <div class="sk-line w85"> 17 </div> 18 <div class="sk-line w60"> 19 </div> 20 </div> 21 <div class="sk-post-img"> 22 </div> 23 <div class="post-actions"> 24 <div class="sk-action"> 25 </div> 26 <div class="sk-action"> 27 </div> 28 <div class="sk-action"> 29 </div> 30 </div> 31 </div> 32 </div>
Copy 1 .feed-sk { 2 max-width:380px; 3 margin:16px auto; 4 border:1px solid #1A1A2E; 5 border-radius:12px; 6 overflow:hidden; 7 background:#0A0A0F; 8 padding:16px 9 } 10 .post-header { 11 display:flex; 12 align-items:center; 13 gap:10px; 14 margin-bottom:14px 15 } 16 .sk-circle { 17 border-radius:50%; 18 flex-shrink:0; 19 background:linear-gradient(90deg, 20 #1A1A2E 25%, 21 #2A2A3E 50%, 22 #1A1A2E 75%); 23 background-size:200% 100%; 24 animation:shimmer 1.5s ease-in-out infinite 25 } 26 .sk-circle.sm { 27 width:36px; 28 height:36px 29 } 30 .hdr-lines { 31 display:flex; 32 flex-direction:column; 33 gap:6px; 34 flex:1 35 } 36 .sk-line { 37 height:10px; 38 border-radius:5px; 39 background:linear-gradient(90deg, 40 #1A1A2E 25%, 41 #2A2A3E 50%, 42 #1A1A2E 75%); 43 background-size:200% 100%; 44 animation:shimmer 1.5s ease-in-out infinite 45 } 46 .xs { 47 height:8px; 48 border-radius:4px 49 } 50 .w25 { 51 width:25% 52 } 53 .w40 { 54 width:40% 55 } 56 .w60 { 57 width:60% 58 } 59 .w85 { 60 width:85% 61 } 62 .w100 { 63 width:100% 64 } 65 .post-body { 66 display:flex; 67 flex-direction:column; 68 gap:8px; 69 margin-bottom:14px 70 } 71 .sk-post-img { 72 width:100%; 73 height:160px; 74 border-radius:8px; 75 background:linear-gradient(90deg, 76 #1A1A2E 25%, 77 #252538 50%, 78 #1A1A2E 75%); 79 background-size:200% 100%; 80 animation:shimmer 1.5s ease-in-out infinite; 81 margin-bottom:14px 82 } 83 .post-actions { 84 display:flex; 85 gap:16px; 86 padding-top:12px; 87 border-top:1px solid #1A1A2E 88 } 89 .sk-action { 90 height:10px; 91 width:50px; 92 border-radius:5px; 93 background:linear-gradient(90deg, 94 #1A1A2E 25%, 95 #2A2A3E 50%, 96 #1A1A2E 75%); 97 background-size:200% 100%; 98 animation:shimmer 1.5s ease-in-out infinite 99 } 100 @keyframes shimmer { 101 0% { 102 background-position:200% 0 103 } 104 100% { 105 background-position:-200% 0 106 } 107 }
Copy 1 <style> 2 .shimmer{background:linear-gradient(90deg,#1A1A2E 25%,#2A2A3E 50%,#1A1A2E 75%);background-size:200% 100%;animation:shimmer 1.5s ease-in-out infinite}@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}} 3 </style> 4 <div class="max-w-sm mx-auto border border-[#1A1A2E] rounded-xl overflow-hidden bg-[#0A0A0F] p-4"> 5 <div class="flex items-center gap-2.5 mb-3.5"> 6 <div class="shimmer w-9 h-9 rounded-full"> 7 </div> 8 <div class="flex flex-col gap-1.5 flex-1"> 9 <div class="shimmer h-2.5 rounded w-2/5"> 10 </div> 11 <div class="shimmer h-2 rounded w-1/4"> 12 </div> 13 </div> 14 </div> 15 <div class="flex flex-col gap-2 mb-3.5"> 16 <div class="shimmer h-2.5 rounded w-full"> 17 </div> 18 <div class="shimmer h-2.5 rounded w-[85%]"> 19 </div> 20 <div class="shimmer h-2.5 rounded w-3/5"> 21 </div> 22 </div> 23 <div class="shimmer w-full h-40 rounded-lg mb-3.5"> 24 </div> 25 <div class="flex gap-4 pt-3 border-t border-[#1A1A2E]"> 26 <div class="shimmer h-2.5 w-12 rounded"> 27 </div> 28 <div class="shimmer h-2.5 w-12 rounded"> 29 </div> 30 <div class="shimmer h-2.5 w-12 rounded"> 31 </div> 32 </div> 33 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important;animation:placeholder-glow 2s ease-in-out infinite!important} 3 </style> 4 <div class="card bg-dark border-secondary mx-auto" style="max-width:380px"> 5 <div class="card-body"> 6 <div class="d-flex align-items-center gap-2 mb-3"> 7 <div class="placeholder-glow"> 8 <span class="placeholder rounded-circle" style="width:36px;height:36px"> 9 </span> 10 </div> 11 <div class="d-flex flex-column gap-1 flex-fill"> 12 <span class="placeholder rounded d-block" style="width:40%;height:10px"> 13 </span> 14 <span class="placeholder rounded d-block" style="width:25%;height:8px"> 15 </span> 16 </div> 17 </div> 18 <div class="mb-3"> 19 <span class="placeholder rounded d-block mb-2" style="height:10px"> 20 </span> 21 <span class="placeholder rounded d-block mb-2" style="width:85%;height:10px"> 22 </span> 23 <span class="placeholder rounded d-block mb-2" style="width:60%;height:10px"> 24 </span> 25 </div> 26 <div class="placeholder-glow mb-3"> 27 <div class="placeholder rounded w-100" style="height:160px"> 28 </div> 29 </div> 30 <div class="d-flex gap-3 pt-3 border-top border-secondary"> 31 <span class="placeholder rounded" style="width:50px;height:10px"> 32 </span> 33 <span class="placeholder rounded" style="width:50px;height:10px"> 34 </span> 35 <span class="placeholder rounded" style="width:50px;height:10px"> 36 </span> 37 </div> 38 </div> 39 </div>
preview
✓ best practice
Always include the same structural elements in your skeleton that appear in the real content — header, body, image, actions. Users subconsciously recognize the layout pattern, making the transition from skeleton to content feel seamless.
Reduced Motion
A static skeleton for users who prefer reduced motion, or as a fallback while shimmer keyframes load.
reduced-motion-skeleton HTML CSS Tailwind Bootstrap Live
Copy 1 <div class="wrap"> 2 <div class="sk-line w100"> 3 </div> 4 <div class="sk-line w80"> 5 </div> 6 <div class="sk-line w60"> 7 </div> 8 </div>
Copy 1 .wrap { 2 max-width:400px; 3 margin:20px auto; 4 display:flex; 5 flex-direction:column; 6 gap:10px; 7 padding:24px 8 } 9 .sk-line { 10 height:12px; 11 border-radius:6px; 12 background:#1A1A2E 13 }
Copy 1 <div class="max-w-md mx-auto flex flex-col gap-2.5 p-6 bg-[#0A0A0A]"> 2 <div class="h-3 rounded-md w-full bg-[#1A1A2E]"> 3 </div> 4 <div class="h-3 rounded-md w-4/5 bg-[#1A1A2E]"> 5 </div> 6 <div class="h-3 rounded-md w-3/5 bg-[#1A1A2E]"> 7 </div> 8 </div>
Copy 1 <style> 2 .placeholder{background-color:#1A1A2E!important;opacity:1!important} 3 </style> 4 <div class="container p-4 d-flex flex-column gap-2 bg-dark" style="max-width:400px"> 5 <span class="placeholder rounded d-block no-anim" style="height:12px"> 6 </span> 7 <span class="placeholder rounded d-block no-anim" style="width:80%;height:12px"> 8 </span> 9 <span class="placeholder rounded d-block no-anim" style="width:60%;height:12px"> 10 </span> 11 </div>
preview
⚠ warning
Respect prefers-reduced-motion . Replace shimmer animations with static placeholders for users who have disabled motion, or expose a user preference toggle in your app settings.
Accessibility
Skeletons are visual by nature, but screen-reader users and keyboard navigators still need context. Treat loaders as temporary state and avoid trapping focus or announcing every placeholder.
Wrap skeleton regions with aria-busy="true" on the live region or container while loading. Use aria-live="polite" so finished content is announced once, not placeholder shapes. Do not focus skeleton elements; keep focus on the trigger or move it to the loaded content. Honor prefers-reduced-motion by disabling shimmer animations. Ensure skeleton colors meet contrast ratios against the background, even while animated. Provide a text fallback or label for any data that may fail to load.