16 CSS Fade In Animation Designs 11 / 16
Skew Sweep Fade
Three stat panels slice into frame from the left using skewX(15deg) + translateX(-40px) → skewX(0) — a momentum-carrying diagonal sweep entrance.
The code
<div class="fi-11">
<div class="fi-11__block">
<div class="fi-11__num">847K</div>
<div class="fi-11__stat">Monthly Views</div>
<div class="fi-11__divider"></div>
<div class="fi-11__desc">Panels slice into view from the left with a momentum-carrying skew.</div>
</div>
<div class="fi-11__block">
<div class="fi-11__num">12.3K</div>
<div class="fi-11__stat">Subscribers</div>
<div class="fi-11__divider"></div>
<div class="fi-11__desc">skewX(15deg) creates a dynamic diagonal entry effect.</div>
</div>
<div class="fi-11__block">
<div class="fi-11__num">98%</div>
<div class="fi-11__stat">Satisfaction</div>
<div class="fi-11__divider"></div>
<div class="fi-11__desc">Combined with translateX for a satisfying sweeping entrance.</div>
</div>
</div> <div class="fi-11">
<div class="fi-11__block">
<div class="fi-11__num">847K</div>
<div class="fi-11__stat">Monthly Views</div>
<div class="fi-11__divider"></div>
<div class="fi-11__desc">Panels slice into view from the left with a momentum-carrying skew.</div>
</div>
<div class="fi-11__block">
<div class="fi-11__num">12.3K</div>
<div class="fi-11__stat">Subscribers</div>
<div class="fi-11__divider"></div>
<div class="fi-11__desc">skewX(15deg) creates a dynamic diagonal entry effect.</div>
</div>
<div class="fi-11__block">
<div class="fi-11__num">98%</div>
<div class="fi-11__stat">Satisfaction</div>
<div class="fi-11__divider"></div>
<div class="fi-11__desc">Combined with translateX for a satisfying sweeping entrance.</div>
</div>
</div>.fi-11{
--bg:#0f0a14;--rose:#f43f5e;--pink:#ec4899;--text:#fff1f2;
font-family:'DM Sans',sans-serif;
min-height:340px;border-radius:20px;
display:flex;align-items:center;justify-content:center;gap:20px;flex-wrap:wrap;
padding:40px;overflow:hidden;
}
.fi-11 *,.fi-11 *::before,.fi-11 *::after{box-sizing:border-box;margin:0;padding:0}
.fi-11 ::selection{background:var(--rose);color:#fff}
/* skew + fade: skewX(15deg) translateX(-40px) opacity:0 → skewX(0) translateX(0) opacity:1 */
.fi-11__block{
border-radius:14px;padding:28px 24px;flex:1;min-width:160px;max-width:200px;
opacity:0;transform:skewX(15deg) translateX(-40px);
animation:fi-11-skew-in .7s cubic-bezier(.16,1,.3,1) forwards;
}
.fi-11__block:nth-child(1){--d:.05s;background:linear-gradient(135deg,rgba(244,63,94,.18),rgba(236,72,153,.08));border:1px solid rgba(244,63,94,.25)}
.fi-11__block:nth-child(2){--d:.2s;background:linear-gradient(135deg,rgba(236,72,153,.18),rgba(168,85,247,.08));border:1px solid rgba(236,72,153,.25)}
.fi-11__block:nth-child(3){--d:.35s;background:linear-gradient(135deg,rgba(168,85,247,.18),rgba(99,102,241,.08));border:1px solid rgba(168,85,247,.25)}
.fi-11__block{animation-delay:var(--d)}
.fi-11__block:hover{transform:skewX(0) translateX(0) scale(1.03)!important;transition:transform .25s}
.fi-11__num{
font-family:'Syne',sans-serif;font-size:2.2rem;font-weight:800;
line-height:1;margin-bottom:4px;
}
.fi-11__block:nth-child(1) .fi-11__num{color:var(--rose)}
.fi-11__block:nth-child(2) .fi-11__num{color:var(--pink)}
.fi-11__block:nth-child(3) .fi-11__num{color:#a78bfa}
.fi-11__stat{font-size:.7rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:rgba(255,241,242,.45);margin-bottom:14px}
.fi-11__divider{height:1px;background:rgba(255,255,255,.08);margin-bottom:12px}
.fi-11__desc{font-size:.78rem;color:rgba(255,241,242,.55);line-height:1.5}
@keyframes fi-11-skew-in{
to{opacity:1;transform:skewX(0deg) translateX(0)}
}
@media(prefers-reduced-motion:reduce){
.fi-11 *{animation:none!important;opacity:1!important;transform:none!important}
} .fi-11{
--bg:#0f0a14;--rose:#f43f5e;--pink:#ec4899;--text:#fff1f2;
font-family:'DM Sans',sans-serif;
min-height:340px;border-radius:20px;
display:flex;align-items:center;justify-content:center;gap:20px;flex-wrap:wrap;
padding:40px;overflow:hidden;
}
.fi-11 *,.fi-11 *::before,.fi-11 *::after{box-sizing:border-box;margin:0;padding:0}
.fi-11 ::selection{background:var(--rose);color:#fff}
/* skew + fade: skewX(15deg) translateX(-40px) opacity:0 → skewX(0) translateX(0) opacity:1 */
.fi-11__block{
border-radius:14px;padding:28px 24px;flex:1;min-width:160px;max-width:200px;
opacity:0;transform:skewX(15deg) translateX(-40px);
animation:fi-11-skew-in .7s cubic-bezier(.16,1,.3,1) forwards;
}
.fi-11__block:nth-child(1){--d:.05s;background:linear-gradient(135deg,rgba(244,63,94,.18),rgba(236,72,153,.08));border:1px solid rgba(244,63,94,.25)}
.fi-11__block:nth-child(2){--d:.2s;background:linear-gradient(135deg,rgba(236,72,153,.18),rgba(168,85,247,.08));border:1px solid rgba(236,72,153,.25)}
.fi-11__block:nth-child(3){--d:.35s;background:linear-gradient(135deg,rgba(168,85,247,.18),rgba(99,102,241,.08));border:1px solid rgba(168,85,247,.25)}
.fi-11__block{animation-delay:var(--d)}
.fi-11__block:hover{transform:skewX(0) translateX(0) scale(1.03)!important;transition:transform .25s}
.fi-11__num{
font-family:'Syne',sans-serif;font-size:2.2rem;font-weight:800;
line-height:1;margin-bottom:4px;
}
.fi-11__block:nth-child(1) .fi-11__num{color:var(--rose)}
.fi-11__block:nth-child(2) .fi-11__num{color:var(--pink)}
.fi-11__block:nth-child(3) .fi-11__num{color:#a78bfa}
.fi-11__stat{font-size:.7rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:rgba(255,241,242,.45);margin-bottom:14px}
.fi-11__divider{height:1px;background:rgba(255,255,255,.08);margin-bottom:12px}
.fi-11__desc{font-size:.78rem;color:rgba(255,241,242,.55);line-height:1.5}
@keyframes fi-11-skew-in{
to{opacity:1;transform:skewX(0deg) translateX(0)}
}
@media(prefers-reduced-motion:reduce){
.fi-11 *{animation:none!important;opacity:1!important;transform:none!important}
}How this works
Each panel starts at opacity: 0; transform: skewX(15deg) translateX(-40px). The keyframe animates both to zero, removing the skew as the panel moves into position. The order of transforms matters: skewX before translateX means the translation axis is skewed too — giving the entry a diagonal vector rather than a purely horizontal slide.
The cubic-bezier(.16, 1, .3, 1) strong ease-out makes the skew feel like momentum being shed — the panel arrives fast and skewed, then 'catches itself' and straightens. Hover removes both the skew and translation with a transition override rather than the animation, allowing the resting state to be interactively modified without conflicting with animation-fill-mode: forwards.
Customize
- Reverse skew direction: use
skewX(-15deg) translateX(40px)for a right-to-left entry. - Reduce skew magnitude to
8degfor a subtler tilt — still directional but less dramatic. - Add a delay between panels: increase from
.15ssteps to.25sfor a slower staggered reveal. - Combine with a
translateY(-10px → 0)offset so panels rise and straighten simultaneously.
Watch out for
- The order of
transformfunctions matters:skewX(15deg) translateX(-40px)skews the translation axis, creating a diagonal path. Reversing totranslateX(-40px) skewX(15deg)produces a different visual — the element slides horizontally then straightens. - Using
!importanton hover is necessary becauseanimation-fill-mode: forwardskeeps the final keyframe state locked — without!important, hover transforms are ignored. - Skew animations can cause text to appear distorted during the transition. Adding
-webkit-font-smoothing: antialiasedandtext-rendering: optimizeLegibilityreduces the distortion.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 60+ | 12+ | 60+ | 60+ |
skewX() combined with translateX() in a single transform chain is fully supported