Angenommen, Sie versuchen, einen Designeffekt zu erzielen, bei dem die Ecken eines Elements abgeschnitten sind. Vielleicht sind Sie ein Battlestar Galactica Fan? Oder vielleicht mögen Sie einfach den ungewöhnlichen Effekt, da er nicht wie ein typisches Rechteck aussieht.

Ich vermute, es gibt viele Wege, das zu tun. Sicher, Sie könnten mehrere Hintergründe verwenden, um Bilder in den Ecken zu platzieren. Sie könnten genauso gut eine flexible SVG-Form im Hintergrund verwenden. Ich wette, es gibt auch einen exotischen Weg, um es mit Farbverläufen hinzubekommen.
Aber mir gefällt die Idee, einfach eine Schere zu nehmen und die verdammten Ecken abzuschneiden. Das können wir im Wesentlichen dank clip-path tun. Wir können die Funktion polygon() verwenden, ihr eine Liste von X- und Y-Koordinaten übergeben und alles ausschneiden, was außerhalb davon liegt.
Schauen Sie, was passiert, wenn wir drei Punkte angeben: Mitte oben, unten rechts, unten links.
.module {
clip-path:
polygon(
50% 0,
100% 100%,
0 100%
);
}

Anstatt nur drei Punkte, listen wir alle acht Punkte auf, die für unsere eingekerbten Ecken benötigt werden. Wir könnten Pixel verwenden, aber das wäre gefährlich. Wir kennen wahrscheinlich die Pixelbreite oder -höhe des Elements nicht wirklich. Selbst wenn wir es wüssten, könnte es sich ändern. Hier ist es also mit Prozentangaben
.module {
clip-path:
polygon(
0% 5%, /* top left */
5% 0%, /* top left */
95% 0%, /* top right */
100% 5%, /* top right */
100% 95%, /* bottom right */
95% 100%, /* bottom right */
5% 100%, /* bottom left */
0 95% /* bottom left */
);
}

