Das CSS-Problem der vertikalen Zentrierung ist endlich gelöst: text-box-trim und margin-block

Das CSS-Problem der vertikalen Zentrierung ist endlich gelöst: text-box-trim und margin-block

lschvn7 Min. Lesezeit

Öffnen Sie einen Button in Ihrem Browser-Inspector. Fügen Sie Padding hinzu. Der Text scheint zentriert zu sein. Fügen Sie jetzt mehr Padding hinzu, oder wechseln Sie die Schriftart. Plötzlich ist er 4 Pixel verschoben. Das ist kein Bug in Ihrem CSS. Es ist ein grundlegender Konflikt zwischen der Art und Weise, wie Browser Text messen, und wie Menschen ihn wahrnehmen.

Das Problem: Der Leerraum

Um zu verstehen, warum Text nie wirklich zentriert ist, müssen Sie verstehen, was Browser tatsächlich messen. Jede Schriftart verfügt über einen Satz von Metriken: die Versalhöhe (wie hoch Großbuchstaben stehen), die Basislinie (auf der Buchstaben ruhen), die Oberlänge (Abstand von der Basislinie bis zur Spitze hoher Buchstaben) und die Unterlänge (Abstand unterhalb der Basislinie). Diese Metriken definieren das Em-Quadrat, die unsichtbare Box, die jedes Glyph enthält.

Aber es gibt einen Haken. Wenn Sie line-height: 1.5 für 16px-Text setzen, weist der Browser 24px vertikalen Raum zu. Der tatsächliche visuelle Text, die Buchstaben selbst, nehmen nur etwa 11px im vertikalen Zentrum dieser 24px-Box ein. Der verbleibende Raum wird als Leerraum bezeichnet: unsichtbares Padding, das über der Versalhöhe und unterhalb der Basislinie verteilt ist.

Browser richten Text an dieser Line-Height-Box aus, nicht an den visuellen Buchstaben. Deshalb erscheint Text in einem Button immer in der unteren Hälfte seines Containers, selbst mit display: flex; align-items: center. Die Line-Height-Box erstreckt sich weiter über die Versalhöhe als unter die Basislinie, sodass das visuelle Zentrum der Buchstaben weit unter dem geometrischen Zentrum des zugewiesenen Raums liegt.

Dieser Konflikt betrifft jeden engen Textcontainer: Buttons, Badges, Navigationselemente, Eingabefelder. Sie können so viel Padding hinzufügen, wie Sie möchten, bis Sie den Leerraum berücksichtigen, wird der Text nie wirklich zentriert sein.

Lösung 1: text-box-trim

Die CSS Text Level 4-Spezifikation führt text-box-trim ein, eine Eigenschaft, mit der Sie Leerraum direkt aus Inline-Text entfernen können. Die Eigenschaft akzeptiert drei Werte: trim-start entfernt Raum über dem Text, trim-end entfernt Raum darunter, und trim-both entfernt beides.

Um genau zu steuern, welcher Teil der Schriftmetrik getrimmt wird, kombinieren Sie es mit text-box-edge. Diese Eigenschaft akzeptiert Werte wie cap, alphabetic, ex und text, jeder repräsentiert eine andere Messung im Em-Quadrat der Schrift.

Für die engste vertikale Anpassung verwenden Sie text-box-edge: cap alphabetic in Kombination mit text-box-trim: trim-both. Dies teilt dem Browser mit, von der Versalhöhe bis zur alphabetischen Basislinie zu trimmen und den gesamten Leerraum über und unter den sichtbaren Buchstaben zu entfernen.

.button-text {
  text-box-edge: cap alphabetic;
  text-box-trim: trim-both;
}

Die Browserunterstützung ist derzeit auf die neuesten Versionen beschränkt. Dies macht text-box-trim ideal als progressive Verbesserung: Sie wenden es für Browser an, die es unterstützen, während Sie einen Fallback für alle anderen behalten.

Lösung 2: margin-block

Wenn Sie heute funktionierenden Code benötigen, liefert margin-block mit schriftrelative Einheiten das gleiche Ergebnis mit ausgezeichneter Browserunterstützung. Die Technik verwendet zwei weniger bekannte CSS-Einheiten: cap, das der Versalhöhe der aktuellen Schrift entspricht, und lh, das dem berechneten Line-Height-Wert entspricht.

