CSS · Formulare · UX · field-sizing · Auto-resize
CSS field-sizing
Textareas automatisch skalieren ohne JavaScript

Die neue CSS-Eigenschaft field-sizing macht die bewährten JavaScript-Tricks für automatisch wachsende Textareas überflüssig. Mit field-sizing: content passt sich ein Formularfeld ab der ersten Eingabe an seinen Inhalt an — nativ im Browser, ohne Event-Listener und ohne Layout-Hacks.

8 Min. Lesezeit field-sizing · content · fixed · auto-grow · Textarea · Input Chrome 123+ · Edge 123+ · (Firefox in Entwicklung)

1. Das JavaScript-Problem bei Auto-resize-Textareas

Das automatische Wachsen einer Textarea beim Tippen ist eine der häufigsten UX-Anforderungen in Webformularen — und gleichzeitig eines der langwierigsten Probleme, die bisher kein natives CSS lösen konnte. Der klassische Ansatz: Ein input-Event-Listener liest die Scrollhöhe des Textareas aus (element.scrollHeight), setzt die Höhe auf auto, liest die Scrollhöhe erneut aus und setzt die Höhe dann auf diesen Wert. Dieser Trick funktioniert, hat aber multiple Probleme: Er erfordert JavaScript beim initialen Load, erzeugt einen doppelten Reflow pro Eingabe-Ereignis und kann bei schnellem Tippen zu sichtbarem Flackern führen.

Modernere Ansätze umgehen den doppelten Reflow durch CSS-Tricks: Ein verstecktes Element mit identischen Stilen und demselben Inhalt gibt die korrekte Höhe vor, oder das Textarea wird in einen Grid-Container verpackt, der die Höhe über ein Pseudo-Element steuert. Alle diese Lösungen sind Workarounds für ein Problem, das idealerweise der Browser nativ lösen sollte. Genau das tut CSS field-sizing: Es delegiert die Größenberechnung an den Browser, der direkt auf den internen Layout-Mechanismus zugreifen kann, ohne JavaScript-Roundtrips.

2. Was ist CSS field-sizing?

CSS field-sizing ist eine neue CSS-Eigenschaft, die steuert, wie Formularelemente ihre intrinsische Größe berechnen. Die Eigenschaft hat zwei Werte: fixed (das bisherige Standardverhalten, bei dem width und height-Attribute sowie size-Attribute die Größe bestimmen) und content (das neue Verhalten, bei dem die Größe automatisch an den Inhalt angepasst wird). Mit field-sizing: content verhält sich eine Textarea wie ein Block-Element mit height: auto, dessen Höhe vom enthaltenen Text bestimmt wird.

Die Eigenschaft wurde von Google Chrome implementiert und ist seit Chrome 123 und Edge 123 verfügbar. Firefox hat Unterstützung angekündigt, aber zum Zeitpunkt der Erstellung dieses Artikels noch nicht ausgeliefert. Safari hat ebenfalls keine Unterstützung. Das bedeutet: field-sizing ist eine Progressive-Enhancement-Funktion — Entwickler können sie heute verwenden, müssen aber robuste Fallbacks für Browser ohne Unterstützung implementieren.


/* CSS field-sizing: the simplest auto-growing textarea */
textarea {
  field-sizing: content;
  /* That's it — the textarea now grows with content */
}

/* With sensible constraints */
textarea.comment-field {
  field-sizing: content;
  min-height: 5rem;          /* Minimum height when empty */
  max-height: 20rem;         /* Maximum before scroll kicks in */
  width: 100%;
  resize: none;              /* Hide manual resize handle when auto-sizing */
  overflow-y: auto;          /* Scroll within max-height */
}

/* Auto-sizing text input — grows to fit its content */
input[type="text"].auto-width {
  field-sizing: content;
  min-width: 8rem;
  max-width: 100%;
}

/* Select element — sized to match longest option */
select.auto-size {
  field-sizing: content;
}

3. field-sizing: content im Detail

Mit field-sizing: content entfernt der Browser die feste Größengebung durch HTML-Attribute und CSS-Höhen/-Breiten-Defaults für das jeweilige Formularelement. Stattdessen wird die Größe wie bei regulären Block- oder Inline-Elementen berechnet: Die Höhe einer Textarea ergibt sich aus der Anzahl der Zeilen, die der aktuelle Text einnimmt, multipliziert mit der line-height, plus die Padding-Werte. Wenn der Nutzer tippt und eine neue Zeile beginnt, wächst das Element unmittelbar — ohne JavaScript, ohne Event-Handler, ohne doppelten Reflow.

