This creates a skeleton of a card component using CSS custom properties to draw different gradients on the background-image. Skeleton screens can be used to improve perceived performance while loading.
A Pen by Royce Redfearn on CodePen.
This creates a skeleton of a card component using CSS custom properties to draw different gradients on the background-image. Skeleton screens can be used to improve perceived performance while loading.
A Pen by Royce Redfearn on CodePen.
<div class="card"></div> |
/* | |
* Variables | |
*/ | |
:root { | |
--card-padding: 24px; | |
--card-height: 340px; | |
--card-skeleton: linear-gradient(lightgrey var(--card-height), transparent 0); | |
--avatar-size: 32px; | |
--avatar-position: var(--card-padding) var(--card-padding); | |
--avatar-skeleton: radial-gradient(circle 16px at center, white 99%, transparent 0 | |
); | |
--title-height: 32px; | |
--title-width: 200px; | |
--title-position: var(--card-padding) 180px; | |
--title-skeleton: linear-gradient(white var(--title-height), transparent 0); | |
--desc-line-height: 16px; | |
--desc-line-skeleton: linear-gradient(white var(--desc-line-height), transparent 0); | |
--desc-line-1-width:230px; | |
--desc-line-1-position: var(--card-padding) 242px; | |
--desc-line-2-width:180px; | |
--desc-line-2-position: var(--card-padding) 265px; | |
--footer-height: 40px; | |
--footer-position: 0 calc(var(--card-height) - var(--footer-height)); | |
--footer-skeleton: linear-gradient(white var(--footer-height), transparent 0); | |
--blur-width: 200px; | |
--blur-size: var(--blur-width) calc(var(--card-height) - var(--footer-height)); | |
} | |
/* | |
* Card Skeleton for Loading | |
*/ | |
.card { | |
width: 280px; //demo | |
height: var(--card-height); | |
&:empty::after { | |
content:""; | |
display:block; | |
width: 100%; | |
height: 100%; | |
border-radius:6px; | |
box-shadow: 0 10px 45px rgba(0,0,0, .1); | |
background-image: | |
linear-gradient( | |
90deg, | |
rgba(lightgrey, 0) 0, | |
rgba(lightgrey, .8) 50%, | |
rgba(lightgrey, 0) 100% | |
), //animation blur | |
var(--title-skeleton), //title | |
var(--desc-line-skeleton), //desc1 | |
var(--desc-line-skeleton), //desc2 | |
var(--avatar-skeleton), //avatar | |
var(--footer-skeleton), //footer bar | |
var(--card-skeleton) //card | |
; | |
background-size: | |
var(--blur-size), | |
var(--title-width) var(--title-height), | |
var(--desc-line-1-width) var(--desc-line-height), | |
var(--desc-line-2-width) var(--desc-line-height), | |
var(--avatar-size) var(--avatar-size), | |
100% var(--footer-height), | |
100% 100% | |
; | |
background-position: | |
-150% 0, //animation | |
var(--title-position), //title | |
var(--desc-line-1-position), //desc1 | |
var(--desc-line-2-position), //desc2 | |
var(--avatar-position), //avatar | |
var(--footer-position), //footer bar | |
0 0 //card | |
; | |
background-repeat: no-repeat; | |
// animation: loading 1.5s infinite; | |
} | |
} | |
@keyframes loading { | |
to { | |
background-position: | |
350% 0, | |
var(--title-position), | |
var(--desc-line-1-position), | |
var(--desc-line-2-position), | |
var(--avatar-position), | |
var(--footer-position), | |
0 0 | |
; | |
} | |
} | |
/* | |
* Demo Stuff | |
*/ | |
body { | |
min-height:100vh; | |
background-color:#FFF; | |
display:flex; | |
justify-content:center; | |
align-items:center; | |
} |