|

CSS 51 💻 transform skew, skewX, skewY

These transform functions slant or distort elements along the X or Y axis, creating a parallelogram effect. They’re useful for dynamic banners, stylized cards, and geometric layouts.


Overview of Functions

FunctionAxisEffectEquivalent
skew()X and/or YSlants both axesskewX() + skewY()
skewX()HorizontalSlants left/rightskew(angle, 0)
skewY()VerticalSlants up/downskew(0, angle)

Understanding Skew

Original:               skewX(20deg):          skewY(20deg):
┌─────────────┐         ┌─────────────┐         ┌─────────────┐
│             │         │            /│         │             │
│   Element   │         │  Element  / │         │   Element   │
│             │         │          /  │         │             │
│             │         │         /   │         │             │
└─────────────┘         └─────────────┘         └─────────────┘
                        Top shifted right       Left shifted down
Skew TypeEffectVisual
skewX()Horizontal slantTop moves right, bottom stays
skewY()Vertical slantLeft moves down, right stays
skew()BothParallelogram shape

1. skew()

The skew() function applies a 2D skew along both axes.

.skewed-element {
    transform: skew(30deg);
}

Syntax

skew(angle)          /* Skew X only */
skew(xAngle, yAngle) /* Skew X and Y */
SyntaxEffect
skew(30deg)Skew X by 30°
skew(30deg, 20deg)Skew X by 30°, Y by 20°
skew(0, 20deg)Skew Y only

Angle Units

UnitExampleDescription
deg30degDegrees
grad100gradGradians (400 = full circle)
rad0.5radRadians (2π = full circle)
turn0.25turnTurns (1 = full circle)

2. skewX()

The skewX() function skews an element horizontally along the X-axis.

.skewX-box {
    transform: skewX(30deg);
}
ValueEffect
skewX(0deg)No skew
skewX(30deg)Top shifts right by 30°
skewX(-30deg)Top shifts left by 30°
skewX(90deg)Extreme distortion

Equivalent: skew(30deg) or skew(30deg, 0)

Use cases:

  • Slanted banners and ribbons
  • Dynamic card layouts
  • Stylized buttons
  • Perspective-like effects

3. skewY()

The skewY() function skews an element vertically along the Y-axis.

.skewY-box {
    transform: skewY(20deg);
}
ValueEffect
skewY(0deg)No skew
skewY(20deg)Left side shifts down by 20°
skewY(-20deg)Left side shifts up by 20°
skewY(90deg)Extreme distortion

Equivalent: skew(0, 20deg)

Use cases:

  • Diagonal section dividers
  • Slanted headers
  • Stylized quotes
  • Vertical rhythm effects

4. Combining skewX() and skewY()

You can combine both skews for a parallelogram effect.

.combined-skew-box {
    transform: skewX(30deg) skewY(20deg);
}

This creates a shape that’s slanted both horizontally and vertically.