Dabei respektiert CSS field-sizing: content alle Standard-CSS-Größeneigenschaften. min-height und max-height funktionieren wie erwartet: Das Element wächst nie unter min-height und nie über max-height. Oberhalb von max-height springt der Browser automatisch auf Scroll-Verhalten um, wenn overflow-y: auto gesetzt ist. Das Zusammenspiel dieser drei Eigenschaften gibt Entwicklern vollständige Kontrolle über das Skalierungsverhalten, ohne JavaScript-Code zu schreiben.

4. field-sizing: fixed — das Standardverhalten

Der Wert field-sizing: fixed entspricht dem bisherigen Standardverhalten aller Browser für Formularelemente. Bei fixed wird die Größe durch HTML-Attribute (rows, cols, size), explizite CSS-Werte (width, height) oder Browser-Defaults bestimmt. Das Textarea hat eine feste Höhe, der Nutzer kann durch manuelles Ziehen vergrößern (wenn resize nicht auf none gesetzt ist), aber der Inhalt ändert die Elementgröße nicht automatisch.

Es gibt Situationen, in denen fixed das richtige Verhalten ist — etwa wenn ein Formular ein strukturiertes Layout hat und eine Textarea einen bestimmten Bereich ausfüllen soll, unabhängig vom Inhalt. In solchen Fällen ist es semantisch besser, field-sizing: fixed explizit zu setzen, als auf den Default zu vertrauen — so ist das Verhalten dokumentiert und intentional. Die meisten modernen Chat- und Kommentar-Interfaces profitieren hingegen von field-sizing: content, da sie den Nutzer nicht zwingen, in einem zu kleinen oder zu großen Feld zu tippen.


/* Auto-growing chat input with constraints */
.chat-input-container {
  display: flex;
  align-items: flex-end;
  gap: 0.5rem;
  padding: 1rem;
  border-top: 1px solid rgb(226 232 240);
}

.chat-input {
  flex: 1;
  field-sizing: content;
  min-height: 2.5rem;          /* Single line height */
  max-height: 8rem;            /* ~4 lines before scroll */
  padding: 0.5rem 0.75rem;
  border-radius: 1.25rem;
  border: 1px solid rgb(203 213 225);
  resize: none;
  overflow-y: auto;
  line-height: 1.5;
  font-family: inherit;
  font-size: 0.875rem;
}

.chat-input:focus {
  outline: none;
  border-color: rgb(124 58 237);
  box-shadow: 0 0 0 3px rgb(196 181 253 / 0.5);
}

/* Send button aligns to bottom when textarea grows */
.send-button {
  flex-shrink: 0;
  align-self: flex-end;
  height: 2.5rem;
  width: 2.5rem;
  border-radius: 50%;
  background: rgb(124 58 237);
  color: white;
}

5. min-height und max-height kombinieren

Die effektivste Nutzung von CSS field-sizing: content kombiniert die Eigenschaft mit min-height und max-height. Ohne min-height würde eine leere Textarea auf die Höhe einer leeren Zeile schrumpfen — oft nur wenige Pixel hoch, was für Nutzer schwer zu erkennen und zu bedienen ist. Mit min-height: 3rem oder ähnlichen Werten bleibt das Feld immer mindestens so hoch wie eine vernünftige Eingabefläche, auch wenn es leer ist.

max-height verhindert, dass das Feld bei sehr langem Text den gesamten Viewport einnimmt. Kombiniert mit overflow-y: auto scrollt das Feld intern, sobald der Inhalt max-height überschreitet. Das ist das Standardverhalten vieler Chat-Apps und Kommentarfelder: Das Feld wächst bis zu einem Punkt, danach wird der ältere Inhalt durch Scrollen zugänglich. Ohne explizite overflow-Angabe würde der Text über max-height hinaus sichtbar sein, was zu Layout-Überlauf führt.


/* Full-featured auto-growing textarea with @supports */
@supports (field-sizing: content) {
  /* Modern browsers: pure CSS solution */
  .auto-textarea {
    field-sizing: content;
    min-height: 4rem;
    max-height: 16rem;
    overflow-y: auto;
    resize: none;
    /* Smooth height transitions */
    transition: height 0.1s ease;
  }
}

@supports not (field-sizing: content) {
  /* Fallback: JS-driven resize via data attribute */
  .auto-textarea {
    /* Base styles for JS enhancement */
    min-height: 4rem;
    resize: vertical;
    overflow: hidden;
  }
  /* JS adds data-replicated-value and drives height */
}

