<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSS Clip-Path: Shaping Web Elements</title> <style> body { font-family: sans-serif; } .container { display: flex; justify-content: center; align-items: center; min-height: 100vh; } .intro-image { width: 500px; height: auto; } .section-title { font-size: 1.5em; font-weight: bold; margin-bottom: 1em; } .code-example { background-color: #f0f0f0; padding: 1em; border-radius: 5px; margin-bottom: 1em; overflow-x: auto; /* Add horizontal scroll if needed */ } .code-example pre { margin: 0; } .image-example { display: flex; justify-content: center; align-items: center; margin-bottom: 2em; } .image-example img { max-width: 100%; height: auto; } .key-takeaway { margin-bottom: 2em; } .key-takeaway ul { list-style-type: disc; padding-left: 20px; } .faq-section { margin-top: 3em; } .faq-section h2 { font-size: 1.8em; font-weight: bold; margin-bottom: 1em; } .faq-section .faq-item { margin-bottom: 1em; } .faq-section .faq-item h3 { font-weight: bold; margin-bottom: 0.5em; } </style> </head> <body> <div class="container"> <img src="/static/imghw/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/174009775169997.jpg" class="lazy" alt="Introducing the CSS clip-path Property " /> </div> <p>The web's predominantly rectangular layout contrasts with print media's diverse shapes. This difference stems partly from a lack of suitable tools. This tutorial introduces <code>clip-path</code>, a CSS property offering the design flexibility of print.</p> <div class="key-takeaway"> <h2>Key Takeaways</h2> <ul> <li><code>clip-path</code> masks parts of an element, exceeding the limitations of the deprecated <code>clip</code> property (rectangular clipping only).</li> <li>It supports basic shapes, geometry boxes, or SVG <code><clippath></code> URLs for complex shapes and animations.</li> <li>Animating <code>clip-path</code> requires matching vertex counts in initial and final shapes for smooth transitions.</li> <li>While not universally supported, major modern browsers (Chrome, Safari, Opera) support <code>clip-path</code> (often with prefixes). Firefox support is partial.</li> </ul> </div> <h2>The Basics</h2> <p>Clipping trims parts of an element, partially or fully hiding it. The <i>clipping path</i> defines the visible region, whether a simple shape or a complex polygon. The <i>clipping region</i> is the area within this path. Anything outside is hidden, including backgrounds, borders, shadows, and events.</p> <p>Even with non-rectangular elements, surrounding content flows naturally. For shape-aware content flow, use the <code>shape-outside</code> property (see related SitePoint tutorial).</p> <p>Remember: <code>clip-path</code> differs from the limited, deprecated <code>clip</code> property.</p> <h2>Syntax and Usage</h2> <p>The syntax is: <code>clip-path: <clip-source> | [<basic-shape> || <geometry-box>] | none</code></p> <ul> <li><code><clip-source></code>: An SVG <code><clippath></code> URL.</li> <li><code><basic-shape></code>: Basic shape functions (CSS Shapes spec).</li> <li><code><geometry-box></code>: (Optional) Reference box for <code><basic-shape></code>, or defines the clipping shape itself (e.g., <code>margin-box</code>).</li> </ul> <div class="code-example"> <pre class="brush:php;toolbar:false"><code>img { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); }
Cela crée un losange. Les coordonnées du sommet (x, y) sont dans le sens horaire, par rapport à la boîte de l'élément.
geometry-box
<code>.clip-me { clip-path: polygon(10% 20%, 20% 30%, 50% 80%) margin-box; margin: 10%; } </code>
Ici, margin-box
est la référence. Les éléments SVG utilisent fill-box
, stroke-box
, ou view-box
.
clip-path
clip-path
Améliore le texte et les images. Les formes complexes sont facilement réalisables.
<code>.p-msg { clip-path: polygon(0% 0%, 100% 0%, 100% 75%, 75% 85%, 75% 100%, 50% 80%, 0% 75%); } </code>
Les galeries d'images et les avatars bénéficient de formes non rectangulaires.
<code>.right { clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%); position: relative; top: -352px; left: 256px; } </code>
animer clip-path
, mais maintiennent des comptes de sommets cohérents pour les transitions en douceur.
<code>@keyframes polygons { 25% { clip-path: polygon(20% 0%, 100% 38%, 70% 90%, 0% 100%); } 50% { clip-path: polygon(0 46%, 100% 15%, 55% 74%, 0 100%); } 70% { clip-path: polygon(100% 38%, 100% 38%, 66% 100%, 0 53%); } } </code>
IE et Edge manquent de soutien. Firefox a un support partiel (url()
syntaxe, potentiellement activé via un drapeau). Le chrome, le safari et l'opéra nécessitent des préfixes -webkit-
. Vérifiez puis-je utiliser pour les dernières informations.
clip-path
offre des possibilités de conception importantes. Des outils comme Clippy et le générateur de chemins de cheminement de CSS Plant simplifient la création de polygones complexes.
clip-path
coupe les parties d'un élément, définissant une région d'affichage. Il accepte les formes de base, les boîtes de géométrie ou les chemins SVG, permettant des formes et des animations complexes.
La fonction polygon()
utilise (x, y) des paires de coordonnées pour définir les sommets d'un polygone. Par exemple, clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)
crée un diamant.
Oui, utilisez des pourcentages dans les paramètres de forme pour la mise à l'échelle avec la taille de l'élément.
Oui, en utilisant des images clés et la propriété animation
. Gardez le nombre de sommets cohérent pour les transitions en douceur.
La plupart des navigateurs modernes le prennent en charge (vérifier que je peux utiliser pour les mises à jour).
circle(radius at position)
crée un cercle. Par exemple, clip-path: circle(50% at 50% 50%)
centre un cercle dans l'élément.
Oui, en utilisant la fonction url()
pour référencer un élément svg <clippath>
.
clip
est obsolète et ne prend en charge que l'écrêtage rectangulaire. clip-path
est beaucoup plus polyvalent.
inset(top right bottom left [round border-radius])
crée un rectangle avec des coins arrondis facultatifs.
Oui, en utilisant la fonction path()
avec la syntaxe du chemin SVG.