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.
Published
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;
}
}Here's a working CSS Fade In Animation Design from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Skew Sweep Fade
Source: https://codefronts.com/motion/css-fade-in-animation/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.
## HTML
```html
<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>
```
## CSS
```css
.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;
}
}
```Here's a working CSS Fade In Animation Design from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Skew Sweep Fade
Source: https://codefronts.com/motion/css-fade-in-animation/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.
## HTML
```html
<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>
```
## CSS
```css
.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.
Make it yours
- 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.
Gotchas — read before shipping
- 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