/* Input that expands with typed content */
.tag-input {
  field-sizing: content;
  min-width: 4ch;              /* Minimum: 4 characters wide */
  max-width: 30ch;
  overflow: hidden;
}

6. Weitere unterstützte Formularelemente

CSS field-sizing funktioniert nicht nur für Textareas — es unterstützt auch andere Formularelemente. Bei <input type="text"> und anderen Text-Inputs bewirkt field-sizing: content, dass die Breite des Felds dem eingetippten Text entspricht, anstatt eine feste Breite zu haben. Das ist nützlich für Tag-Eingabefelder, Inline-Editoren und andere Interfaces, bei denen das Input-Feld nur so breit sein soll wie sein Inhalt.

Bei <select>-Elementen bewirkt field-sizing: content, dass die Breite der längsten verfügbaren Option entspricht statt einer Browser-Default-Breite. Bei Number-Inputs passt sich die Breite der Anzahl der Stellen der eingegebenen Zahl an. Das Verhalten ist konsistent: Das Element zeigt seinen Placeholder oder seinen aktuellen Wert an und nimmt genau so viel Platz ein wie dieser Inhalt benötigt, respektiert aber immer min-width/max-width-Grenzen.

7. Browser-Support und aktuelle Situation

Zum Zeitpunkt dieses Artikels (Mai 2026) unterstützen Chrome ab Version 123 und Edge ab Version 123 CSS field-sizing vollständig. Firefox hat die Eigenschaft auf seiner Roadmap, aber noch nicht ausgeliefert. Safari hat ebenfalls noch keine Unterstützung angekündigt. Das ergibt eine Situation, in der field-sizing in Chromium-Browsern funktioniert, aber für Safari und Firefox-Nutzer ein Fallback benötigt wird.

Die Strategie für Produktionsprojekte ist daher Progressive Enhancement mit @supports: Wenn der Browser field-sizing: content unterstützt, wird die native CSS-Lösung genutzt. Für alle anderen Browser bleibt die bewährte JavaScript-basierte Resize-Logik aktiv. Das ist kein Rückschritt — Nutzer von Chrome und Edge profitieren sofort von der saubereren Lösung, während die Erfahrung für Safari- und Firefox-Nutzer unverändert bleibt.

8. field-sizing vs. JavaScript-Lösungen im Vergleich

Die technischen Unterschiede zwischen CSS field-sizing und JavaScript-basierten Auto-resize-Implementierungen sind erheblich. Die CSS-Lösung läuft direkt im Rendering-Prozess des Browsers, ohne JavaScript-Roundtrip und ohne doppelten Layout-Reflow. JavaScript-Lösungen setzen mindestens einen Reflow pro Tastendruck voraus — oft sogar zwei, wenn die Scroll-Height-Methode verwendet wird.

Kriterium field-sizing: content JS scrollHeight-Trick CSS Grid-Trick
JavaScript nötig Nein Ja Ja (minimal)
Reflows pro Eingabe 0 2 1
max-height Support Nativ Manuell Manuell
SSR-kompatibel Ja Nur Client Ja
Browser-Support 2026 Chrome/Edge 123+ Alle Browser Alle Browser

Der CSS-Grid-Trick verdient eine kurze Erklärung: Das Textarea wird in ein Grid-Element eingebettet, und ein verstecktes div mit demselben Inhalt gibt die korrekte Höhe vor. Dieser Ansatz vermeidet den doppelten Reflow der scrollHeight-Methode, erfordert aber JavaScript für die Inhaltssynchronisation. Für Projekte, die alle Browser unterstützen müssen, bleibt er die bevorzugte Fallback-Methode, bis field-sizing breiteren Support hat.

9. Fallback-Strategien für ältere Browser

Die empfohlene Fallback-Strategie nutzt @supports um native und JS-basierte Implementierung zu trennen. Der Kern des Fallbacks ist der Grid-Container-Trick: Das Textarea und ein verstecktes data-replicated-value-Attribut-gesteuertes Pseudo-Element befinden sich im selben Grid-Container. JavaScript synchronisiert den Textarea-Inhalt mit dem data-replicated-value-Attribut, das CSS nutzt, um die Höhe des Containers zu berechnen. Das Textarea übernimmt die Höhe des Containers automatisch über height: 100%.

