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
| Function | Axis | Effect | Equivalent |
|---|---|---|---|
skew() | X and/or Y | Slants both axes | skewX() + skewY() |
skewX() | Horizontal | Slants left/right | skew(angle, 0) |
skewY() | Vertical | Slants up/down | skew(0, angle) |
Understanding Skew
Original: skewX(20deg): skewY(20deg):
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ │ │ /│ │ │
│ Element │ │ Element / │ │ Element │
│ │ │ / │ │ │
│ │ │ / │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
Top shifted right Left shifted down
| Skew Type | Effect | Visual |
|---|---|---|
| skewX() | Horizontal slant | Top moves right, bottom stays |
| skewY() | Vertical slant | Left moves down, right stays |
| skew() | Both | Parallelogram 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 */
| Syntax | Effect |
|---|---|
skew(30deg) | Skew X by 30° |
skew(30deg, 20deg) | Skew X by 30°, Y by 20° |
skew(0, 20deg) | Skew Y only |
Angle Units
| Unit | Example | Description |
|---|---|---|
deg | 30deg | Degrees |
grad | 100grad | Gradians (400 = full circle) |
rad | 0.5rad | Radians (2π = full circle) |
turn | 0.25turn | Turns (1 = full circle) |
2. skewX()
The skewX() function skews an element horizontally along the X-axis.
.skewX-box {
transform: skewX(30deg);
}
| Value | Effect |
|---|---|
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);
}
| Value | Effect |
|---|---|
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
| Function | Axis | Effect | Equivalent |
|---|---|---|---|
skew() | X and/or Y | Slants both axes | — |
skewX() | Horizontal | Slants left/right | skew(angle, 0) |
skewY() | Vertical | Slants up/down | skew(0, angle) |
Angle Units
| Unit | Full Circle | Example |
|---|---|---|
deg | 360° | 30deg |
grad | 400 | 100grad |
rad | 2π | 0.5rad |
turn | 1 | 0.25turn |
Common Skew Values
| Value | Effect | Use Case |
|---|---|---|
skewX(10deg) | Subtle slant | Buttons, tags |
skewX(20deg) | Moderate slant | Banners, ribbons |
skewX(30deg) | Strong slant | Dynamic layouts |
skewY(5deg) | Subtle vertical | Card layouts |
skewY(10deg) | Moderate vertical | Section 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!