useAutosize
Lässt eine Textarea mit dem Geschriebenen zwischen minimaler und maximaler Höhe wachsen und animiert jede Änderung, ohne je den Text anzufassen.
pnpm dlx shadcn@latest add https://hextaui.com/r/use-autosize.jsonFügt den Hook und alles, wovon er abhängt, zu deinem Projekt hinzu.
Kopiere den folgenden Code und füge ihn in dein Projekt ein.
hooks/use-autosize.ts Passe die Importpfade an dein Projekt-Setup an.
<Textarea autoResize> nutzt diesen Hook bereits. Rufe ihn selbst auf, wenn du dein eigenes <textarea> renderst, etwa einen Chat-Composer oder einen Inline-Editor.
Bei jeder Änderung setzt der Hook die Höhe auf auto, liest die natürliche scrollHeight und begrenzt sie auf min-height und max-height aus dem CSS des Elements. All das geschieht vor dem Paint, sodass du den eingeklappten Frame nie siehst. Die Grenzen bleiben in deinem CSS, können also responsiv sein oder lh nutzen, um Zeilen zu zählen.
- Höhenänderungen werden über 180ms animiert, und eine Änderung mitten in der Animation startet von der aktuellen Höhe, sodass schnelles Tippen nie springt. Bei reduzierter Bewegung springt die Höhe.
- Über
max-heighthinaus scrollt die Textarea. Ansonsten bleibt ihre Scrollleiste verborgen, damit sie nicht bei jeder neuen Zeile aufblitzt. - Er passt sich neu an, wenn sich die Breite ändert, da anders umbrechender Text die Höhe ändert.
- Er lauscht auf
inputanwindowund misst nur. Er liest oder schreibt nie den Wert, sodass Tastenanschläge nie verzögert oder verworfen werden.
Kontrollierte Werte
Tippen löst input aus, das Setzen von value aus dem Code jedoch nicht. Übergib den Wert als drittes Argument, und die Textarea passt sich neu an, wenn du eine Vorlage einfügst oder sie leerst.
- Setze
rows={1}undresize-none. Ein manueller Resize-Griff kämpft gegen die automatische Höhe. - Das Abschalten von
enabledoder das Unmounten entfernt die Inline-Höhe und das Overflow und gibt die Größe an dein CSS zurück. - Verwende auf Touchscreens mindestens 16px Text in der Textarea, sonst zoomt iOS beim Fokussieren hinein.
| Prop | Typ | Standard |
|---|---|---|
refDie Textarea, deren Größe angepasst wird. | RefObject<HTMLTextAreaElement | null> | – |
enabledOb automatisch dimensioniert wird. | boolean | – |
valueDer kontrollierte Wert. Übergib undefined für unkontrollierte Textareas. | unknown | – |
Textarea und InputGroupTextarea.
- MotionDie Easing-Kurven, Dauern und der Reduced-Motion-Check, mit denen jede Komponente animiert, plus Hooks für Größen-Morphs und gleitende Hervorhebungen.
- InputEin Texteingabefeld mit drei Größen, ungültigen und schreibgeschützten Zuständen, nativem Validierungsstyling und einer 16-px-Schrift für Touch, damit Smartphones nie hineinzoomen.
- Input groupEin Input mit angehängten Icons, Text, Buttons oder Tastaturhinweis, die sich einen Rahmen und einen Fokusring teilen.
- TextareaMehrzeiliger Text, der mit dem Geschriebenen zwischen einer minimalen und maximalen Zeilenzahl sanft wächst, mit Zählern, Validierung und Absende-Tastenkürzel.