Florence Maurice

Webthemen

7 Tipps für die Arbeit mit CSS-Shapes

Geschrieben am:

CSS-Shapes ermöglichen es, Inhalte nicht-eckig umfließen zu lassen. Eine Kurzeinführung gibt es hier im Blog, eine ausführlichere Behandlung bietet ein schöner Artikel von maddesigns oder mein Offline-Artikel für die Zeitschrift web & mobile-Developer, der in der Ausgabe 1/2015 erscheint.

Hier hingegen handelt es sich nicht um eine Einführung, stattdessen habe ich ein paar Tipps für die Arbeit mit CSS-Shapes gesammelt. Darunter sind auch Dinge, über die ich bei meinen eigenen Experimenten erst einmal gestolpert bin.

Vorweg ein Hinweis: CSS-Shapes sind derzeit nur in Chrome, in Webkit-Browsern basierten Browsern sowie in Firefox ab Version 62 implementiert.

1. CSS-Shapes nicht ohne float und definierte Ausmaße

CSS-Shapes funktionieren nur bei gefloateten Elementen. Damit shape-outside eine Auswirkung hat, muss gleichzeitig float: left oder float: right definiert werden. Außerdem muss das Element genau definierte Ausmaße haben - Bilder haben inhärente Breiten, da muss man nichts weiter definieren.

2. Ausgesparte Form sichtbar machen

CSS-Shapes definieren immer nur die Aussparung. Wenn man eine Aussparung erzeugt und genau überprüfen möchte, ob die Form so aussieht wie gewünscht, kann das mühsam sein. Hilfreich ist es schon einmal, dass man in Chrome die Form beim Hovern über das Element in den Entwicklertools sieht.

CSS-Shapes in den Entwicklertools von Chrome beim Hovern

Noch nützlicher finde ich es, ein Element mit clip-path in derselben Form zu beschneiden.

Nehmen wir einmal folgendes Element:

<div class="form"></div>

Als Nächstes folgen grundlegende Formatierung - im Beispiel erhält das Element Ausmaße und eine Hintergrundfarbe, außerdem wird es gefloatet:

.form { 
  width: 400px; 
  height: 400px; 
  background-color: yellow; 
  float: left; 
}

Wenn ich jetzt mit den verschiedenen Formen für shape-outside experimentieren will, so kann ich dieselben Angaben wie bei shape-outside auch bei -webkit-clip-path schreiben, um das Element in dieser Form auszuschneiden. Im folgenden Beispiel wird ein Kreis definiert, dessen Mittelpunkt in der oberen linken Ecke des Elements liegt:

.form { 
  -webkit-clip-path: circle(50% at 0 0); 
  clip-path: circle(50% at 0 0); 
  -webkit-shape-outside: circle(50% at 0 0); 
  shape-outside: circle(50% at 0 0); 
}

shape-outside mit clip-path

shape-outside mit clip-path bei JSFiddle ausprobieren

3. Besonderheiten von shape-margin

Mit shape-margin bestimmt man den Abstand um ein Shape. Allerdings führt das manchmal zu scheinbar nicht erklärbaren Auswirkungen.

Im folgenden Fall scheint shape-outside in dem Moment nicht mehr zu funktionieren, wo man zusätzlich shape-margin angibt (im Beispiel verzichte ich der Kürze halber auf die Präfix). Das Element wird jetzt wieder eckig umflossen und nicht kreisförmig.

.form { 
  shape-outside: circle(50%); 
  shape-margin: 50px; 
}

Problem bei shape-margin

Links ohne shape-margin, rechts mit shape-margin - hier ist die Umfließung eckig

Der Grund dafür ist, dass ein Shape nie größer sein kann als die zugrundeliegende Form. Das heißt: Ich kann durch die Shape-Definition die umflossene Form nicht größer machen, als sie ursprünglich ist. Und wenn ich bei shape-outside einen Kreis mit circle(50%) angebe, so reicht dieser Kreis an den Rand des Elements. Der Teil von shape-margin, der außerhalb der ursprünglichen Form des Elements ist, wird ignoriert - und somit wird mit shape-margin die gesamte ursprüngliche Form ausgefüllt und damit sieht es aus wie ohne die Anwendung von shape-outside.

Wenn wir den Kreis hingegen kleiner machen, sieht man deutlich die Auswirkung von shape-margin:

  shape-outside: circle(30%); 
  shape-margin: 50px;

shape-margin bei kleinerem Kreis

Links ohne shape-margin, rechts mit

shape-margin ausprobieren bei JSFiddle

4. shape-outside: url() funktioniert nicht bei lokal geöffneten Dateien

Mithilfe von Bildern kann man ebenfalls die Aussparung definieren. Allerdings müssen die Bilder von derselben Quelle stammen wie das Dokument. Da das kann bei lokal geöffneten Dateien nicht überprüft werden kann, muss man Beispiele mit shape-outside: url()  über einen Webserver aufrufen.

5. Achtung vor veralteter Syntax

Im Web gibt es viele Beispiele und Tutorials für CSS-Shapes. Am Anfang war ich oft entnervt, weil viele Beispiele bei mir in Chrome nicht zu funktionieren schienen. Der Grund: Die Syntax zur Angabe der Formen hat sich geändert und Beispiele, die nicht funktionieren, verwenden eben noch die alte Syntax, die heute nicht mehr geht.

Alte Syntax:

shape-outside: circle(20px, 20px, 20px);

Neue Syntax (Kreismittelpunkt mit at):

shape-outside: circle(20px at 20px 20px);

6. CSS-Shapes bei Modernizr

Wie so oft kann man Modernizr zur Überprüfung nutzen, ob ein Browser Shapes unterstützt, und ansonsten eine alternative Formatierung definieren. Allerdings findet sich der entsprechende Test nicht direkt unter den Hauptfeatures der Download-Seite von Modernizr, sondern im Bereich “Non-core detects”.

7. Elemente in den Hintergrund schieben

Wenn man eine Aussparung von 0px Ausmaß definiert, kann man dadurch das Element in den Hintergrund schieben: shape-outside: circle(0);

Diese Angabe bewirkt beispielsweise, dass das Element sich jetzt im Hintergrund befindet und der Text darüber fließt.