Inhalt um benutzerdefinierte Pfade umbrechen
Lange Zeit waren Webdesigner gezwungen, innerhalb der Grenzen des Rechtecks zu gestalten. Die meisten Inhalte im Web sind immer noch in einfachen Boxen gefangen, weil die meisten kreativen Versuche, ein nicht rechteckiges Layout zu erstellen, in Frustration enden. Das wird sich mit der Einführung von CSS-Formen ändern, die ab Chrome 37 verfügbar sind. Mit CSS-Formen können Webdesigner Inhalte um benutzerdefinierte Pfade wie Kreise, Ellipsen und Polygone herum anordnen und so die Einschränkungen des Rechtecks überwinden.
Formen können manuell definiert oder aus Bildern abgeleitet werden.
Sehen wir uns ein ganz einfaches Beispiel an.
Vielleicht waren Sie so naiv wie ich, als Sie zum ersten Mal ein Bild mit transparenten Teilen eingefügt haben, und haben erwartet, dass der Inhalt die Lücken füllt. Sie wurden dann aber enttäuscht, weil die rechteckige Form um das Element herum bestehen blieb. Dieses Problem lässt sich mit CSS-Formen lösen.
<img class="element" src="image.png" />
<p>Lorem ipsum…</p>
<style>
.element{
shape-outside: url(image.png);
shape-image-threshold: 0.5;
float: left;
}
</style>
Die CSS-Deklaration shape-outside: url(image.png) weist den Browser an, eine Form aus dem Bild zu extrahieren.
Mit dem Attribut shape-image-threshold wird die Mindestdeckkraft von Pixeln definiert, die zum Erstellen der Form verwendet werden. Der Wert muss im Bereich zwischen 0.0 (vollständig transparent) und 1.0 (vollständig deckend) liegen. shape-image-threshold: 0.5 bedeutet also, dass nur Pixel mit einer Deckkraft von mindestens 50 % zum Erstellen der Form verwendet werden.
Das Attribut float ist hier entscheidend. Die Property shape-outside definiert zwar die Form des Bereichs, um den der Inhalt umbrochen wird, aber ohne die Float-Property sind die Auswirkungen der Form nicht sichtbar.
Elemente haben einen Float-Bereich auf der gegenüberliegenden Seite ihres float-Werts. Wenn beispielsweise ein Element mit dem Bild einer Kaffeetasse links angeordnet wird, wird der Float-Bereich rechts neben der Tasse erstellt. Auch wenn Sie ein Bild mit Lücken auf beiden Seiten erstellen können, wird der Inhalt nur auf der gegenüberliegenden Seite, die durch die Float-Eigenschaft festgelegt ist, um die Form herumgeführt, also links oder rechts, aber nie auf beiden Seiten.
In Zukunft wird es möglich sein, shape-outside für Elemente zu verwenden, die nicht mit der Einführung von CSS-Ausschlüssen verschoben werden.
Formen manuell erstellen
Sie können Formen nicht nur aus Bildern extrahieren, sondern auch manuell codieren. Sie können aus einigen funktionalen Werten wählen, um Formen zu erstellen: circle(), ellipse(), inset() und polygon(). Jede Formfunktion akzeptiert eine Reihe von Koordinaten und wird mit einer Referenzbox kombiniert, die das Koordinatensystem festlegt. Mehr zu Referenzfeldern gleich.
Die Funktion circle()
Die vollständige Notation für einen Kreisformwert ist circle(r at cx cy), wobei r der Radius des Kreises ist und cx und cy die Koordinaten des Kreismittelpunkts auf der X- und Y-Achse sind. Die Koordinaten für den Kreismittelpunkt sind optional. Wenn Sie sie weglassen, wird die Mitte des Elements (der Schnittpunkt seiner Diagonalen) als Standard verwendet.
.element{
shape-outside: circle(50%);
width: 300px;
height: 300px;
float: left;
}
Im obigen Beispiel wird der Inhalt um die Außenseite eines kreisförmigen Pfads herumgeführt. Das einzelne Argument 50% gibt den Radius des Kreises an, der in diesem Fall der Hälfte der Breite oder Höhe des Elements entspricht. Wenn Sie die Abmessungen des Elements ändern, wirkt sich das auf den Radius der Kreisform aus. Dies ist ein einfaches Beispiel dafür, wie CSS-Formen responsiv sein können.
Bevor wir fortfahren, ein kurzer Hinweis: Es ist wichtig, daran zu denken, dass CSS-Formen nur die Form des Float-Bereichs um ein Element herum beeinflussen. Wenn das Element einen Hintergrund hat, wird dieser nicht durch die Form abgeschnitten. Um diesen Effekt zu erzielen, müssen Sie Eigenschaften aus CSS Masking verwenden – entweder clip-path oder mask-image. Die Property clip-path ist sehr praktisch, da sie dieselbe Notation wie CSS-Formen verwendet. Sie können also Werte wiederverwenden.
In den Abbildungen in diesem Dokument wird Clipping verwendet, um die Form hervorzuheben und die Effekte zu verdeutlichen.
Zurück zur Kreisform.
Wenn Sie Prozentwerte für den Kreisradius verwenden, wird der Wert tatsächlich mit einer etwas komplexeren Formel berechnet: sqrt(width^2 + height^2) / sqrt(2). Das ist hilfreich, um sich vorzustellen, wie die resultierende Kreisform aussieht, wenn die Abmessungen des Elements nicht gleich sind.
Alle CSS-Einheitentypen können in den Koordinaten der Formfunktion verwendet werden – px, em, rem, vw, vh usw. Sie können die Option auswählen, die flexibel oder starr genug für Ihre Anforderungen ist.
Sie können die Position des Kreises anpassen, indem Sie explizite Werte für die Koordinaten des Mittelpunkts festlegen.
.element{
shape-outside: circle(50% at 0 0);
}
Dadurch wird der Mittelpunkt des Kreises am Ursprung des Koordinatensystems positioniert. Was ist das Koordinatensystem? Hier kommen Referenzboxen ins Spiel.
Referenzboxen für CSS-Formen
Das Referenzfeld ist ein virtuelles Feld um das Element, das das Koordinatensystem zum Zeichnen und Positionieren der Form festlegt. Der Ursprung des Koordinatensystems befindet sich in der oberen linken Ecke. Die X-Achse zeigt nach rechts und die Y-Achse nach unten.
Denken Sie daran, dass shape-outside die Form des Float-Bereichs ändert, um den der Inhalt umbrochen wird. Der Float-Bereich erstreckt sich bis zu den äußeren Rändern des Felds, das durch die Property margin definiert wird. Dies wird als margin-box bezeichnet und ist die Standardreferenzbox für eine Form, wenn keine explizit angegeben ist.
Die folgenden beiden CSS-Deklarationen haben identische Ergebnisse:
.element{
shape-outside: circle(50% at 0 0);
/* identical to: */
shape-outside: circle(50% at 0 0) margin-box;
}
Wir haben noch keinen Außenabstand für das Element festgelegt. An dieser Stelle können wir davon ausgehen, dass sich der Ursprung des Koordinatensystems und der Kreismittelpunkt in der oberen linken Ecke des Inhaltsbereichs des Elements befinden. Das ändert sich, wenn Sie einen Rand festlegen:
.element{
shape-outside: circle(50% at 0 0) margin-box;
margin: 100px;
}
Der Ursprung des Koordinatensystems liegt jetzt außerhalb des Inhaltsbereichs des Elements (100 px nach oben und 100 px nach links), ebenso wie der Kreismittelpunkt. Der berechnete Wert des Kreisradius wird ebenfalls erhöht, um die größere Fläche des Koordinatensystems zu berücksichtigen, das durch die Referenzbox margin-box festgelegt wird.
Mit einer shape-outside-Deklaration kann jeweils nur eine Referenzbox verwendet werden. Jede Referenzbox beeinflusst die Form auf unterschiedliche und manchmal subtile Weise. In einem anderen Artikel wird näher auf Referenzboxen für CSS-Formen eingegangen.
Die Funktion ellipse()
Ellipsen sehen aus wie zusammengedrückte Kreise. Sie sind als ellipse(rx ry at cx cy) definiert, wobei rx und ry die Radien für die Ellipse auf der X- und Y-Achse sind, während cx und cy die Koordinaten für den Mittelpunkt der Ellipse sind.
.element{
shape-outside: ellipse(150px 300px at 50% 50%);
width: 300px;
height: 600px;
}
Prozentwerte werden anhand der Dimensionen des Koordinatensystems berechnet. Hier ist keine komplizierte Mathematik erforderlich. Sie können die Koordinaten für den Mittelpunkt der Ellipse weglassen. Sie werden dann vom Mittelpunkt des Koordinatensystems abgeleitet.
Radien auf der X- und Y-Achse können auch mit Schlüsselwörtern definiert werden: farthest-side ergibt einen Radius, der dem Abstand zwischen dem Mittelpunkt der Ellipse und der am weitesten entfernten Seite des Referenzfelds entspricht, während closest-side das genaue Gegenteil bedeutet – es wird der kürzeste Abstand zwischen dem Mittelpunkt und einer Seite verwendet.
.element{
shape-outside: ellipse(closest-side farthest-side at 50% 50%);
/* identical to: */
shape-outside: ellipse(150px 300px at 50% 50%);
width: 300px;
height: 600px;
}
Das kann nützlich sein, wenn sich die Abmessungen des Elements (oder der Referenzbox) auf unvorhersehbare Weise ändern, die Ellipsenform sich aber anpassen soll.
Dieselben Schlüsselwörter farthest-side und closest-side können auch für den Radius in der Formfunktion circle() verwendet werden.
Die Funktion polygon()
Wenn Kreise und Ellipsen zu einschränkend sind, bietet die Polygonformfunktion eine Vielzahl von Optionen. Das Format ist polygon(x1 y1, x2 y2, ...), wobei Sie für jeden Eckpunkt (Punkt) eines Polygons Paare von x- und y-Koordinaten angeben. Die Mindestanzahl von Paaren, die ein Polygon definieren, ist drei (ein Dreieck).
.element{
shape-outside: polygon(0 0, 0 300px, 300px 600px);
width: 300px;
height: 600px;
}
Die Eckpunkte werden im Koordinatensystem platziert. Bei responsiven Polygonen können Sie für einige oder alle Koordinaten Prozentwerte verwenden.
.element{
/* polygon responsive to font-size*/
shape-outside: polygon(0 0, 0 100%, 100% 100%);
width: 20em;
height: 40em;
}
Es gibt einen optionalen fill-rule-Parameter, der aus SVG importiert wird und dem Browser mitteilt, wie er die „Innenseite“ eines Polygons bei sich selbst schneidenden Pfaden oder geschlossenen Formen berücksichtigen soll. Joni Trythall erklärt sehr gut, wie das Attribut „fill-rule“ in SVG funktioniert. Wenn nicht definiert, wird für fill-rule standardmäßig nonzero verwendet.
.element{
shape-outside: polygon(0 0, 0 100%, 100% 100%);
/* identical to: */
shape-outside: polygon(nonzero, 0 0, 0 100%, 100% 100%);
}
Die Funktion inset()
Mit der Formfunktion inset() können Sie rechteckige Formen erstellen, um die Inhalte umbrochen werden. Das mag angesichts der ursprünglichen Prämisse, dass CSS-Formen Webinhalte aus einfachen Boxen befreien, widersprüchlich klingen. Das kann gut sein. Ich habe noch keinen Anwendungsfall für inset() gefunden, der nicht bereits mit Floats und Rändern oder mit einem polygon() realisierbar ist. inset() bietet jedoch einen besser lesbaren Ausdruck für rechteckige Formen als polygon().
Die vollständige Notation für eine Funktion für eingefügte Formen lautet inset(top right bottom left border-radius). Die ersten vier Positionsargumente sind Offsets nach innen von den Rändern des Elements. Das letzte Argument ist der Rahmenradius für die rechteckige Form. Sie ist optional und kann weggelassen werden. Sie folgt der Kurzschreibweise border-radius, die Sie bereits in CSS verwenden.
.element{
shape-outside: inset(100px 100px 100px 100px);
/* yields a rectangular shape which is 100px inset on all sides */
float: left;
}
Formen aus Referenzfeldern erstellen
Wenn Sie für das Attribut shape-outside keine Formfunktion angeben, kann der Browser eine Form aus dem Referenzfeld des Elements ableiten. Die Standardreferenzbox ist margin-box. Bisher nichts Ungewöhnliches, so funktionieren Floats bereits. Mit dieser Technik können Sie die Geometrie eines Elements wiederverwenden. Sehen wir uns das Attribut border-radius an.
Wenn Sie damit die Ecken eines schwebenden Elements abrunden, wird der Clipping-Effekt erzielt, der schwebende Bereich bleibt jedoch rechteckig. Fügen Sie shape-outside: border-box hinzu, um die von border-radius erstellte Kontur zu umschließen.
.element{
border-radius: 50%;
shape-outside: border-box;
float: left;
}
Natürlich können Sie alle Referenzfelder auf diese Weise verwenden. Hier ist eine weitere Verwendung für abgeleitete Formen: versetzte Zitate.
Der Effekt eines versetzten Pull-Quotes lässt sich auch nur mit den Eigenschaften „float“ und „margin“ erzielen. Dazu müssen Sie das Zitatelement im HTML-Baum an der Stelle positionieren, an der es gerendert werden soll.
So erzielen Sie denselben Effekt mit mehr Flexibilität:
.pull-quote{
shape-outside: content-box;
margin-top: 200px;
float: left;
}
Wir legen die Referenzbox content-box für das Koordinatensystem der Form explizit fest. In diesem Fall bestimmt die Menge des Inhalts im Pull-Zitat die Form, um die der äußere Inhalt umgebrochen wird. Das Attribut margin-top wird hier verwendet, um das Zitat unabhängig von seiner Position im HTML-Baum zu positionieren (zu verschieben).
Formrand
Wenn Sie Text um eine Form fließen lassen, kann es passieren, dass er zu nah am Element liegt. Mit dem Attribut shape-margin können Sie einen Abstand um die Form herum hinzufügen.
.element{
shape-outside: circle(40%);
shape-margin: 1em;
float: left;
}
Der Effekt ist ähnlich wie bei der regulären margin-Property, aber shape-margin wirkt sich nur auf den Bereich um den shape-outside-Wert aus. Der Abstand wird nur dann um die Form herum hinzugefügt, wenn im Koordinatensystem Platz dafür ist. Deshalb ist der Kreisradius im obigen Beispiel auf 40 % und nicht auf 50 % festgelegt. Wenn der Radius auf 50 % festgelegt wäre, würde der Kreis den gesamten Platz im Koordinatensystem einnehmen und es gäbe keinen Raum für den Effekt von shape-margin. Die Form ist letztendlich auf die margin-box des Elements (das Element plus die umgebende margin) beschränkt. Wenn die Form größer ist und überläuft, wird sie auf die margin-box zugeschnitten und Sie erhalten eine rechteckige Form.
Es ist wichtig zu wissen, dass shape-margin nur einen einzigen positiven Wert akzeptiert. Es gibt keine Langschreibweise. Was ist überhaupt ein „shape-margin-top“ für einen Kreis?
Formen animieren
Sie können CSS-Formen mit vielen anderen CSS-Funktionen wie Übergängen und Animationen kombinieren. Ich muss jedoch betonen, dass Nutzer es sehr störend finden, wenn sich das Textlayout während des Lesens ändert. Achten Sie genau auf die Nutzererfahrung, wenn Sie sich für die Animation von Formen entscheiden.
Sie können die Radien und Mittelpunkte für circle()- und ellipse()-Formen animieren, solange sie in Werten definiert sind, die der Browser interpolieren kann. Ein Wechsel von circle(30%) zu circle(50%) ist möglich. Eine Animation zwischen circle(closest-side) und circle(farthest-side) führt jedoch zu einer Überlastung des Browsers.
.element{
shape-outside: circle(30%);
transition: shape-outside 1s;
float: left;
}
.element:hover{
shape-outside: circle(50%);
}
Interessantere Effekte lassen sich erzielen, wenn Sie polygon()-Formen animieren. Dabei ist zu beachten, dass das Polygon in beiden Animationszuständen dieselbe Anzahl von Eckpunkten haben muss. Der Browser kann nicht interpolieren, wenn Sie Eckpunkte hinzufügen oder entfernen.
Ein Trick besteht darin, die maximale Anzahl von Eckpunkten hinzuzufügen und sie im Animationszustand, in dem Sie weniger wahrgenommene Kanten der Form wünschen, zusammengeballt zu positionieren.
.element{
/* four vertices (looks like rectangle) */
shape-outside: polygon(0 0, 100% 0, 100% 100%, 0 100%);
transition: shape-outside 1s;
}
.element:hover{
/* four vertices, but second and third overlap (looks like triangle) */
shape-outside: polygon(0 0, 100% 50%, 100% 50%, 0 100%);
}
Inhalte in einer Form umbrechen
Der erste Entwurf der CSS Shapes-Spezifikation enthielt eine shape-inside-Eigenschaft, mit der Sie Inhalte innerhalb einer Form umbrechen konnten. Es gab sogar eine Zeit lang Implementierungen in Chrome und Webkit. Wenn Sie jedoch beliebig positionierte Inhalte in einen benutzerdefinierten Pfad einbinden möchten, ist viel mehr Aufwand und Recherche erforderlich, um alle möglichen Szenarien abzudecken und Fehler zu vermeiden. Aus diesem Grund wurde das Attribut shape-inside auf CSS Shapes Level 2 verschoben und die Implementierungen dafür wurden zurückgezogen.
Mit etwas Aufwand und Kompromissbereitschaft können Sie jedoch den Effekt erzielen, dass Inhalte in eine benutzerdefinierte Form eingebunden werden. Der Trick besteht darin, zwei schwebende Elemente mit shape-outside zu verwenden, die auf gegenüberliegenden Seiten eines Containers positioniert sind. Der Kompromiss besteht darin, dass Sie ein oder zwei leere Elemente verwenden müssen, die keine semantische Bedeutung haben, aber als Stützen dienen, um die Illusion einer Form im Inneren zu erzeugen.
<div>
<div class='left-shape'></div>
<div class='right-shape'></div>
Lorem ipsum...
</div>
Die Position der Strut-Elemente .left-shape und .right-shape oben im Container ist wichtig, da sie links und rechts neben dem Inhalt platziert werden.
.left-shape{
shape-outside: polygon(0 0, ...);
float: left;
width: 50%;
height: 100%;
}
.right-shape{
shape-outside: polygon(50% 0, ...);
float: right;
width: 50%;
height: 100%;
}
Durch dieses Styling nehmen die beiden schwebenden Struts den gesamten Platz innerhalb des Elements ein, aber die shape-outside-Eigenschaften schaffen Platz für den restlichen Inhalt.
Wenn CSS-Formen vom Browser nicht unterstützt werden, führt dies zu unschönen Effekten, da der gesamte Inhalt nach unten verschoben wird. Deshalb ist es wichtig, die Funktion im Rahmen einer progressiven Verbesserung zu verwenden.
In den vorherigen Beispielen für Formanimationen ist Ihnen vielleicht aufgefallen, dass sich verschiebender Text störend sein kann. Nicht alle Anwendungsfälle erfordern eine animierte Form. Sie können jedoch andere Eigenschaften animieren, die mit CSS-Formen interagieren, um dort, wo es sinnvoll ist, Effekte hinzuzufügen.
In der Alice im Wunderland-Demonstration von CSS-Formen haben wir die Scrollposition verwendet, um den oberen Rand des Inhalts zu ändern. Der Text wird zwischen zwei schwebenden Elementen eingequetscht. Wenn es sich nach unten bewegt, muss es entsprechend der shape-outside der beiden schwebenden Elemente neu angeordnet werden. Dadurch entsteht der Eindruck, dass der Text in den Kaninchenbau fällt, was die Geschichte noch interessanter macht. Eventuell unbegründet? Vielleicht. Aber es sieht cool aus.
Da das Textlayout nativ vom Browser erstellt wird, ist die Leistung besser als bei einer JavaScript-Lösung. Das Ändern von „margin-top“ beim Scrollen löst jedoch viele Layout- und Paint-Ereignisse aus, was die Leistung spürbar beeinträchtigen kann. Dies ist jedoch mit Vorsicht zu verwenden. Die Verwendung von CSS-Formen ohne Animation hat jedoch keine spürbaren Auswirkungen auf die Leistung.
Progressive Verbesserung
Gehen Sie zuerst davon aus, dass der Browser CSS-Formen nicht unterstützt, und bauen Sie darauf auf, wenn Sie die Funktion erkennen. Modernizr ist eine gute Lösung für die Feature-Erkennung. Im Abschnitt Non-core detects finden Sie einen Test für CSS-Formen.
Einige Browser bieten eine Featureerkennung in CSS über die @supports-Regel, ohne dass externe Bibliotheken erforderlich sind. Google Chrome, das ebenfalls CSS-Formen unterstützt, versteht die Regel @supports. So verwenden Sie es für die progressive Verbesserung:
.element{
/* styles for all browsers */
}
@supports (shape-outside: circle(50%)){
/* styles only for browsers which support CSS Shapes */
.element{
shape-outside: circle(50%);
}
}
Lea Verou hat mehr über die Verwendung der CSS-Regel „@supports“ geschrieben.
Disambiguierung von CSS-Ausschlüssen
Was wir heute als CSS-Formen kennen, wurde in den Anfängen der Spezifikation als CSS-Ausschlüsse und -Formen bezeichnet. Die Namensänderung mag wie eine Nuance erscheinen, ist aber tatsächlich sehr wichtig. CSS Exclusions, jetzt eine separate Spezifikation, ermöglicht es, Inhalte um beliebig positionierte Elemente herumfließen zu lassen, ohne dass eine Float-Eigenschaft erforderlich ist. Stellen Sie sich vor, Sie möchten Inhalte um ein absolut positioniertes Element herum anordnen. Das ist ein Anwendungsfall für CSS-Ausschlüsse. CSS-Formen definieren nur den Pfad, um den der Inhalt umbrochen wird.
Formen und Ausschlüsse sind also nicht dasselbe, ergänzen sich aber. CSS-Formen sind heute in Browsern verfügbar, während CSS-Ausschlüsse noch nicht mit Formeninteraktion implementiert sind.
Tools für die Arbeit mit CSS-Formen
Sie können Pfade in klassischen Tools zur Bilderstellung erstellen, aber zum Zeitpunkt der Erstellung dieses Artikels exportiert keines davon die erforderliche Syntax für CSS-Formwerte. Selbst wenn sie es täten, wäre es nicht sehr praktisch, so zu arbeiten.
CSS-Formen sind für die Verwendung im Browser gedacht, wo sie auf andere Elemente auf der Seite reagieren. Es ist sehr nützlich, die Auswirkungen der Bearbeitung der Form auf den umgebenden Inhalt zu visualisieren. Es gibt einige Tools, die Sie bei diesem Workflow unterstützen:
Brackets: Die Erweiterung „CSS Shapes Editor“ für Brackets verwendet den Live-Vorschaumodus des Code-Editors, um einen interaktiven Editor zum Bearbeiten von Formwerten einzublenden.
Google Chrome: Die CSS Shapes Editor-Erweiterung für Google Chrome erweitert die Entwicklertools des Browsers um Steuerelemente zum Erstellen und Bearbeiten von Formen. Über dem ausgewählten Element wird ein interaktiver Editor platziert.
Der Inspector in Google Chrome bietet integrierte Unterstützung für das Hervorheben von Formen. Bewegen Sie den Mauszeiger auf ein Element mit einer shape-outside-Eigenschaft. Es leuchtet auf, um die Form zu veranschaulichen.
Formen aus Bildern: Wenn Sie lieber Bilder generieren und den Browser Formen daraus extrahieren lassen möchten, hat Rebecca Hauck eine gute Anleitung für Photoshop geschrieben.
Polyfill: Google Chrome ist der erste große Browser, der CSS-Formen unterstützt. Die Funktion wird demnächst auch unter iOS 8 und Safari 8 von Apple unterstützt. Andere Browseranbieter werden sie möglicherweise in Zukunft berücksichtigen. Bis dahin gibt es ein CSS Shapes-Polyfill, das grundlegende Unterstützung bietet.
Fazit
In einem Web, in dem Inhalte meist in einfachen Boxen gefangen sind, bieten CSS-Formen eine Möglichkeit, ausdrucksstarke Layouts zu erstellen und die Lücke zwischen Web- und Printdesign zu schließen. Natürlich können Formen auch missbraucht werden und Ablenkungen verursachen. Wenn sie jedoch mit Geschmack und gutem Urteilsvermögen eingesetzt werden, können Formen die Präsentation von Inhalten verbessern und die Aufmerksamkeit der Nutzer auf eine für sie einzigartige Weise lenken.
Zum Abschluss möchte ich Ihnen eine Sammlung von Arbeiten anderer Designer zeigen, die größtenteils aus dem Printbereich stammen und interessante Anwendungen für nicht rechteckige Layouts zeigen. Ich hoffe, dass Sie dadurch inspiriert werden, CSS-Formen auszuprobieren und mit neuen Designideen zu experimentieren.
Vielen Dank an Pearl Chen, Alan Stearns und Zoltan Horvath für die Überprüfung dieses Artikels und die Bereitstellung wertvoller Informationen.