Die Formel ist elegant:

.button-text {
  margin-block: calc(0.5cap - 0.5lh);
}

Dies erzeugt einen negativen Margin, der die Line-Height-Box gegen die Versalhöhe ausgleicht. Die Hälfte der Versalhöhe minus der Hälfte der Line-Height ergibt genau den Abstand, der benötigt wird, um den visuellen Text in die Mitte seines zugewiesenen Raums zu ziehen. Da sich sowohl cap als auch lh mit der Schrift skalieren, funktioniert dies unabhängig von Schriftgröße oder -familie korrekt.

Für eine 16px-Schrift mit line-height: 1.5 (24px) ergibt die Berechnung ungefähr -4px. Dieser negative Margin hebt den visuellen Text in das geometrische Zentrum. Das Ergebnis ist die gleiche enge, präzise Ausrichtung, die text-box-trim bietet, aber in jedem modernen Browser heute verfügbar.

Muster für progressive Verbesserung

Der kluge Ansatz kombiniert beide Techniken: Beginnen Sie mit margin-block als Basis, dann verbessern Sie mit text-box-trim, wo unterstützt. Der Schlüssel ist die Verwendung von @supports, um die Unterstützung von text-box-trim zu erkennen und den margin-block in diesem Block zu canceln.

.button-text {
  /* Basis: funktioniert überall */
  margin-block: calc(0.5cap - 0.5lh);
}

/* Verbesserung: text-box-trim verwenden, wenn verfügbar */
@supports (text-box-trim: trim-both) {
  .button-text {
    text-box-edge: cap alphabetic;
    text-box-trim: trim-both;
    margin-block: 0;
  }
}

Dieses Muster stellt sicher, dass jeder Browser eine korrekte Textausrichtung erhält. Ältere Browser erhalten die margin-block-Lösung. Moderne Browser erhalten den nativen text-box-trim-Ansatz. Kein Browser erhält eine doppelte Anpassung oder ein kaputtes Layout.

Praktische Anwendungsfälle

Button-Text: Wenden Sie margin-block: calc(0.5cap - 0.5lh) auf das Textelement des Buttons an, während der Button selbst display: inline-flex; align-items: center verwendet. Dies ergibt perfekt zentrierten Button-Text, der standhält, wenn Sie Schriftarten wechseln oder Padding anpassen.

Badges und Pills: Behälter mit engem Padding offenbaren Fehlausrichtungen sofort. Fügen Sie margin-block zum Badge-Text hinzu und beobachten Sie, wie das Label in die geometrische Mitte springt, selbst mit asymmetrischem Padding.

Hero-Überschriften: Großer Anzeigetext macht selbst winzige Fehlausrichtungen offensichtlich. margin-block auf einer 72px-Überschrift mit line-height: 1.1 liefert die pixelgenaue Ausrichtung, die Premium-Designs erfordern.

Icon + Text: Wenn Sie ein Icon mit Text paaren und display: flex; align-items: center verwenden, stellen Sie durch Hinzufügen von margin-block zum Textelement sicher, dass Icon und Buchstaben dieselbe visuelle Basislinie teilen, selbst wenn ihre internen Metriken unterschiedlich sind.

Text war in CSS schon immer leicht außerhalb der Mitte, nicht wegen Bugs, sondern wegen der Art und Weise, wie Browser Raum messen. Mit margin-block, das heute verfügbar ist, und text-box-trim, das bald kommt, ist diese Ära endlich vorbei.

Häufig gestellte Fragen

Verwandte Artikel

Weitere Berichterstattung zu ähnlichen Themen und Tags.

Rolldown 1.1.4 Deaktiviert `experimental.lazyBarrel` Wieder als Standard, Einen Monat Nachdem 1.1.0 Es Standardmäßig Aktiviert Hatte
javascript

Rolldown 1.1.4 Deaktiviert `experimental.lazyBarrel` Wieder als Standard, Einen Monat Nachdem 1.1.0 Es Standardmäßig Aktiviert Hatte

