useAutosize
テキストエリアを、書いた内容に合わせて最小の高さと最大の高さの間で伸ばします。変化ごとにアニメーションしますが、テキストには一切触れません。
pnpm dlx shadcn@latest add https://hextaui.com/r/use-autosize.jsonフックと、その依存関係をプロジェクトに追加します。
次のコードをコピーしてプロジェクトに貼り付けてください。
hooks/use-autosize.ts インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
<Textarea autoResize> はすでにこのフックを使っています。チャットのコンポーザーやインラインエディターのように、独自の <textarea> を描画する場合は、自分で呼び出してください。
変更のたびに、フックは高さを auto にして本来の scrollHeight を読み取り、要素自身の CSS の min-height と max-height の範囲に収めます。これらはすべて描画前に行われるため、縮んだフレームが見えることはありません。範囲は CSS 側に残るので、レスポンシブにしたり、lh で行数を指定したりできます。
- 高さの変化は180msでアニメーションし、アニメーションの途中で来た変更は現在の高さから始まるため、素早く入力してもジャンプしません。視差効果の軽減が有効な場合、高さは即座に切り替わります。
max-heightを超えると textarea はスクロールします。それ以外ではスクロールバーは隠れたままなので、新しい行のたびに点滅しません。- テキストの折り返し方が変わると高さが変わるため、幅が変わったときに再調整します。
windowのinputを監視し、計測するだけです。値の読み取りも書き込みも行わないため、キー入力が遅れたり失われたりすることはありません。
制御される値
入力では input が発火しますが、コードから value を設定しても発火しません。値を第3引数に渡すと、テンプレートの挿入やクリアの際に textarea が再調整します。
rows={1}とresize-noneを設定してください。手動のリサイズハンドルは自動の高さと競合します。enabledをオフにするかアンマウントすると、インラインの高さと overflow が取り除かれ、サイズが CSS に戻されます。- タッチスクリーンでは、textarea に16px以上のテキストを使ってください。そうしないと、フォーカス時に iOS がズームします。
| プロパティ | 型 | デフォルト |
|---|---|---|
refサイズ調整する textarea。 | RefObject<HTMLTextAreaElement | null> | – |
enabled自動でサイズ調整するかどうか。 | boolean | – |
value制御される値。非制御の textarea には undefined を渡します。 | unknown | – |
Textarea と InputGroupTextarea。
- Motionすべてのコンポーネントがアニメーションに使うイージングカーブ、継続時間、モーション軽減のチェックと、サイズのモーフィングやスライドするハイライト用のフックです。
- Input3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。
- Input groupアイコン、テキスト、ボタン、キーボードのヒントを付けられる入力欄です。1つのボーダーとフォーカスリングを共有します。
- Textarea最小行数と最大行数の間で、書いた内容に合わせて滑らかに伸びる複数行テキストです。カウンター、バリデーション、送信ショートカットを備えています。