Complete Example

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>transform skew(), skewX(), and skewY()</title>
    <style>
        *, *::before, *::after {
            box-sizing: border-box;
        }

        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            padding: 20px;
            background: #f8f9fa;
            color: #333;
            max-width: 1200px;
            margin: 0 auto;
            line-height: 1.6;
        }

        h1 {
            color: #007bff;
            border-bottom: 3px solid #007bff;
            padding-bottom: 10px;
        }

        h2 {
            color: #28a745;
            border-left: 4px solid #28a745;
            padding-left: 15px;
            margin-top: 30px;
        }

        h3 {
            color: #333;
            margin-top: 20px;
        }

        section {
            background: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
            margin: 20px 0;
        }

        .code-block {
            background: #1e1e1e;
            color: #d4d4d4;
            padding: 15px;
            border-radius: 8px;
            overflow-x: auto;
            font-family: 'Courier New', monospace;
            font-size: 0.9rem;
            line-height: 1.8;
            margin: 10px 0;
        }

        .reference-table {
            width: 100%;
            border-collapse: collapse;
            margin: 15px 0;
        }

        .reference-table th,
        .reference-table td {
            padding: 10px;
            border: 1px solid #ddd;
            text-align: left;
        }

        .reference-table th {
            background: #007bff;
            color: white;
        }

        .reference-table tr:nth-child(even) {
            background: #f8f9fa;
        }

        .note {
            font-size: 0.9rem;
            color: #6c757d;
            margin-top: 5px;
        }

        .highlight {
            background: #ffc107;
            color: #333;
            padding: 2px 6px;
            border-radius: 4px;
            font-weight: bold;
        }

        /* ====== DEMO AREA ====== */
        .demo-area {
            display: flex;
            flex-wrap: wrap;
            gap: 40px;
            justify-content: center;
            align-items: center;
            padding: 50px 20px;
            background: #e9ecef;
            border-radius: 8px;
            margin: 15px 0;
            min-height: 250px;
        }

        .box {
            width: 180px;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
            color: white;
            font-weight: bold;
            font-size: 0.9rem;
            border-radius: 8px;
            transition: transform 0.5s;
            cursor: pointer;
            text-align: center;
            padding: 10px;
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
        }

        .box:hover {
            box-shadow: 0 8px 25px rgba(0, 123, 255, 0.4);
        }

        /* Individual skews */
        .skewX-box {
            background: linear-gradient(135deg, #4CAF50, #2e7d32);
            transform: skewX(30deg);
        }

        .skewX-box:hover {
            transform: skewX(-30deg);
        }

        .skewY-box {
            background: linear-gradient(135deg, #2196F3, #0d47a1);
            transform: skewY(20deg);
        }

        .skewY-box:hover {
            transform: skewY(-20deg);
        }

        .combined-skew-box {
            background: linear-gradient(135deg, #FF5722, #bf360c);
            transform: skewX(30deg) skewY(20deg);
        }

        .combined-skew-box:hover {
            transform: skewX(-30deg) skewY(-20deg);
        }

        /* Skew demo for text */
        .skewed-text {
            width: 200px;
            height: 100px;
            background: linear-gradient(135deg, #6c5ce7, #4a2a9e);
            color: white;
            display: flex;
            align-items: center;
            justify-content: center;
            font-weight: bold;
            border-radius: 8px;
            transform: skew(15deg);
            transition: transform 0.3s;
        }

        .skewed-text:hover {
            transform: skew(-15deg);
        }

        /* Angle comparison */
        .angle-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
            gap: 20px;
            margin: 20px 0;
        }

        .angle-item {
            text-align: center;
            padding: 15px;
            background: #f8f9fa;
            border-radius: 8px;
            border: 2px solid #ddd;
            transition: all 0.3s;
        }

        .angle-item:hover {
            border-color: #007bff;
            box-shadow: 0 4px 15px rgba(0, 123, 255, 0.15);
        }

        .angle-item .demo-box {
            width: 80px;
            height: 60px;
            margin: 0 auto 10px;
            background: linear-gradient(135deg, #28a745, #20c997);
            border-radius: 6px;
            display: flex;
            align-items: center;
            justify-content: center;
            color: white;
            font-size: 0.7rem;
            font-weight: bold;
            transition: transform 0.3s;
        }

        .angle-item .label {
            font-weight: bold;
            font-size: 0.85rem;
            color: #007bff;
        }

        /* Angle unit demo */
        .unit-demo {
            display: flex;
            flex-wrap: wrap;
            gap: 20px;
            justify-content: center;
            margin: 15px 0;
        }

        .unit-box {
            width: 120px;
            height: 80px;
            display: flex;
            align-items: center;
            justify-content: center;
            color: white;
            font-weight: bold;
            font-size: 0.75rem;
            border-radius: 8px;
            background: linear-gradient(135deg, #dc3545, #a71d2a);
            transition: transform 0.3s;
        }

        /* ====== PRACTICAL: SLANTED BANNER ====== */
        .banner-container {
            position: relative;
            padding: 40px 20px;
            background: #e9ecef;
            border-radius: 8px;
            overflow: hidden;
            margin: 15px 0;
        }

        .banner {
            background: linear-gradient(135deg, #007bff, #6c5ce7);
            color: white;
            padding: 30px 50px;
            transform: skewX(-10deg);
            text-align: center;
            font-size: 1.5rem;
            font-weight: bold;
            box-shadow: 0 10px 30px rgba(0, 123, 255, 0.3);
            margin: 0 -20px;
        }

        .banner span {
            display: inline-block;
            transform: skewX(10deg); /* Counter-skew the text */
        }

        /* ====== PRACTICAL: SLANTED CARD ====== */
        .card-container {
            display: flex;
            flex-wrap: wrap;
            gap: 30px;
            justify-content: center;
            margin: 20px 0;
        }

        .slant-card {
            width: 220px;
            height: 280px;
            background: linear-gradient(135deg, #007bff, #6c5ce7);
            border-radius: 16px;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            color: white;
            text-align: center;
            padding: 20px;
            transform: skewY(-5deg);
            transition: all 0.3s;
            box-shadow: 0 8px 25px rgba(0, 123, 255, 0.2);
            cursor: pointer;
        }

        .slant-card:hover {
            transform: skewY(0deg) scale(1.05);
            box-shadow: 0 15px 40px rgba(0, 123, 255, 0.3);
        }

        .slant-card .icon {
            font-size: 2.5rem;
            margin-bottom: 15px;
        }

        .slant-card h4 {
            margin: 0 0 10px 0;
        }

        .slant-card p {
            font-size: 0.85rem;
            opacity: 0.95;
            margin: 0;
        }

        /* ====== PRACTICAL: 3D PERSPECTIVE SKEW ====== */
        .perspective-scene {
            perspective: 800px;
            margin: 20px auto;
            width: 300px;
        }

        .perspective-skew {
            width: 100%;
            padding: 30px;
            background: linear-gradient(135deg, #28a745, #20c997);
            color: white;
            text-align: center;
            font-weight: bold;
            font-size: 1.2rem;
            border-radius: 12px;
            transform: rotateY(20deg) skewY(5deg);
            transition: transform 0.5s;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
            cursor: pointer;
        }

        .perspective-skew:hover {
            transform: rotateY(0deg) skewY(0deg);
        }

        /* ====== TIPS ====== */
        .tip-box {
            padding: 15px;
            border-radius: 8px;
            margin: 10px 0;
            border-left: 4px solid #007bff;
            background: #f8f9fa;
        }

        .tip-box.success { border-left-color: #28a745; }
        .tip-box.warning { border-left-color: #ffc107; }
        .tip-box.danger { border-left-color: #dc3545; }
    </style>
</head>
<body>

    <h1>transform skew(), skewX(), and skewY()</h1>

    <!-- ====== 1. BASIC SKEW FUNCTIONS ====== -->
    <section>
        <h2>1. Basic Skew Functions</h2>
        <p>Hover over each box to see the skew change!</p>

        <div class="demo-area">
            <div class="box skewX-box">skewX(30deg)</div>
            <div class="box skewY-box">skewY(20deg)</div>
            <div class="box combined-skew-box">skewX(30deg)<br>skewY(20deg)</div>
        </div>

        <p class="note"><strong>skewX</strong> slants horizontally. <strong>skewY</strong> slants vertically. Combining both creates a parallelogram.</p>

        <div class="code-block">
            /* Skew horizontally (X-axis) */
            .skewX-box {
                transform: skewX(30deg);
            }

            /* Skew vertically (Y-axis) */
            .skewY-box {
                transform: skewY(20deg);
            }

            /* Combine both skews */
            .combined-skew-box {
                transform: skewX(30deg) skewY(20deg);
            }
        </div>
    </section>

    <!-- ====== 2. ANGLE COMPARISON ====== -->
    <section>
        <h2>2. Skew Angle Comparison</h2>

        <div class="angle-grid">
            <div class="angle-item">
                <div class="demo-box" style="transform: skewX(0deg);">0°</div>
                <div class="label">skewX(0deg)</div>
                <p class="note">No skew</p>
            </div>
            <div class="angle-item">
                <div class="demo-box" style="transform: skewX(15deg);">15°</div>
                <div class="label">skewX(15deg)</div>
                <p class="note">Subtle slant</p>
            </div>
            <div class="angle-item">
                <div class="demo-box" style="transform: skewX(30deg);">30°</div>
                <div class="label">skewX(30deg)</div>
                <p class="note">Moderate slant</p>
            </div>
            <div class="angle-item">
                <div class="demo-box" style="transform: skewX(45deg);">45°</div>
                <div class="label">skewX(45deg)</div>
                <p class="note">Strong slant</p>
            </div>
            <div class="angle-item">
                <div class="demo-box" style="transform: skewX(-30deg);">-30°</div>
                <div class="label">skewX(-30deg)</div>
                <p class="note">Opposite direction</p>
            </div>
        </div>

        <div class="code-block">
            transform: skewX(0deg);   /* No skew */
            transform: skewX(15deg);  /* Subtle slant */
            transform: skewX(30deg);  /* Moderate slant */
            transform: skewX(45deg);  /* Strong slant */
            transform: skewX(-30deg); /* Opposite direction */
        </div>
    </section>

    <!-- ====== 3. ANGLE UNITS ====== -->
    <section>
        <h2>3. Angle Units</h2>
        <p>Skew angles can be specified in different units.</p>

        <div class="unit-demo">
            <div class="unit-box" style="transform: skew(30deg);">30deg</div>
            <div class="unit-box" style="transform: skew(0.05turn);">0.05turn</div>
            <div class="unit-box" style="transform: skew(10grad);">10grad</div>
            <div class="unit-box" style="transform: skew(0.5rad);">0.5rad</div>
        </div>

        <div class="code-block">
            /* Degrees */
            transform: skew(30deg);

            /* Turns (0.05 turn = 18°) */
            transform: skew(0.05turn);

            /* Gradians (10grad = 9°) */
            transform: skew(10grad);

            /* Radians (0.5rad ≈ 28.6°) */
            transform: skew(0.5rad);
        </div>

        <table class="reference-table">
            <tr>
                <th>Unit</th>
                <th>Full Circle</th>
                <th>Example</th>
            </tr>
            <tr>
                <td><code>deg</code></td>
                <td>360°</td>
                <td><code>30deg</code></td>
            </tr>
            <tr>
                <td><code>grad</code></td>
                <td>400</td>
                <td><code>100grad</code></td>
            </tr>
            <tr>
                <td><code>rad</code></td>
                <td>2π</td>
                <td><code>0.5rad</code></td>
            </tr>
            <tr>
                <td><code>turn</code></td>
                <td>1</td>
                <td><code>0.25turn</code></td>
            </tr>
        </table>
    </section>

    <!-- ====== 4. PRACTICAL: SLANTED BANNER ====== -->
    <section>
        <h2>4. Practical Example: Slanted Banner</h2>
        <p>A banner with a slanted design — the text is counter-skewed to stay upright.</p>

        <div class="banner-container">
            <div class="banner">
                <span>🎉 Special Offer! 🎉</span>
            </div>
        </div>

        <div class="code-block">
            .banner {
                transform: skewX(-10deg); /* Slant the banner */
            }

            .banner span {
                transform: skewX(10deg); /* Counter-skew the text */
                display: inline-block;
            }
        </div>

        <p class="note">Use a counter-skew on the text to keep it upright while the background is slanted.</p>
    </section>

    <!-- ====== 5. PRACTICAL: SLANTED CARDS ====== -->
    <section>
        <h2>5. Practical Example: Slanted Cards</h2>
        <p>Hover over each card to straighten it.</p>

        <div class="card-container">
            <div class="slant-card">
                <div class="icon">🚀</div>
                <h4>Fast</h4>
                <p>Lightning-fast performance</p>
            </div>
            <div class="slant-card">
                <div class="icon">🎨</div>
                <h4>Beautiful</h4>
                <p>Stunning design system</p>
            </div>
            <div class="slant-card">
                <div class="icon">🔒</div>
                <h4>Secure</h4>
                <p>Enterprise-grade security</p>
            </div>
        </div>

        <div class="code-block">
            .slant-card {
                transform: skewY(-5deg);
                transition: all 0.3s;
            }

            .slant-card:hover {
                transform: skewY(0deg) scale(1.05);
            }
        </div>
    </section>

    <!-- ====== 6. PRACTICAL: 3D PERSPECTIVE SKEW ====== -->
    <section>
        <h2>6. Practical Example: 3D Perspective Skew</h2>
        <p>Combining skew with rotateY for a 3D perspective effect.</p>

        <div class="perspective-scene">
            <div class="perspective-skew">
                🎯 3D Perspective Skew
            </div>
        </div>

        <div class="code-block">
            .perspective-scene {
                perspective: 800px;
            }

            .perspective-skew {
                transform: rotateY(20deg) skewY(5deg);
                transition: transform 0.5s;
            }

            .perspective-skew:hover {
                transform: rotateY(0deg) skewY(0deg);
            }
        </div>
    </section>

    <!-- ====== 7. REFERENCE TABLES ====== -->
    <section>
        <h2>7. Reference Tables</h2>

        <h3>Skew Functions</h3>
        <table class="reference-table">
            <tr>
                <th>Function</th>
                <th>Axis</th>
                <th>Effect</th>
                <th>Equivalent</th>
            </tr>
            <tr>
                <td><code>skew()</code></td>
                <td>X and/or Y</td>
                <td>Slants both axes</td>
                <td>—</td>
            </tr>
            <tr>
                <td><code>skewX()</code></td>
                <td>Horizontal</td>
                <td>Slants left/right</td>
                <td><code>skew(angle, 0)</code></td>
            </tr>
            <tr>
                <td><code>skewY()</code></td>
                <td>Vertical</td>
                <td>Slants up/down</td>
                <td><code>skew(0, angle)</code></td>
            </tr>
        </table>

        <h3>Angle Units</h3>
        <table class="reference-table">
            <tr>
                <th>Unit</th>
                <th>Full Circle</th>
                <th>Example</th>
            </tr>
            <tr>
                <td><code>deg</code></td>
                <td>360°</td>
                <td><code>30deg</code></td>
            </tr>
            <tr>
                <td><code>grad</code></td>
                <td>400</td>
                <td><code>100grad</code></td>
            </tr>
            <tr>
                <td><code>rad</code></td>
                <td>2π</td>
                <td><code>0.5rad</code></td>
            </tr>
            <tr>
                <td><code>turn</code></td>
                <td>1</td>
                <td><code>0.25turn</code></td>
            </tr>
        </table>

        <h3>Common Skew Values</h3>
        <table class="reference-table">
            <tr>
                <th>Value</th>
                <th>Effect</th>
                <th>Use Case</th>
            </tr>
            <tr>
                <td><code>skewX(10deg)</code></td>
                <td>Subtle slant</td>
                <td>Buttons, tags</td>
            </tr>
            <tr>
                <td><code>skewX(20deg)</code></td>
                <td>Moderate slant</td>
                <td>Banners, ribbons</td>
            </tr>
            <tr>
                <td><code>skewX(30deg)</code></td>
                <td>Strong slant</td>
                <td>Dynamic layouts</td>
            </tr>
            <tr>
                <td><code>skewY(5deg)</code></td>
                <td>Subtle vertical</td>
                <td>Card layouts</td>
            </tr>
            <tr>
                <td><code>skewY(10deg)</code></td>
                <td>Moderate vertical</td>
                <td>Section dividers</td>
            </tr>
        </table>
    </section>

    <!-- ====== 8. BEST PRACTICES ====== -->
    <section>
        <h2>8. Best Practices</h2>

        <div style="background: #d4edda; padding: 20px; border-radius: 8px; border-left: 4px solid #28a745;">
            <h3 style="margin-top: 0; color: #155724;">✅ Do This:</h3>
            <ul>
                <li>Use <code>skewX()</code> for slanted banners and ribbons</li>
                <li>Use <code>skewY()</code> for diagonal section dividers</li>
                <li>Use counter-skew on text to keep it upright</li>
                <li>Combine with other transforms for dynamic effects</li>
                <li>Use subtle angles (5°–20°) for a refined look</li>
                <li>Use <code>transform-origin</code> to control the pivot point</li>
                <li>Respect <code>prefers-reduced-motion</code> for accessibility</li>
            </ul>
        </div>

        <div style="background: #f8d7da; padding: 20px; border-radius: 8px; border-left: 4px solid #dc3545; margin-top: 15px;">
            <h3 style="margin-top: 0; color: #721c24;">❌ Don't Do This:</h3>
            <ul>
                <li>Don't skew text without counter-skewing it (makes it hard to read)</li>
                <li>Don't use extreme angles (90° makes elements invisible)</li>
                <li>Don't overuse skew — it can look chaotic</li>
                <li>Don't forget that skew affects the element's bounding box</li>
                <li>Don't use skew for critical content that must remain readable</li>
            </ul>
        </div>

        <div class="code-block">
            /* Accessibility: respect reduced motion */
            @media (prefers-reduced-motion: reduce) {
                .slant-card:hover {
                    transform: none;
                }
            }

            /* Counter-skew text for readability */
            .banner {
                transform: skewX(-10deg);
            }
            .banner span {
                display: inline-block;
                transform: skewX(10deg);
            }
        </div>
    </section>

</body>
</html>

Quick Reference

FunctionAxisEffectEquivalent
skew()X and/or YSlants both axes
skewX()HorizontalSlants left/rightskew(angle, 0)
skewY()VerticalSlants up/downskew(0, angle)

Angle Units

UnitFull CircleExample
deg360°30deg
grad400100grad
rad0.5rad
turn10.25turn

Common Skew Values

ValueEffectUse Case
skewX(10deg)Subtle slantButtons, tags
skewX(20deg)Moderate slantBanners, ribbons
skewX(30deg)Strong slantDynamic layouts
skewY(5deg)Subtle verticalCard layouts
skewY(10deg)Moderate verticalSection dividers

Best Practices

Do This:

/* Slanted banner with counter-skewed text */
.banner {
    transform: skewX(-10deg);
}
.banner span {
    display: inline-block;
    transform: skewX(10deg);
}

/* Subtle slanted cards */
.card {
    transform: skewY(-3deg);
    transition: transform 0.3s;
}
.card:hover {
    transform: skewY(0deg);
}

/* Combined skew for parallelogram */
.shape {
    transform: skewX(20deg) skewY(10deg);
}

/* Respect reduced motion */
@media (prefers-reduced-motion: reduce) {
    .card:hover {
        transform: none;
    }
}

Don’t Do This:

/* Don't skew text without counter-skewing */
.text {
    transform: skewX(30deg); /* Hard to read! */
}

/* Don't use extreme angles */
.box {
    transform: skewX(90deg); /* Becomes a line! */
}

/* Don't overuse skew */
.everything {
    transform: skewX(20deg) skewY(15deg); /* Chaotic */
}

Pro Tip: skewX() and skewY() are perfect for dynamic, modern designs — slanted banners, ribbons, cards, and section dividers. The key trick is counter-skewing text: if you skew a container by -10deg, skew the text inside by 10deg to keep it upright and readable. Use subtle angles (5°–20°) for a refined look — extreme angles (45°+) can make content unreadable. Remember: skew affects the element’s bounding box, so the element may overflow its container — plan accordingly! And always respect prefers-reduced-motion for users who are sensitive to motion!


Stop using slow, ad-bloated tool sites! 🤮

🔎 Search “KandZ Tools” on Google to use many professional utilities for free.

KandZ.me is the ultimate minimalist hub for:
✅ Finance (Mortgage, Interest, Inflation)
✅ Tech (Base64, JSON, Dev Suite, IP)
✅ Health (BMI, BMR, TDEE)
✅ Productivity (Timer, Workspace, QR)

⚡️ Fast & Private
🔒 No data leaves your device
💎 100% Free

🔗 Use it now: https://tools.kandz.me
🔖 Bookmark it—you’ll need it later!