Textumfluss mit Shapes

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Bilder und alle anderen Elemente von Webseiten befinden sich in rechteckigen Rahmen. Standardmäßig fließt der Text oberhalb oder unterhalb dieses Rahmens. Wenn man ein Bild links oder rechts ausrichtet, fließt der Text um das Rechteck herum.

Mit Masken und Beschneidungen kann man unregelmäßige Bildausschnitte festlegen. CSS-Shapes[1] ermöglichen das Umfließen von unregelmäßigen Formen durch einen Text, wie es in Druckerzeugnissen schon lange möglich und üblich ist.

Dieses Tutorial zeigt, was geht und vor welchen Problemen man bei der Umsetzung für alle Browser heute noch steht.

shape-outside

Mit der Eigenschaft shape-outside wird ein Element definiert, um das Text herumgeführt wird.

Kreis umfließen ansehen …
#shape {
  shape-outside: circle(); /* Radius Standard = 50% */
  clip-path: circle(45%);
  float: left;
  width: 12em;
  height: 12em;
  background: firebrick;
}

Das div-Element mit der id shape dient der Festlegung der Form, um die sich der Fließtext fließt. Die Hintergrundfarbe und der border-radius dienen nur der Visualisierung.

  • clip-path: circle(45%); beschneidet das div kreisförmig.
  • shape-outside: circle(50%); zeichnet eine Kreisform, die etwas größer als der rote Kreis ist.
    Der Text[2] fließt um das gefloatete Objekt herum.
Beachte: Die Browserunterstützung scheint laut caniuse gut zu sein, aber im Safari (Stand: Mai 2026) scheint bei der Verwendung von Margin der Kreis „zu tief“ zu hängen. Dieser Bug wirkt sich auf die Berechnung der Höhe des Floats aus, wodurch sich die Geometrie des Kreises vertikal verschiebt.
Die Empfehlungen …
  • ein display:block zu setzen
  • width und height explizit anzugeben
gehen alle ins Leere. Es bleibt nur zu hoffen, dass Safari dies in Zukunft ändert.

Grundformen

Neben der oben erwähnten circle()-Funktion gibt es weitere SVG-ähnliche Grundformen:

  • circle(): eine kreisförmige Form, z. B.:
    circle('Radius' at 'x-Koordinate des Mittelpunkts' 'y-Koordinate des Mittelpunkts')
    Kreis mit 50% Radius, dessen Mittelpunkt nicht in der linken oberen Ecke des äußeren Elements, sondern im äußeren Element ist.
  • ellipse(): eine ovale Form, z.B:
    ellipse('Höhe' 'Breite' at 'x-Koordinate des Mittelpunkts' 'y-Koordinate des Mittelpunkts');
  • inset(): legt eine rechteckige Form an, die aber – anders als rect() – durch den Abstand von den Seiten definiert wird, z. B.:
    inset('oben' 'rechts' 'unten' 'links' 'border-radius');
  • polygon(): legt Form mit beliebig vielen Fixpunkten an

Die von anderen CSS-Eigenschaften bekannten

kommen wohl, wenn Level 2 von den Browsern implementiert wird.

polygon()

Dieses Beispiel ist bereits aus dem Masken und Beschneidungen-Tutorial bekannt:

Vom Rechteck zum Dreieck ansehen …
img {
  float: left;
  clip-path: polygon(0% 0%, 100% 50%, 0% 100%, 0% 0%);
  shape-outside: polygon(0% 0%, 100% 50%, 0% 100%, 0% 0%);
}

img:hover {
    shape-outside:polygon(0% 0%, 100% 0, 0% 100%, 0% 0%);
    clip-path: polygon(0% 0%, 100% 0%, 0% 100%, 0% 0%);
  }

Das rechteckige Bild wird mit clip-path zu einem Dreieck beschnitten. Dabei wird die polygon()-Funktion verwendet.

Sie wird mit den gleichen Werte für shape-outside genutzt, sodass der Text das jetzt dreieckige Bild umfließt.

Wenn man mit der Maus über das Bild fährt, verändern sich sowohl der mit clip-path festgelegte Bildausschnitt als auch der mit shape-outside definierte Textumfluss.

url() - Shape-Form aus einem Bild

Das Zeichnen von Grundformen ist von clip-path bekannt – im Normalfall würde man jedoch keinen leeren Raum zeichnen und dann vom Textfluss ausgrenzen.
Im Printdesign geht es ja darum, dass im Text gefloatete Bilder vom Text umflossen werden.

Text fließt um eine Grafik herum ansehen …
.voyager {
	float: left;	
  width: 500px;
  height: 334px;	
  shape-outside: url(https://wiki.selfhtml.org/images/f/fb/Voyager_probe.png);
  margin: 0.5em;
  shape-image-threshold: 0.1;
  shape-margin: 1em;	
}

Hier wird der Textumfluss an die Form des Bilds angepasst.

shape-outside erhält durch die url()-Funktion ein Bild mit Transparenzen, dessen Form umflossen wird.

Möglich sind

  • eine Rastergrafik (GIF, PNG oder WebP); Der Browser verfolgt die Grenze zwischen transparenten und undurchsichtigen Pixeln, um die Float-Form zu erstellen.
  • ein SVG; Der Browser rastert die SVG-Datei und liest den Alphakanal des Ergebnisses aus
  • ein Verlauf wie linear-gradient(transparent, blue);
Beachte: Dies funktioniert nur, wenn Dateien und Bilder aus der gleichen Quelle stammen (CORS). Dies kann nur bei Dateien, die von einem Webserver ausgeliefert werden, überprüft werden; nicht jedoch von lokal geöffneten Dateien.

Anders als im oberen Beispiel muss nichts mehr festgelegt werden; Der Browser übernimmt die Arbeit

Die Eigenschaft shape-image-threshold definiert, welcher Grad an Deckkraft (opacity) zur Erzeugung der Form herangezogen wird.

Es ist ein Wert zwischen 0.0 (völlig transparent) und 1.0 (völlig abdeckend) möglich. Standardwert ist 0.0. Ein Wert von 0.5 bedeutet, dass nur Pixel mit einer Deckkraft von 50% und mehr zur Erzeugung der Form herangezogen werden.

shape-margin legt einen Abstand um das umflossene Objekt fest. Der Abstand kann nicht über die tatsächliche Größe des in shape-outside festgelegten Objekts hinausgehen.

Ausblick

Mit der Eigenschaft shape-inside sollte Text innerhalb von unregelmäßigen Formen passgenau eingefügt werden. Im Augenblick wird von einer Implementation in heutige Browser aber abgesehen. Gerade bei langen Wörtern ist eine manuelles Einpassen wohl einem Algorithmus vorzuziehen.

Shape-inside Ausblick.svg

Der Einsatz von shape-outside kann eigentlich erst empfohlen werden, wenn die Darstellungsprobleme im Safari behoben werden.

Gleichzeitig ist das Web eben nicht Print. Was auf großen Bildschirmen nebeneinander gut aussieht, muss auf mobilen Geräten doch untereinander dargestellt werden, sodass Effekte wie ein Textumfluss um Bilder herum gar nicht erst benötigt werden.


Weblinks

  1. csswg.org: CSS Shapes Module Level 1 (vom 07.Mai 2026)
  2. little-boxes.de (Webseite seit 2009 nicht mehr gepflegt.)

Artikel

https://blog.logrocket.com/creative-text-flows-using-css-shapes/

Beispiele

Generatoren