テキストエリアの作り方
<textarea> は複数行のためのテキスト欄で、メッセージ、コメント、説明などに使います。rows で見える高さを行数で決めます。何行か入力して Send を押してみてください。
<input> とは 2 つの点が違います。textarea には終了タグが必要で、最初のテキストは value 属性ではなくタグの間に書きます。送信時には name と一緒に、改行も含めたテキストが値として送られます。
テキストエリアの属性
| 属性 | 働き |
|---|---|
name | テキストを送るときのキー |
rows | 見える高さを行数で指定 (初期値 2) |
cols | 見える幅を文字数で指定 (初期値 20)。たいていは CSS の width のほうがよい |
placeholder | 空の間に表示されるヒント |
maxlength、minlength | 文字数での長さの制限 |
required | 空にできない |
readonly | 選択とコピーはできるが編集できない。送信はされる |
disabled | 使えない。送信もされない |
wrap | soft (初期値) または hard。下で説明 |
spellcheck | true または false |
初期値はタグの間に書く
<textarea> と </textarea> の間にあるものはすべて、空白、タブ、改行も含めて書いたとおりに最初のテキストになります。無視されるのは開始タグの直後の改行 1 つだけです。そのため、インデントが落とし穴になります。
2 つ目のテキストエリアは 4 つの空白で始まり、改行ともう 2 つの空白で終わっています。読者はそれを全部消さなければなりません。初期値のテキストはタグにくっつけて書きましょう。
textarea の中の HTML は描画されません。タグの間の <b>hi</b> は、そのままの文字として表示されます。
幅、サイズ変更、自動で伸びる欄
ブラウザでは、読者が角をドラッグしてテキストエリアのサイズを変えられます。CSS の resize でそれを制限でき、width: 100% と box-sizing: border-box で入れ物の幅にぴったり合わせられます。
最後の欄は、キーを押すたびに高さをリセットし、scrollHeight (中身と padding の高さ) に枠線を足した値に設定しています。何行か入力してみてください。スクロールバーは表示されません。いちばん親切な初期設定は resize: vertical です。長い回答には場所があり、誰もレイアウトより広く欄をドラッグできません。
Chromium 系のブラウザでは、field-sizing: content を使えば CSS だけで自動で伸ばせます。対応していないブラウザはこの行を無視して普通のサイズのままにするので、追加しても安全です。ただ、すべての読者に伸びる欄を提供したいならスクリプトは残しましょう。
maxlength と文字数カウンター
maxlength は入力を決まった文字数で止めます。それだけでは何の警告も出ないので、読者は入力できなくなって初めて気づきます。カウンターがあれば解決します。
aria-describedby を使うと、スクリーンリーダーは入力欄と一緒にカウンターを読み上げ、aria-live="polite" はキー入力の合間にその変化を伝えます。maxlength を守らせるのはブラウザだけなので、サーバーでも長さをチェックする必要があります。
送信されるテキストの改行
読者が入れた改行はテキストと一緒に送られます。送信データでは、それぞれが復帰と改行の組 (URL エンコードされたフォームでは %0D%0A) になり、ほとんどのサーバーはこれを想定しています。後でそのテキストを改行付きでページに表示するには、出力時に <br> に変換するか、要素に white-space: pre-line を指定します。
wrap="hard" (cols が必要です) はさらに、見た目上折り返された位置にも改行を入れるので、サーバーは cols 文字以下の行を受け取ります。初期値の wrap="soft" は、読者が入力した改行だけを送ります。
テキストエリアのデザイン
Chrome と Firefox は textarea に約 13px の等幅フォントを使うので、テキストエリアだけ浮いて見えることがよくあります。font: inherit で直せます。枠線を変えるなら、フォーカスのスタイルは見えるように残しましょう。
プレースホルダーのテキストは読めるコントラストにしましょう。多くのデザインで使われる薄いグレーは読みにくいです。そして、ほかの入力欄と同じく、プレースホルダーはラベルではありません。読者が入力を始めると消えてしまいます。ラベルについては HTML の label で解説しています。
よくある間違い
<textarea value="...">と書く。value属性はありません。タグの間にテキストを書きましょう。- HTML に合わせて初期値のテキストをインデントする。 空白が値の一部になります。
- 自己終了の
<textarea />と書く。 空要素ではないので、</textarea>がないとページの残りがテキストとして中に取り込まれます。 font: inheritがない。 入力欄が小さな等幅フォントになります。- 小さな固定の高さで
resize: noneにする。 長い回答が小さなスクロールする箱に押し込まれます。 maxlengthだけに頼る。 サーバーでも長さをチェックしましょう。
よくある質問
HTML でテキストエリアを作るにはどうすればいいですか?
フォームの中に <label> と一緒に <textarea name="message" rows="4"></textarea> と書きます。<input> と違って終了タグがあり、タグの間に書いたものが最初のテキストになります。
テキストエリアの初期値を設定するには?
タグの間にテキストを書きます: <textarea name="bio">Hello</textarea>。HTML の textarea には value 属性がありません。JavaScript では textarea.value を読み書きします。
テキストエリアのサイズを変更できないようにするには?
CSS で resize: none を指定します。たいていは resize: vertical のほうが親切です。長いテキストのために高さは広げられますが、横にドラッグしてレイアウトを崩すことはできません。
テキストエリアの文字数を制限するには?
maxlength="280" を付けます。ブラウザはその長さで入力を受け付けなくなります。残りの文字数がわかるよう、input イベントで更新するカウンターを横に表示し、サーバーでも長さをチェックしましょう。
テキストエリアのフォントが違うのはなぜですか?
Chrome と Firefox は textarea に初期状態で約 13px の等幅フォントを使います。font: inherit を付けると、ページのほかの部分と揃います。