Zum Inhalt springen
NativeCSS

Typografie

Fließtext, der mitdenkt: Spalten, Drop Caps und Zitate ohne Breakpoints

Ein Blick auf NativeCSS' typografische Werkzeuge - mehrspaltiger Fließtext, Drop Caps, Pull-Quotes und Textumfluss. Alles fließend (clamp()), alles Container-bewusst, kein einziger fester Breakpoint nötig.

<p class="ncss-drop-cap ncss-columns" style="--ncss-columns-width: 18rem;">
  Fließtext, der sich automatisch in Spalten aufteilt…
  <span class="ncss-pull-quote">Ein hervorgehobenes Zitat.</span>
</p>
Bunte Farbbalken eines Testbilds, als Platzhalter fürs Titelbild
Sichtbare Bildunterschrift über <figure>/<figcaption> (.ncss-figure) - getrennt vom alt-Attribut, das die unsichtbare a11y-Beschreibung fürs Bild selbst bleibt (für Screenreader oder falls das Bild nicht lädt). Beides zusammen sinnvoll: alt beschreibt, figcaption kommentiert/quellt.
12Dateien in helpers/
0Build-Schritte
1Token-Quelle
11Demo-Seiten

Container Queries haben die Art, wie NativeCSS über "responsiv" denkt, grundlegend verändert. Statt eine Handvoll fester Viewport-Breiten zu bedienen, reagiert jede Komponente auf ihre eigene, tatsächlich verfügbare Breite - eine Karte verhält sich in einer schmalen Sidebar automatisch anders als im breiten Hauptbereich, ganz ohne eine einzige Zeile JavaScript. Dieser Fließtext hier ist ein weiteres Beispiel: column-width statt einer festen Spaltenzahl lässt den Browser selbst entscheiden, wie viele Spalten in die verfügbare Breite passen.

Der Drop Cap oben nutzt dieselbe Logik gleich zweifach: initial-letter selbst ist bereits nativ (kein Padding-Gefrickel, keine Höhenberechnung von Hand), und seine Größe wächst zusätzlich per Container Query, sobald der umgebende .ncss-container breit genug für einen wirklich dramatischen Auftritt ist - in einer schmalen Spalte bleibt er dagegen bewusst zurückhaltender.

"Breakpointless heißt nicht 'keine Sprünge', sondern 'die Fläche selbst entscheidet, nicht eine geratene Pixelzahl.'"

Bunte Farbbalken eines Testbilds, kreisrund zugeschnitten Auch Textumfluss gehört zum Werkzeugkasten: shape-outside lässt den Fließtext um die tatsächliche Kreisform herum laufen, nicht nur um die rechteckige Bounding-Box (.ncss-float-shape-circle für die Form + .ncss-img- cover fürs Zuschneiden auf ein Quadrat davor). Kombiniert mit Silbentrennung (.ncss-hyphenate) bleiben auch schmale Spalten neben einem Bild gut lesbar, statt in unschöne Lücken oder einzelne, sehr lange Wörter am Zeilenende zu zerfallen. Donaudampfschifffahrts­gesellschaftskapitän ist ein beliebtes Test-Wort dafür - ohne Silbentrennung sprengt es schmale Spalten zuverlässig, mit Silbentrennung fügt es sich ein. Unterhalb von 28rem Containerbreite floatet dieses Bild nicht mehr - dank .ncss-center-narrow steht es dann zentriert statt linksbündig da. Bewusst OHNE sichtbare <figcaption> hier: eine zweite Zeile Text unter dem Bild würde die Box höher als das Bild selbst machen, shape-outside: circle(50%) bezieht sich aber auf die GESAMTE Box - der Textfluss würde dann um eine Ellipse statt einen Kreis laufen. Die Bildbeschreibung steckt hier stattdessen im alt-Attribut.

Bild Textumfluss funktioniert natürlich auch nach rechts (ncss-float-end) und ganz ohne shape-outside - für ein schlicht eckiges Bild reicht das float allein, die rechteckige Bounding Box ist ja bereits die Zielform. Tabellarische Ziffern (1234567890) sorgen dafür, dass nebeneinander stehende Zahlen - wie die "Fakten"-Kacheln oben - nicht "wackeln", weil jede Ziffer exakt gleich breit ist, unabhängig vom Wert. Dieses zweite Bild trägt stattdessen .ncss-full-narrow: unterhalb von 28rem Containerbreite wächst es auf die volle Breite, statt schmal und linksbündig zu bleiben.

Am Ende bleibt der Punkt, um den es bei NativeCSS die ganze Zeit geht: möglichst viel davon ist natives CSS, das der Browser ohnehin schon kann - Design-Arbeit besteht dann vor allem darin, die richtigen Bausteine an der richtigen Stelle zusammenzustecken, statt sie neu zu erfinden.

Weitere Textwerkzeuge

Laufweite (.ncss-tracking-*):

--tightSchmale Buchstaben
--normalNormale Buchstaben
--wideWeite Buchstaben
--widerWeitere Buchstaben
--widestSehr weite Buchstaben

