Jetzt wollen wir unsere Sechsecke aber endlich mit Inhalten füllen. In vielen Fällen kann man dabei genauso vorgehen wie bei normalen, rechteckigen Containern. Wenn man ein Symbol in die Mitte packt zum Beispiel. Oder eine Überschrift dazu. Oder einfach nur ein Hintergrundbild.
Will man allerdings mehr Text in das Hexagon einfügen, stößt man recht bald auf ein Problem: Um zu vermeiden, dass durch die sechseckige Form Text abgeschnitten wird, kann dieser nicht ganz bis zum Rand gehen. Also beschränkt man die Breite und/oder Höhe des Textes. Dadurch entsteht allerdings viel unnötiger Weißraum, der nicht nutzbar ist. Unabhängig vom Aussehen ist das auch ärgerlich, da der eh schon stark beschränkte Platz in der vordefinierten Form noch weiter verkleinert wird. (Siehe oranges Sechseck links)
Der gewünschte Textfluss soll sich jetzt aber an die Form anpassen. So wie beim blauen Hexagon rechts:

Diesen Effekt bekommt man mit einem kleinen Trick hin: CSS Shapes. Die CSS Shapes sind dafür da um geometrische Formen in float-Umgebungen anzuwenden. So kann Text auch um andere Formen als nur um Rechtecke fließen. Mithilfe der shape-margin kann man außerdem dafür sorgen, dass der Text immer einen fixen Abstand zur Form einhält. Der Browser-Support für CSS Shapes ist inzwischen auch gut, das sollte man ohne Probleme hernehmen können (siehe caniuse.com/css-shapes, 97% im Mai 2024).
Um den Text innerhalb des Sechseckes zu halten, muss die Form aber genau gegenteilig wie ein Hexagon geformt sein. So können wir den Text mit zwei Formen einmal von links (magenta) und einmal von rechts (gelb) beschränken. Die Form ist am Ende natürlich nicht sichtbar – sie bekommt einfach keine Hintergrundfarbe und bleibt damit transparent.
Definieren kann man die Formen mit der CSS Eigenschaft shape-outside
(mehr Infos dazu auf css-tricks.com). Wir benutzen wieder die polygon
Funktion, die wir schon von den clip-path
s von vorher kennen. Der Clip-Path Generator von CSS Portal kann einem hier wieder helfen, um sich das Polygon besser vorstellen zu können. Letztendlich brauchen wir die folgenden zwei Polygone:
Für die linke Form (magenta):
shape-outside: polygon(0 0, 100% 0, 100% 100%, 0 100%, 99% 75%, 99% 25%);
Für die rechte Form (gelb)
shape-outside: polygon(100% 0, 1% 25%, 1% 75%, 100% 100%, 0 100%, 0 0);

Der Abstand zu den beiden Formen kommt durch die CSS Eigenschaft shape-margin: 1rem;
auf beiden Polygonen.
Angeordnet werden die beiden Formen mithilfe von float
. Beide haben grundsätzlich eine Höhe von 100% und eine Breite von 50%, sodass sie nebeneinander den ganzen Container abdecken. Das linke Element bekommt die Eigenschaft float: left
, das rechte float: right
. Danach kommt dann das Element mit dem Textinhalt. Dieses erhält 100% Breite und Höhe, füllt somit auch den ganzen Container aus und der in ihm enthaltene Text fließt innerhalb des übrigen Platzes, der von den beiden Polygonen abgegrenzt ist – also innerhalb unseres Hexagons.
Hier noch einmal der ganze Code zum kopieren:
<div class="hexagon">
<div class="shape-container">
<div class="shape-start"></div>
<div class="shape-end"></div>
<div class="v-center">
<div>Lorem ipsum dolor sit amet</div>
</div>
</div>
</div>
Und das dazu passende CSS:
.hexagon .shape-container {
height: 100%;
width: 100%;
}
.hexagon .shape-start, .hexagon .shape-end {
content: "";
display: block;
width: 50%;
height: 100%;
shape-margin: 1rem;
}
.hexagon .shape-start {
shape-outside: polygon(100% 0, 1% 25%, 1% 75%, 100% 100%, 0 100%, 0 0);
float: left;
}
.hexagon .shape-end {
shape-outside: polygon(0 0, 100% 0, 100% 100%, 0 100%, 99% 75%, 99% 25%);
float: right;
}
.hexagon .v-center {
width: 100%;
height: 100%;
margin: 0;
text-align: center;
}
Kommentare zu Hexagone/ Waben in CSS quadratisch umsetzen und anordnen