Rolldown [v1.1.4](https://github.com/rolldown/rolldown/releases/tag/v1.1.4), veröffentlicht am 2026-07-01T14:02:02Z, liefert eine Feature-Änderung und 19 Fehlerbehebungen. Die Feature-Änderung ist eine teilweise Rücknahme des [Standard-Flips der v1.1.0](https://github.com/rolldown/rolldown/releases/tag/v1.1.0) vom 2026-06-03: `experimental.lazyBarrel` ist nach vier Wochen Korrekturmeldungen gegen das standardmäßig aktivierte Verhalten wieder standardmäßig deaktiviert. Das Release härtet außerdem den Dev-Mode-Pfad, indem `lazyBarrel` auf off gezwungen wird, sobald `experimental.devMode` gesetzt ist (PR [#10060](https://github.com/rolldown/rolldown/pull/10060)), zusätzlich zum bestehenden Force-off für `treeshake`. Die Standard-Flip-Rücknahme (PR [#10071](https://github.com/rolldown/rolldown/pull/10071)) und der Dev-Mode-Fix autorisieren sich jeweils in einer Zeile: „disable `experimental.lazyBarrel` by default“ und „fix(dev): disable lazy barrel in dev mode“, und die Verfolgung der Grundursache ist das neue [Issue #10085](https://github.com/rolldown/rolldown/issues/10085) „Tracking strictExecutionOrder correctness and architecture issues“, eröffnet am Tag nach dem Release. Das Release folgt auf [Rolldown v1.1.3](https://github.com/rolldown/rolldown/releases/tag/v1.1.3) (2026-06-24) und ist das erste Release seit 1.1.0, das die lazyBarrel-Konfigurationsoberfläche anfasst.
Prettier 3.9 überholt fünf Parser: micromark für Markdown, yaml v2, GraphQL.js v17, ein Rust-basierter Flow-Parser und Angular
javascript

Prettier 3.9 überholt fünf Parser: micromark für Markdown, yaml v2, GraphQL.js v17, ein Rust-basierter Flow-Parser und Angular

Prettier 3.9.0, veröffentlicht am 27. Juni 2026 (prettier/prettier, Blogpost von Fisker Cheung), ist eine parserlastige Version, die Markdown von remark-parse v8 auf micromark v4 hebt (bessere CommonMark- und GFM-Konformität sowie eine Reihe lange bestehender Parsing-Bugs behoben), YAML auf yaml v2, GraphQL auf GraphQL.js v17 (Fragment-Argumente und Direktiven auf Direktivdefinitionen), Flow auf den neuen Rust-basierten oxidized-Parser des Flow-Teams (rund 37 % schneller bei Prettiers gültigen Flow-Fixtures und 43 % schneller bei flow_parser.js in lokalen Parser-only-Benchmarks) und Angular. Auch der JavaScript- und TypeScript-Printer wurde überarbeitet, insbesondere im --no-semi-Modus, wo Kommentare um break und continue jetzt über mehrere Durchläufe stabil sind (ein Idempotenz-Fix), sowie redundante Klammern in return, die Ausrichtung von eingebetteten Template-Interpolationen und das Inlining von logischen Negationen. Die Version entfernt die veraltete import ... assert {}-Syntax (Babel 8 hat das Parser-Plugin entfernt; migriert zu with), repariert eine stillschweigend defekte Option --cache-strategy content und verhindert, dass EditorConfig-Dateien oberhalb von Git-Worktrees einsickern. Das Team erinnert daran, die genaue Version in der package.json festzupinnen, da die Formatierungsänderungen Diffs erzeugen.
Playwright v1.61.0: WebAuthn-Passkeys, eine echte WebStorage-API und Trace-artige Video-Modi für den Test-Runner
javascript

Playwright v1.61.0: WebAuthn-Passkeys, eine echte WebStorage-API und Trace-artige Video-Modi für den Test-Runner

Playwright v1.61.0 (15. Juni 2026) liefert einen virtuellen Authenticator für WebAuthn/Passkey-Zeremonien, eine erstklassige page.localStorage / page.sessionStorage-API, Netzwerk-Security-Details auf APIResponses und bringt die Video-Aufzeichnung des Test-Runners auf Parität mit der Trace-Aufzeichnung. Browser-Kanäle: Chromium 149, Firefox 151, WebKit 26.5.

Kommentare

Anmelden Melden Sie sich an, um an der Diskussion teilzunehmen.

Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.