Für Hyvä-Projekte mit Alpine.js ist der Fallback besonders elegant implementierbar: Alpine's x-model-Direktive synchronisiert den Textarea-Inhalt mit einer reaktiven Variable, die gleichzeitig das versteckte Element befüllt. Mit @supports (field-sizing: content) wird die Alpine-Logik dann nur geladen, wenn der Browser field-sizing nicht nativ unterstützt — das minimiert unnötigen JavaScript-Code in modernen Browsern.

Mironsoft

Moderne CSS-Formulare, UX-Optimierung und Performance-fokussiertes Frontend

Formulare, die sich wie native Apps anfühlen?

Wir implementieren moderne CSS-Formular-Patterns — von field-sizing und auto-wachsenden Textareas über fokussiertes Accessibility-Design bis zu progressiv enhancten Formularerlebnissen mit korrekten Fallbacks für alle Browser.

Form-Audit

Analyse bestehender Formular-Implementierungen auf JS-Overhead und UX-Probleme

CSS-Migration

JS-Resize-Hacks durch field-sizing mit @supports-Fallbacks ersetzen

Alpine.js Integration

Elegante Fallback-Implementierung für Hyvä-Projekte mit minimalem JS-Footprint

10. Zusammenfassung

CSS field-sizing: content ist die lang erwartete native Lösung für automatisch wachsende Textareas und Formularfelder. Die Eigenschaft delegiert die Größenberechnung an den Browser-eigenen Layout-Algorithmus, was null JavaScript-Roundtrips und null zusätzliche Reflows bedeutet. In Kombination mit min-height, max-height und overflow-y: auto entsteht ein vollständiges, flexibles Auto-Resize-System rein in CSS.

Die aktuelle Einschränkung ist der Browser-Support: Chrome und Edge unterstützen field-sizing seit Version 123, Firefox und Safari noch nicht. Die empfohlene Implementierungsstrategie ist Progressive Enhancement mit @supports (field-sizing: content): Moderne Browser nutzen die CSS-Lösung, ältere Browser erhalten den bewährten JavaScript-basierten Fallback. Mit dieser Strategie kann field-sizing heute in Produktionsprojekten eingesetzt werden.

CSS field-sizing — Das Wichtigste auf einen Blick

Kernwert

field-sizing: content — Textarea wächst automatisch mit Inhalt. Kein JavaScript, kein Event-Listener, kein Reflow.

Constraints

min-height + max-height + overflow-y: auto — vollständige Kontrolle über Mindest- und Maximalhöhe mit internem Scrollen.

Browser-Support

Chrome 123+, Edge 123+. Firefox und Safari in Entwicklung. @supports für Progressive Enhancement nutzen.

Weitere Elemente

Auch für input[type=text], select und number inputs — Breite passt sich dem Inhalt an.

11. FAQ: CSS field-sizing und Auto-resize-Textareas

1Was macht field-sizing: content genau?
Textarea wächst automatisch mit Inhalt — kein JavaScript, kein Event-Listener, kein Reflow. Browser berechnet Größe wie bei regulären Block-Elementen.
2Welche Browser unterstützen field-sizing?
Chrome 123+, Edge 123+. Firefox und Safari noch nicht. @supports für Progressive Enhancement verwenden.
3Wie maximale Höhe begrenzen?
max-height + overflow-y: auto — Textarea scrollt intern wenn max-height erreicht. Ohne overflow würde Text überlaufen.
4Unterschied zu height: auto?
height: auto hat auf Textareas keine Wirkung. field-sizing: content überschreibt spezifisch die intrinsische Größenberechnung von Formularelementen.
5resize: none zusammen setzen?
In den meisten Fällen ja — manueller Resize-Handle ist bei auto-sizing überflüssig und visuell störend.
6Funktioniert es mit server-seitigem Inhalt (SSR)?
Ja — Vorteil gegenüber JS-Lösungen. Korrekte Höhe wird beim ersten Paint berechnet, auch bei vorab befüllten Textareas.
7Fallback für Firefox und Safari?
@supports not (field-sizing: content) für JS-Fallback. Grid-Container-Trick mit data-replicated-value ist die performanteste Alternative.
8Kann field-sizing auch Inputs breiter machen?
Ja — input[type=text] mit field-sizing: content passt Breite dem eingetippten Text an. Gut für Tag-Inputs und Inline-Editoren.
9Accessibility-Bedenken?
Grundsätzlich keine. Auf Scroll-Jump beim Wachsen achten — overflow-anchor und scroll-behavior helfen bei Kontrolle.
10Hyvä / Alpine.js Integration?
In unterstützenden Browsern kein Alpine nötig. Für Fallback: x-model synchronisiert Inhalt mit verstecktem Element für Grid-Trick.