Einführung in CSS Clipping
CSS Clipping ermöglicht es Ihnen, sichtbare Bereiche eines Elements zu definieren, während andere Teile verborgen bleiben. Effektiv "clippen" Sie den Inhalt eines Elements innerhalb einer bestimmten Form oder eines Bereichs. Mit Clipping sind Elemente nicht darauf beschränkt, als Rechtecke gerendert zu werden, und können auf visuell ansprechende Weise gestaltet werden. Dieser Leitfaden untersucht die clip-path
-Eigenschaft zusammen mit einigen Beispielen.
CSS Clipping
Clipping ist eine CSS-Technik, die verwendet wird, um Bereiche eines Elements zu clipsen (verbergen) und nur den Bereich des Elements anzuzeigen, der sich innerhalb eines vom Entwickler definierten Pfades befindet. Die Clip-Bereiche werden durch Vektorpfade erstellt; alles im Pfad ist sichtbar, während Bereiche außerhalb des Pfades verborgen sind.
Die clip-path
Eigenschaft
Die clip-path
Eigenschaft wendet das Clipping an. Der Wert, den sie akzeptiert, ist ein Vektorpfad, der den sichtbaren Bereich des Elements definiert. Der Pfad kann mit Boxen, einem Verweis auf einen SVG <clipPath>
oder CSS Formen und Pfaden definiert werden. Im folgenden Beispiel clipsen wir ein blaues Quadrat <div>, indem wir mit der polygon()
Funktion als Clipping-Pfad einen Diamanten erstellen:
.diamond {
height: 200px;
width: 200px;
background-color: blue;
clip-path: polygon(0 50%, 50% 100%, 100% 50%, 50% 0);
}
Mit der clip-path
Eigenschaft können Sie komplexe Formen erstellen, indem Sie ein Element auf ein <basic-shape>
oder auf eine SVG-Quelle clippen. Sie können clip-path
Formen animieren und überblenden, wenn die deklarierten Zustände die gleiche Anzahl von Vektorpunkten haben.
Werte der clip-path
Eigenschaft
Um ein Element visuell zu clippen, wird die clip-path
Eigenschaft entweder auf eine <geometry-box>
, eine url
zu einer <clipPath>
Clip-Quelle oder eine <basic-shape>
erstellt mit Shape Function gesetzt.
Geometrie-Boxen
Die clip-path
Eigenschaft verbirgt alles außerhalb der geclippten Region. Das einfachste Clipping erfolgt über eine Geometrie-Box. Sie können ein Element basierend auf seinem Rand, Rahmen, Padding oder Inhalt clippen. Die Effekte dieser visuellen Box-Werte können durch andere CSS-Eigenschaften erreicht werden, z.B. durch Setzen der border-color
auf transparent und der background-origin
auf die gewünschte visuelle Box. Wir betrachten diese Werte hauptsächlich, weil diese Werte in Verbindung mit den Shape-Funktionen verwendet werden, auf die wir später eingehen werden, um den Ursprung des Shape-Clip-Pfads zu definieren.
Verständnis der Referenzbox, die von CSS-Formen verwendet wird, ist wichtig, wenn clip-path
verwendet wird, insbesondere mit Basic Shapes, da die Referenzbox das Koordinatensystem einer Form definiert.
Visuelle Box-Werte
Dieses Live-Beispiel demonstriert die unterschiedlichen visuellen Box-Werte der clip-path
Eigenschaft an einem Element, während es mit der CSS background-origin
Eigenschaft verglichen wird. Wir haben eine border
, eine background-color
, ein background-image
und padding
auf das <blockquote>
angewendet. Wählen Sie ein Optionsfeld, um den --value
auf einen anderen <geometry-box>
Wert zu aktualisieren, wodurch die background-origin
und die clip-path
aufgelösten Werte aktualisiert werden.
blockquote {
width: 210px;
padding: 20px;
margin: 20px;
border: 20px dashed #dedede;
background-color: #ededed;
background-image: linear-gradient(rebeccapurple, magenta);
background-repeat: no-repeat;
}
.clippath {
background-origin: var(--value);
clip-path: var(--value);
}
.box-model {
background-origin: var(--value);
}
Wenn eine <geometry>
Box in Kombination mit einem <basic-shape>
angegeben wird, definiert der Wert die Referenzbox für das Basisshape. Wenn sie allein spezifiziert wird, verursacht sie, dass die Kanten der spezifizierten Box, einschließlich jeglicher Eckformgebung (wie border-radius
), der Clipping-Pfad sind.
Shape-Ursprung
Das vorherige Beispiel könnte Sie denken lassen, dass die <geometry-box>
Werte nutzlos sind, da Sie background-origin
verwenden können. Und das können Sie. Aber beim Clipping mit Basisshapes definiert die <geometry-box>
, wenn sie zusammen mit einem <basic-shape>
als clip-path
Wert enthalten ist, die Referenzbox für oder den Ursprung dieser Form. Wir können die beiden vorherigen Beispiele kombinieren, um dies zu demonstrieren.
blockquote {
width: 210px;
padding: 20px;
margin: 20px;
border: 20px dashed #dedede;
background-color: #ededed;
background-image: linear-gradient(rebeccapurple, magenta);
background-repeat: no-repeat;
background-origin: border-box;
clip-path: var(--value) polygon(0 50%, 50% 100%, 100% 50%, 50% 0);
}
Für ein weiteres Beispiel siehe clip-path
Shapes und Geometrie-Boxen.
Sogar Werte wie clip-path: margin-box
können nützlich sein. Neben kreativen visuellen Effekten, die durch das Platzieren der Clip-Pfad-Kante am Rand der Margin-Box entstehen, führt jeder berechnete Wert für clip-path
, der nicht none
ist, zur Erzeugung eines neuen Stacking-Kontexts, genauso wie CSS opacity
für Werte, die ungleich 1
sind.
Clipping zu Basisshapes
Die Unterstützung der <basic-shape>
Werte der clip-path
Eigenschaft bietet eine mächtige Möglichkeit, Elemente zu formen. Die verschiedenen Shape-Funktionen ermöglichen das Definieren präziser Clipping-Regionen, wodurch Elemente effektiv in einzigartige Formen skulptiert werden. Die Basisshape-Funktionen umfassen:
Die Größe und Position dieser Formen werden durch den <geometry-box>
Wert definiert, der standardmäßig auf border-box als Referenzbox verwendet wird, wenn der clip-path
Wert eine Form ohne <geometry-box>
Komponente enthält.
Einige dieser Funktionen scheinen nur grundlegende vordefinierte Clipping-Optionen bereitzustellen. Sie scheinen Effekte zu replizieren, die Sie mit border-radius
erzeugen können, aber wenn Sie die border-radius
Eigenschaft im vorherigen Beispiel umgeschaltet haben, haben Sie vielleicht die Stärke von CSS Clipping bemerkt. Formen bieten noch mehr Kontrolle. Zum Beispiel ermöglicht inset()
das Clipping eines Rechtecks mit präzisen Rändern. Die wirkliche Stärke und Kontrolle kommt mit path()
, shape()
und sogar polygon()
, was die Erstellung von benutzerdefinierten Mehrpunktformen ermöglicht.
Erstellen von Polygonen
Mit polygon()
können Sie durch Definieren von Koordinatenpaaren, die jeweils einen Eckpunkt der Form darstellen, komplexe Formen wie Sterne oder abstrakte Figuren erstellen. Die Koordinaten definieren Vektorpunkte, die durch gerade Linien verbunden werden.
Hier verwenden wir die polygon()
Funktion, um einen Stern zu erstellen:
.star {
width: 200px;
height: 200px;
background: linear-gradient(rebeccapurple, magenta) blue;
clip-path: polygon(
50% 0%,
61% 35%,
100% 35%,
68% 57%,
79% 91%,
50% 70%,
21% 91%,
32% 57%,
0% 35%,
39% 35%,
50% 0%
);
}
Animation
Geclippte Formen können animiert und überblendet werden, indem die gleiche Anzahl von Vektorpunkten für die verschiedenen Zustände deklariert wird.
@keyframes morphStar {
from {
clip-path: polygon(
50% 0%,
61% 35%,
100% 35%,
68% 57%,
79% 91%,
50% 70%,
21% 91%,
32% 57%,
0% 35%,
39% 35%,
50% 0%
);
}
to {
clip-path: polygon(
50% 10%,
65% 30%,
90% 20%,
75% 60%,
85% 95%,
50% 80%,
15% 95%,
25% 60%,
10% 20%,
35% 30%,
50% 10%
);
}
}
.star {
animation: morphStar alternate 3s infinite ease-in-out;
}
Die path()
Funktion
Die path()
Funktion ermöglicht das Zeichnen von Formen mit SVG-Befehlen. Die Funktion akzeptiert das Äquivalent des SVG d
Attributs als Parameter der Funktion.
Der Stern aus dem vorherigen Beispiel kann mit path()
erstellt werden:
.star {
width: 200px;
height: 200px;
background: linear-gradient(rebeccapurple, magenta) blue;
clip-path: path(
"M100,0 L122,70 L200,70 L136,114 L158,182 L100,140 L42,182 L64,114 L0,70 L78,70 L100,0 Z"
);
}
Gebogene Linien
Mit path()
sind wir nicht nur auf gerade Linien beschränkt. In diesem Beispiel verwenden wir die path()
Funktion, um ein Herz zu erstellen:
.heart {
width: 200px;
height: 200px;
background: linear-gradient(rebeccapurple, magenta) blue;
clip-path: path(
"M20,70 A40,40,0,0,1,100,70 A40,40,0,0,1,180,70 Q180,130,100,190 Q20,130,20,70 Z"
);
}
SVG als Quelle
Anstelle eines SVG d
Attribut-Strings als Argument der path()
Funktion kann der Wert der clip-path
Eigenschaft direkt auf das SVG <clipPath>
Element verweisen.
<div class="heart"></div>
<svg height="0" width="0">
<clipPath id="heart">
<path
d="M20,70 A40,40,0,0,1,100,70 A40,40,0,0,1,180,70 Q180,130,100,190 Q20,130,20,70 Z" />
</clipPath>
</svg>
Die id
des <clipPath>
ist das Parameter der url()
Funktion.
.heart {
width: 200px;
height: 200px;
background: linear-gradient(rebeccapurple, magenta) blue;
clip-path: url("#heart");
}
Shape Function
Die SVG-Pfad-Syntax ist nicht die intuitivste. Aus diesem Grund bietet CSS auch eine shape()
Funktion. Die shape()
Funktion nimmt auch Pfaddirektiven an, aber mit einer Syntax, die lesbarer ist. Wir können das Herz mit mehr deklarativem CSS neu erstellen:
.heart {
clip-path: shape(
from 20px 70px,
arc to 100px 70px of 1% cw,
arc to 180px 70px of 1% cw,
curve to 100px 190px with 180px 130px,
curve to 20px 70px with 20px 130px
);
}
Die shape()
Funktion ist robuster, da sie CSS-Werte und Einheiten akzeptiert (path()
ist auf Koordinaten beschränkt), einschließlich der Verwendung von CSS-Mathematikfunktionen wie calc()
. Durch die Verwendung von Variablen können wir Formen (und Boxen) in vielen verschiedenen Größen erstellen:
:root {
--m: 10;
}
.heart {
width: calc(20px * var(--m));
height: calc(20px * var(--m));
display: inline-block;
background: linear-gradient(rebeccapurple, magenta) blue;
clip-path: border-box
shape(
from calc(2px * var(--m)) calc(7px * var(--m)),
arc to calc(10px * var(--m)) calc(7px * var(--m)) of 1% cw,
arc to calc(18px * var(--m)) calc(7px * var(--m)) of 1% cw,
curve to calc(10px * var(--m)) calc(19px * var(--m)) with
calc(18px * var(--m)) calc(13px * var(--m)),
curve to calc(2px * var(--m)) calc(7px * var(--m)) with
calc(2px * var(--m)) calc(13px * var(--m))
);
}
.small {
--m: 4;
}
.medium {
--m: 8;
}
.large {
--m: 12;
}
<div class="heart small"></div>
<div class="heart medium"></div>
<div class="heart large"></div>
Text um Ihre geclippten Formen herumfließen lassen
Geclippte Elemente sind weiterhin rechteckige Kästen. Clipping bedeutet, dass Ihr Element nicht wie ein Kasten aussieht; es ist jedoch immer noch ein Kasten. Um Inline-Inhalt um die nicht-rechteckigen (oder rechteckigen) Formen, die Sie definieren, fließen zu lassen, verwenden Sie die shape-outside
Eigenschaft. Standardmäßig fließt Inline-Inhalt um seine Margin-Box; shape-outside
bietet eine Möglichkeit, dieses Fließen anzupassen, sodass es möglich ist, Text um die von Ihnen geclippten Elemente fließen zu lassen, indem Sie dem Clip-Pfad folgen, den Sie repliziert haben, anstatt der rechteckigen Box des Elements.
Der Inhalt umfasst zwei Elemente, die geclippt werden, und den Inhalt, der um sie herum geformt wird.
<div class="leftTriangle"></div>
<div class="rightTriangle"></div>
<blockquote>
<q>
I've learned that people will forget what you said, people will forget what
you did, but people will never forget how you made them feel.</q
>
<cite>— Maya Angelou</cite>
</blockquote>
Zusätzlich zur Anwendung der gleichen Form sowohl für die clip-shape
als auch die shape-outside
Eigenschaften muss das geclippte Element gefloatet werden, damit es sich auf derselben Linie wie der Inhalt befindet.
.leftTriangle {
clip-path: polygon(0 0, 0 100%, 100% 0);
shape-outside: polygon(0 0, 0 100%, 100% 0);
float: left;
}
.rightTriangle {
clip-path: polygon(100% 0, 100% 100%, 0 100%);
shape-outside: polygon(100% 0, 100% 100%, 0 100%);
float: right;
}