Text nach drei Zeilen abschneiden – line-clamp statt JavaScript
Kartenlisten sehen nur dann ordentlich aus, wenn alle Vorschautexte gleich hoch sind. Das serverseitig auf 120 Zeichen zu kürzen geht schief, sobald die Karte schmaler wird – CSS kann das seit Jahren selbst.
Eine Liste aus Vorschaukarten: Bild, Überschrift, zwei Sätze Text. Sieht gut aus — bis eine Beschreibung doppelt so lang ist wie die anderen und die Karte aus der Reihe ragt.
Der übliche Reflex ist, im Backend zu kürzen:
$vorschau = mb_substr($text, 0, 120) . '…';Das funktioniert bei genau einer Bildschirmbreite. Auf dem Handy passen in 120 Zeichen vier Zeilen, auf dem großen Monitor anderthalb. Und mitten im Wort abgeschnitten wird es auch noch.
CSS kann das genauer
.karte-text {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
}Drei Zeilen, dann … — und zwar gemessen an dem, was tatsächlich dargestellt wird. Wird die Karte schmaler, passt weniger Text in eine Zeile, aber es bleiben drei Zeilen. Genau das will man.
Warum die -webkit-Präfixe?
Die sehen nach altem Bastelcode aus und sind trotzdem der offizielle Weg: Alle heutigen Browser unterstützen genau diese Schreibweise, und sie ist inzwischen auch in den CSS-Standard aufgenommen worden. Die präfixlose Fassung line-clamp kommt nach und nach dazu — bis sie überall da ist, schreibe ich beides:
.karte-text {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
line-clamp: 3;
overflow: hidden;
}Eine Zeile? Dann geht es einfacher
Für eine Zeile braucht es das nicht:
.dateiname {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}Das ist der ältere, schlichtere Weg — aber eben nur für einzeilige Beschriftungen, etwa Dateinamen in einer Tabelle.
Woran man denken sollte
Der Text ist noch da. Er wird nur nicht dargestellt. Für Suchmaschinen und Screenreader ist der vollständige Inhalt weiterhin vorhanden — was gut ist, wenn es um eine Vorschau geht, und schlecht, wenn du glaubst, damit etwas zu verbergen. Zum Verstecken taugt es nicht.
Die Höhe wird nur bei gleicher Zeilenhöhe gleich. Wenn eine Karte eine größere Schrift benutzt, sind drei Zeilen dort höher. In einem Grid mit align-items: stretch fällt das nicht auf, in einer Flexbox-Reihe schon.
Ein Titel darf ruhig zwei Zeilen bekommen. Ich setze fast immer -webkit-line-clamp: 2 auf die Überschrift und 3 auf den Text. Titel sind unterschiedlich lang, und eine Überschrift, die als einzige über drei Zeilen läuft, zerlegt das Raster genauso zuverlässig wie ein langer Fließtext.
Auf meinen Übersichtsseiten steckt genau diese Regel in jeder Karte — es ist eine der wenigen Stellen, an denen vier Zeilen CSS ein Layoutproblem vollständig erledigen, das sonst Servercode und Sonderfälle gekostet hätte.
Du hast eine Übersichtsseite, bei der die Kacheln unterschiedlich hoch sind? Meistens ist das in fünf Minuten erledigt. Melde dich.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
subgrid – Karten, deren Zeilen wirklich auf einer Linie liegen
Drei Karten nebeneinander, jede mit Titel, Text und Knopf – und alles steht leicht versetzt, weil ein Titel zweizeilig ist. Mit subgrid teilen sich die Karten die Zeilen des Eltern-Grids, und alles sitzt bündig. Ohne feste Höhen, ohne JavaScript.
grid-template-areas – ein Layout, das man im Code sehen kann
Statt Zeilen- und Spaltennummern zu zählen, malst du dein Layout als kleine ASCII-Zeichnung ins CSS. Auf dem Handy schreibst du die Zeichnung einfach anders – dieselben Bausteine, andere Anordnung, kein einziger geänderter HTML-Knoten.
accent-color – Checkboxen und Regler in deiner Markenfarbe, in einer Zeile
Checkboxen und Radiobuttons waren jahrelang der Grund, warum Leute sie mit appearance: none nachgebaut haben – und dabei die Tastaturbedienung verloren. Eine einzige CSS-Eigenschaft macht das überflüssig.