Creative shapes, diagonal cuts and animations
Rectangles and border-radius are not the only shapes available in the Tailwind design space. With clip-path you can define polygons, circles, diagonal cuts and complex masks directly in CSS, without SVG wrappers, without JavaScript, and with animation support through simple CSS transitions.
Table of Contents
- 1. What is clip-path and why Tailwind?
- 2. clip-path syntax: polygon(), circle(), ellipse(), inset()
- 3. Arbitrary values in Tailwind for clip-path
- 4. Hero diagonal cuts: pages with diagonal dividers
- 5. Creative image masks with clip-path
- 6. clip-path animations with Tailwind transitions
- 7. CSS custom properties for dynamic shapes
- 8. Browser support and fallbacks
- 9. clip-path shapes compared
- 10. Summary
- 11. FAQ
1. What is clip-path and why Tailwind?
The CSS property clip-path defines a clipping region for an element: everything inside the region is visible, everything outside it is hidden. This lets you create arbitrary shapes from rectangular HTML elements, without SVG elements in the markup, without JavaScript calculations, and without absolute positioning tricks using covering pseudo-elements. Tailwind CSS clip-path is used via the arbitrary value system: clip-path-[polygon(0_0,100%_0,100%_80%,0_100%)] writes the value directly into a generated class.
The advantage over SVG-based shape design lies in maintainability: clip-path lives directly in the HTML attribute and is part of the normal Tailwind workflow. Color, size and background of the clipped element remain fully controlled by Tailwind. And clip-path is animatable. If both states (before and after hover) have the same number of polygon points, the browser can interpolate between them, which enables shape transitions via CSS transition without any JavaScript. That makes Tailwind CSS clip-path one of the most interesting tools for creative frontend design without framework overhead.
2. clip-path syntax: polygon(), circle(), ellipse(), inset()
The clip-path CSS function has four main forms: polygon() for polygons, circle() for circles, ellipse() for ovals and inset() for rectangular cutouts with an optional radius. polygon() is the most flexible: it takes a list of X-Y coordinate pairs that can be given as percentage or pixel values. polygon(0 0, 100% 0, 100% 85%, 0 100%) defines a quadrilateral whose bottom edge runs diagonally, the classic diagonal cut for hero sections. Each coordinate pair is a point of the polygon; the shape is formed by connecting the points in order.
circle(50%) clips the element to a circle in the middle with a radius of 50% of the smaller dimension. circle(50% at 30% 50%) shifts the circle's center to 30% from the left and 50% from the top, useful for unusual image crops or off-center overlays. inset(10px 20px 30px 40px round 16px) clips a rectangular inner area with individual offsets and border radius, an alternative method to border-radius that also interacts with animations. Understanding these four functions covers 95% of all practical clip-path use cases in real projects.
/* clip-path shape reference with Tailwind CSS v4 */
/* Diagonal cut hero section, bottom-right stays, bottom-left rises */
.hero-diagonal {
clip-path: polygon(0 0, 100% 0, 100% 85%, 0 100%);
}
/* Opposite diagonal, creates wave-like page transition */
.hero-diagonal-reverse {
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 88%);
}
/* Hexagon, 6-point polygon for icon backgrounds */
.hex {
clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%);
}
/* Arrow right, for CTA blocks and step indicators */
.arrow-right {
clip-path: polygon(0 0, 85% 0, 100% 50%, 85% 100%, 0 100%);
}
/* Circle clip, for avatar images and icon overlays */
.circle-clip {
clip-path: circle(50% at center);
}
/* Inset with rounded corners, alternative to border-radius */
.inset-clip {
clip-path: inset(0 0 15% 0 round 24px 24px 0 0);
}
3. Arbitrary values in Tailwind for clip-path
Tailwind CSS v4 supports clip-path natively via the arbitrary value system: clip-path-[polygon(0_0,100%_0,100%_85%,0_100%)]. Important detail: spaces in Tailwind classes are replaced by underscores (0_0 instead of 0 0). Percent signs, parentheses and commas are usable directly. For frequently used shapes it is recommended to define them as named utilities in the Tailwind configuration or in the @layer utilities block, instead of scattering long arbitrary value strings across the entire template.
In Tailwind CSS v4 with the CSS-first approach, custom utilities are defined directly in the CSS file: @utility clip-diagonal { clip-path: polygon(0 0, 100% 0, 100% 85%, 0 100%); }. The result is a clean, semantic class clip-diagonal used in the template instead of an unreadable 60-character arbitrary value string. This abstraction makes the HTML code more maintainable and helps code reviews immediately understand the designer's intent. This convention especially pays off in Hyva projects with many phtml templates.
4. Hero diagonal cuts: pages with diagonal dividers
The hero diagonal cut is the most popular practical use of clip-path in web projects. Instead of a standard rectangular section, the hero area gets a diagonal bottom edge that makes it look visually more dynamic and guides the user's scroll flow. Implementation in Tailwind: [clip-path:polygon(0_0,100%_0,100%_88%,0_100%)] on the hero container. The bottom padding must be increased accordingly (pb-24 sm:pb-32) so the content is not cut off by the diagonal.
Two consecutive diagonal sections can create a wave effect: the first section has polygon(0 0, 100% 0, 100% 88%, 0 100%), the second polygon(0 5%, 100% 0, 100% 100%, 0 100%). The top notch of the second section overlaps with the diagonal of the first, resulting in a seamless, dynamic dividing line between the sections. For this to work visually, the second section needs a negative margin-top or absolute positioning to close the calculated gap between the polygons. In Tailwind: -mt-12 sm:-mt-20 on the second section.
/* Reusable diagonal section utilities, defined in @layer utilities */
@layer utilities {
/* Hero diagonal, bottom edge cuts from top-right to bottom-left */
.clip-diagonal-down {
clip-path: polygon(0 0, 100% 0, 100% 88%, 0 100%);
padding-bottom: clamp(4rem, 8vw, 8rem);
}
/* Opposite diagonal, next section picks up visually */
.clip-diagonal-up {
clip-path: polygon(0 0, 100% 5%, 100% 100%, 0 100%);
padding-top: clamp(4rem, 8vw, 8rem);
margin-top: -4rem;
}
/* Arrow-down chevron, points downward at section bottom */
.clip-chevron-down {
clip-path: polygon(0 0, 100% 0, 100% 80%, 50% 100%, 0 80%);
padding-bottom: clamp(5rem, 10vw, 10rem);
}
}
5. Creative image masks with clip-path
Image masks are another strong application area for Tailwind CSS clip-path. Instead of a rectangular image with rounded corners, you can clip product images, portrait photos and hero images into arbitrary shapes. A hexagon mask for a team photo: clip-path: polygon(50% 0%, 100% 25%, 100% 75%, 50% 100%, 0% 75%, 0% 25%). The image itself is a normal img element with object-cover; the clip-path cuts it into shape.
For a parallax-like effect layout, combining an image clip mask with scroll animation works well. The clip area stays static while the image underneath it (via object-position or a slight transform) scrolls. This creates the impression of looking through a window into another world. In Alpine.js you can set object-position dynamically based on the scroll position: x-bind:style="'object-position: center ' + (scrollY * 0.3) + 'px'". Combined with a clip-path polygon that defines an interesting viewing pane, this produces dynamic hero images without needing a JavaScript library.
6. clip-path animations with Tailwind transitions
The animatability of clip-path is the game changer for creative frontend design. If the starting and target shapes have the same number of polygon points, the browser interpolates the coordinates, resulting in a smooth shape transition via CSS transition. In Tailwind: transition-[clip-path] duration-500 ease-in-out on the element, then different clip-path values for the normal and hover state. The browser handles the animation without JavaScript.
A classic example: a button hover effect where a colored area sweeps "from left to right" over the button. Normal state: clip-path: polygon(0 0, 0 0, 0 100%, 0 100%), the area is collapsed to zero width. Hover state: clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%), the full width. With transition-[clip-path] duration-300 an elegant wipe effect emerges. The animated area is an absolutely positioned pseudo-element or a div with a negative z-index; the clip-path animation happens on this layer, not on the button itself.
<!-- Animated clip-path reveal on hover, no JavaScript needed -->
<div class="relative inline-flex overflow-hidden rounded-xl group">
<!-- Animated fill layer, clips from left to right on hover -->
<div
class="
absolute inset-0 bg-sky-600
transition-[clip-path] duration-400 ease-in-out
[clip-path:polygon(0_0,0_0,0_100%,0_100%)]
group-hover:[clip-path:polygon(0_0,100%_0,100%_100%,0_100%)]
"
aria-hidden="true"
></div>
<!-- Button content, stays on top of fill layer -->
<a
href="/contact"
class="relative z-10 inline-flex items-center gap-2 px-6 py-3 font-semibold text-sm
text-sky-700 group-hover:text-white transition-colors duration-400"
>
Get started now
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"/>
</svg>
</a>
</div>
7. CSS custom properties for dynamic shapes
CSS Custom Properties (CSS variables) can be used inside clip-path values, which enables dynamic shapes that can be changed via JavaScript or Alpine.js. Example: a card whose clip-path angle is controlled by a CSS variable: clip-path: polygon(0 0, 100% 0, 100% calc(100% - var(--clip-bottom)), 0 100%). Via Alpine.js you set --clip-bottom to a scroll-dependent value, and the card shape changes smoothly.
In Tailwind CSS v4 with the CSS-first approach, such variables are defined in the theme file: @theme { --clip-hero-angle: 88%; }. This variable is then available throughout the project via var(--clip-hero-angle) and can be adjusted centrally on brand changes. Especially useful: if the design agency changes the standard diagonal cut angle from 88% to 92%, a single change in the theme file is enough, all diagonal sections in the project update automatically. This approach combines the creative freedom of clip-path with the maintainability of a token-based design system.
8. Browser support and fallbacks
clip-path is fully supported in all modern browsers: Chrome, Firefox, Safari, Edge, all current versions implement the specification correctly. That means for the vast majority of web projects in 2026: no polyfill needed, no vendor prefix (-webkit- is no longer required for current Safari versions). Browser support for the animated form of clip-path (polygon-to-polygon transition) is also fully present in modern browsers.
Fallbacks are mainly relevant for very old browsers or specific embedded WebViews. The progressive enhancement approach for clip-path: without clip-path, the element has a normal rectangular shape with a background color, functionally correct but without the creative shape. With @supports (clip-path: polygon(0 0)) you can activate the enhanced state. In practice this @supports block is rarely needed, since even Tailwind CSS v3 projects use clip-path widely without reporting browser compatibility issues. One exception: the older url() syntax for SVG-based masks has quirky browser support and should be replaced with polygon() or path().
9. clip-path shapes compared
The four basic clip-path functions have different strengths, weaknesses and use cases. Choosing the right function affects both the visual effect and the animatability of the shape.
| Function | Strength | Animatable | Typical use |
|---|---|---|---|
| polygon() | Arbitrary polygons, maximum flexibility | Yes (same point count) | Diagonal cuts, hero, arrow shapes |
| circle() | Simple circle, parametric | Yes (radius + position) | Avatars, reveal animations |
| ellipse() | Ovals, asymmetric circles | Yes | Blob shapes, organic forms |
| inset() | Rectangular with radius, precise | Yes | Alternative to border-radius |
| path() | Arbitrary SVG paths, curves | Limited | Complex organic shapes |
For most practical uses in production projects, polygon() is the first choice. It is maximally flexible, fully animatable and implemented identically across all modern browsers. circle() and ellipse() complement it for round shapes. path(), although powerful for SVG-complex shapes, is less maintainable and has limited animatability, which is why it is used less often in Tailwind CSS clip-path projects.
Mironsoft
Creative Tailwind frontends for Hyva Magento 2 themes
Creative page shapes and animations for your project?
We implement clip-path, creative shape transitions and animated hero sections for Hyva themes on Magento 2, with Tailwind CSS v4, Alpine.js and full performance optimization.
Creative design
Hero sections, diagonal cuts, image masks and animated transitions with clip-path
Hyva integration
Integrate clip-path seamlessly into existing Hyva themes and phtml templates
Performance
clip-path runs on the GPU compositor, no layout recalculations, no CLS issues
10. Summary
Tailwind CSS clip-path opens up a creative design space beyond rectangles and border-radius. polygon() is the most versatile function: it covers diagonal cuts, arrow shapes, hexagons and more complex polygons. Animatability with equal point counts is the decisive advantage over SVG masks: CSS transitions are enough for smooth shape transitions, no JavaScript needed. CSS custom properties turn clip-path shapes into design tokens that can be maintained centrally in the theme file.
The most important convention for production projects: define frequently used clip-path values as named utilities in the @layer utilities block. This prevents unreadable arbitrary value strings in template code and makes the designer's intent immediately recognizable to every developer. Browser support is no longer a problem, clip-path runs correctly and efficiently on the GPU compositor in all modern browsers.
Tailwind CSS clip-path: the essentials at a glance
Base functions
polygon() for polygons, circle() for circles, ellipse() for ovals, inset() for rectangles. polygon() covers 80% of all use cases.
Animation
transition-[clip-path] duration-300 is enough for shape transitions. Equal point count in the before and after state is a prerequisite for browser interpolation.
Tailwind integration
Arbitrary values for one-off cases. Named @layer utilities for frequent shapes. CSS custom properties for design-token-based shapes.
Performance
clip-path does not trigger a layout reflow, it operates on the compositing layer. Ideal for animated hero sections without CLS risk.