Das ist in Ordnung, aber bemerken Sie, dass die Einkerbungen keine perfekten 45-Grad-Winkel haben. Das liegt daran, dass das Element selbst kein Quadrat ist. Das verschlimmert sich, je weniger quadratisch das Element ist.
Wir können die Funktion calc() verwenden, um das zu beheben. Wir verwenden Prozentangaben, wenn wir müssen, aber subtrahieren einfach von einer Prozentangabe, um die benötigte Position und den Winkel zu erhalten.
.module {
clip-path:
polygon(
0% 20px, /* top left */
20px 0%, /* top left */
calc(100% - 20px) 0%, /* top right */
100% 20px, /* top right */
100% calc(100% - 20px), /* bottom right */
calc(100% - 20px) 100%, /* bottom right */
20px 100%, /* bottom left */
0 calc(100% - 20px) /* bottom left */
);
}
Und wissen Sie was? Diese Zahl wiederholt sich so oft, dass wir sie genauso gut zu einer Variable machen könnten. Wenn wir die Zahl später jemals aktualisieren müssen, müssen wir sie nur einmal ändern, anstatt all diese einzelnen Male.
.module {
--notchSize: 20px;
clip-path:
polygon(
0% var(--notchSize),
var(--notchSize) 0%,
calc(100% - var(--notchSize)) 0%,
100% var(--notchSize),
100% calc(100% - var(--notchSize)),
calc(100% - var(--notchSize)) 100%,
var(--notchSize) 100%,
0% calc(100% - var(--notchSize))
);
}
Schicken Sie es los.
Siehe den Stift Eingerückte Boxen von Chris Coyier (@chriscoyier) auf CodePen.
Das mag selbstverständlich sein, aber stellen Sie sicher, dass Sie genügend Innenabstand haben, um die Beschneidung zu bewältigen. Wenn Sie es wirklich schick haben möchten, könnten Sie auch CSS-Variablen für Ihren Innenabstand verwenden, sodass je mehr Sie einrücken, desto mehr Innenabstand vorhanden ist.
Aber vielleicht verschicken Sie es nicht sofort? IE/Edge unterstützt clip-path bisher in keiner Version. https://caniuse.com/#search=clip-path
Dann werden die Ecken nicht eingerückt sein, oder? Na ja. Bedeutet nicht, dass Sie es nicht tun sollten.
Wenn Sie die Abmessungen der Box oder zumindest ihr Seitenverhältnis kennen, können Sie dies mit einem rotierten Pseudo-Element hinter dem Textinhalt tun. Ich habe CSS-Variablen verwendet, um den Code DRY zu halten, aber Sie können den vollen Sass-Weg gehen, keine CSS-Variablen verwenden, und dann glaube ich, dass die Unterstützung bis IE9 zurückgehen sollte (habe ich noch nicht getestet).
Wenn wir in die Gegenwart zurückkehren, wenn Sie die Implementierung von Features in Edge beschleunigen möchten, stimmen Sie auf deren Developer Feedback Tracker ab, denn Stimmen zählen. Hier ist die Seite für
clip-path.Gefällt mir der Effekt, aber Sie benötigen Präfixe für Safari. (vielleicht "autoprefixer" in Codepen aktivieren)
Liebe es! Danke
Würde jemand ein Beispiel mit SVG clip-path für eine breitere Browserunterstützung hinzufügen?
Für alle, die nur eine obere rechte Ecke wollen
Schön. Ein echter CSS-Trick auf CSS Tricks. :-)
Gibt es eine Möglichkeit, auch einen Box-Schatten mit diesem Trick zu verwenden? Denn das würde ich nutzen!
Ich schwöre, ich habe es bei meinen ursprünglichen Tests mit
filter: drop-shadow()zum Laufen gebracht, aber jetzt finde ich es nicht mehr. Wenn Sie den Schatten wirklich brauchen, könnte es sich lohnen, andere Möglichkeiten zu prüfen, wie z. B. ein absolut positioniertes und sorgfältig flexibles SVG-Element, das hinter dem Inhalt platziert wird.Filter werden *vor*
clip-pathangewendet. Daher besteht die Lösung im Allgemeinen darin, dendrop-shadow()-Filter auf das übergeordnete Element des beschnittenen Elements anzuwenden.In diesem speziellen Fall würde ich den
backgroundundclip-pathauf ein absolut positioniertes::before-Pseudo-Element setzen, das die gesamte Box abdeckt, und dann denfilterauf die eigentliche Box anwenden.Funktionierende Demo. Was ich geändert habe
position: relativeund einendrop-shadow()-Filter auf die Box gesetztein absolut positioniertes
::beforehinzugefügt, das seine übergeordnete Box abdeckt (top: 0; right: 0; bottom: 0; left: 0;), das ich vor dem Textinhalt anzeigen möchte (z-index: -1)den
backgroundund dieclip-pathauf dieses Pseudo-Element verschobenIch habe vor 7 Jahren darüber geschrieben, wie man das mit Verläufen macht. Funktioniert überall, braucht nicht viel Code und filter: drop-shadow() funktioniert einwandfrei, da die Form nicht beschnitten wird. http://lea.verou.me/2011/03/beveled-corners-negative-border-radius-with-css3-gradients/
Wir arbeiten auch daran, dies über eine corner-shape-Eigenschaft zu CSS hinzuzufügen, aber das Interesse an der Implementierung ist gering.
Dafür ist
corner-shape: bevelda. (notchist anders.)Was ist aus Lea Verous Idee geworden? Sie ist in Level 4 des Specs https://drafts.csswg.org/css-backgrounds-4/#corner-shaping gelandet, aber soweit ich weiß, unterstützt kein Browser das bisher. Can I Use listet es noch nicht auf.
Ich habe versucht, das mit einem transparenten Hintergrund und einem Rahmen zu erreichen. Ich muss vielleicht bei einer Version von SVG bleiben! Irgendwelche Ideen?
Mit
clip-pathwie in diesem Beitrag müssten Sie einen Hintergrund auf einem absolut positionierten Pseudo-Element setzen und den inneren Teil davon mit dieser Technik ausschneiden. Auf diese Weise hätten Sie einen "Rahmen" übrig.Hier ist ein Einzeiler: https://codepen.io/anon/pen/yKMOqm
background: radial-gradient(ellipse, #f06d06 93.7%, rgba(0, 0, 0, 0) 94%);Keine pixelperfekte Lösung.
Eine großartige Ressource, um Ihre Ideen zu gestalten und Spaß mit clip-path zu haben.
http://bennettfeely.com/clippy/
https://jsfiddle.net/frownonline/1hov6jp2/ ::before und ::after haben für mich funktioniert…