Drop-Cap-Varianten (zusätzlich zu .ncss-drop-cap):

--sm

Kleinere Sink-Höhe für einen zurückhaltenderen Auftritt.

--lg

Größere Sink-Höhe für einen dramatischeren Auftritt.

--light

Dünnere Schriftstärke statt der fetten Standard-Initiale.

--brand

Eingefärbte Initiale in der Markenfarbe.

Textfarben & Ausrichtung:

.ncss-text-brand-2Zweitfarbe für Text
.ncss-text-neutralNeutraler Ton für Text
.ncss-text-inheritÜbernimmt die Farbe der Umgebung
.ncss-text-justify

Blocksatz richtet Text beidseitig bündig aus, am besten kombiniert mit Silbentrennung, damit schmale Zeilen nicht zu große Wortzwischenräume bekommen.

Eyebrow/Kicker (.ncss-eyebrow) und zitierte Aussage mit Quellenangabe (natives <blockquote> aus base.css, <footer>/<cite> jetzt mitgestylt - der "—"-Trenner ist generierter Inhalt, kein hart getipptes Zeichen im Markup):

.ncss-eyebrow

Redaktion

<blockquote> + <cite>

Container Queries sind der Moment, in dem CSS aufgehört hat, nur über den Viewport nachzudenken.

Aus dem Handbuch

Geboxter Text (.ncss-text-boxed) - jede umgebrochene Zeile bekommt ihre eigene Hintergrund-Box, ganz ohne <span> pro Zeile (box-decoration-break: clone). Braucht einen NICHT-Flex/Grid-Wrapper (siehe Kommentar in typography.css):

Funktioniert auch
über mehrere
Zeilen hinweg!

Farbige Variante
via .ncss-surface--brand

In einer Card kommt es auf die .ncss-card-body selbst an - trägt sie zusätzlich .ncss-stack/-cluster/-grid (verbreitetes Card-Muster für den inneren Abstand) oder ist die Card --horizontal/--horizontal-end, ist sie selbst ein Flex-Container und braucht denselben <div>-Wrapper. Eine reine .ncss-card-body ohne diese Kombination ist dagegen ein normaler Block-Container - kein Wrapper nötig:

Direkt in
.ncss-card-body

Ohne .ncss-stack/-cluster/-grid auf der Card-Body - kein Flex-Container, .ncss-text-boxed funktioniert direkt.

Im <div>
innerhalb .ncss-stack

.ncss-card-body.ncss-stack IST ein Flex-Container - der zusätzliche <div>-Wrapper um die Überschrift fängt die Blockifizierung ab.

Gefloatetes Bild, das zum Bildschirmrand ausbricht (.ncss-float-bleed-start/-end) - Text fließt normal daneben, das Bild reicht bis zum echten Bildschirmrand:

Bunte Farbbalken eines Testbilds, bis zum linken Bildschirmrand ausbrechend Dieses Bild bricht nach links bis zum Bildschirmrand aus, während der Text ganz normal daneben weiterläuft - eine Kombination aus Textumfluss (.ncss-float-start) und Ausbrechen (.ncss-bleed-start), die sich nicht einfach durch bloßes Kombinieren der beiden bestehenden Klassen ergibt: ein Float mit width:auto schrumpft auf seinen Inhalt ("shrink-to-fit") statt den verfügbaren Platz zu füllen, wie es der Bleed-Breiten-Trick eigentlich braucht - deshalb eine eigene Klasse mit fester Breite. Unterhalb von 28rem Containerbreite (float-wrap-Schwelle) bleibt es ein normaler, nicht ausbrechender Block.

Erzwungener heller/dunkler Text (.ncss-text-light/-dark, UIkit uk-light-Pendant) - für Flächen, deren Farbe NICHT über ncss-Tokens läuft (Foto, ein fester Marken-Ton außerhalb der Skala), unabhängig vom aktuellen Theme. Vier Deckkraft-Stufen (-100/-300/-700/-900, -900 == die Basis-Klasse ohne Zahl):

.ncss-text-light (voll)

.ncss-text-light-700

.ncss-text-light-300

.ncss-text-light-100

.ncss-text-dark (voll)

.ncss-text-dark-700

.ncss-text-dark-300

.ncss-text-dark-100

Kombinierbar mit .ncss-scheme-dark/-light (helpers/surfaces.css) ohne Konflikt - color-scheme (schaltet die light-dark()-Tokens des Elements um) und diese feste Textfarbe sind zwei unabhängige Mechanismen, unabhängig davon, ob die Seite selbst gerade im Light- oder Dark-Mode ist:

.ncss-scheme-dark + .ncss-text-light-700

Erzwungen dunkles Schema (der Karten-eigene Hintergrund kippt mit), zusätzlich fest heller Text.

.ncss-scheme-light + .ncss-text-dark-700

Erzwungen helles Schema, zusätzlich fest dunkler Text - unabhängig vom Theme der restlichen Seite.