Menu

HTML textarea 文本域:rows、resize、maxlength 与默认文本

如何用 <textarea> 制作多行文本框:rows 和 cols、写在标签之间的默认文本、调整大小与自动增高、带字数统计的 maxlength、提交文本中的换行,以及样式设置。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

如何创建 textarea

<textarea> 是可以输入多行内容的文本框,适合留言、评论和描述。rows 以行数设置它的可见高度。输入几行文字,然后点击 Send:

它和 <input> 有两点不同:textarea 需要结束标签,而且它的初始文本写在标签之间,而不是写在 value 属性里。提交时,它的 name 和文本一起发送,文本作为值,其中的换行也会保留。

textarea 属性

属性作用
name发送文本时使用的键名
rows以行数计的可见高度(默认 2)
cols以字符数计的可见宽度(默认 20);通常用 CSS width 更好
placeholder内容为空时显示的提示
maxlength, minlength以字符计的长度限制
required不能为空
readonly可以选中和复制,但不能编辑;仍会发送
disabled无法使用;不会发送
wrapsoft(默认)或 hard,见下文
spellchecktrue 或 false

默认文本写在标签之间

<textarea> 和 </textarea> 之间的所有内容都是初始文本,原样保留:空格、制表符和换行都算在内。只有紧跟在开始标签后面的一个换行会被忽略。所以缩进是一个陷阱:

第二个 textarea 以四个空格开头,又以一个换行加两个空格结尾,读者必须把它们全部删掉。默认文本要紧贴标签书写。

textarea 里的 HTML 不会被渲染;标签之间的 <b>hi</b> 会按字面显示成这段文字。

宽度、调整大小与自动增高

浏览器允许读者拖动右下角来调整 textarea 的大小。CSS resize 可以限制这一点,而 width: 100% 加上 box-sizing: border-box 能让它正好填满容器:

最后一个在每次按键时先重置高度,再把高度设为 scrollHeight(内容加内边距的高度)再加上边框。在里面输入几行试试:它永远不会出现滚动条。resize: vertical 是最友好的默认选择:长回答有足够空间,也没人能把输入框拖得比布局还宽。

Chromium 内核的浏览器只用 CSS 的 field-sizing: content 就能实现自动增高。不支持它的浏览器会忽略这一行,保持正常大小,所以加上它是安全的;但如果希望每位读者都能看到自动增高的输入框,就保留这段脚本。

maxlength 与字数统计

maxlength 在达到指定字符数时停止输入。单独使用时它不会给出任何提示,读者只有在打不出字时才会发现。加一个计数器就能解决这个问题:

aria-describedby 让屏幕阅读器在读输入框时一并读出计数器,aria-live="polite" 则会在按键间隙播报它的变化。maxlength 只由浏览器执行,所以服务器也必须检查长度。

提交文本中的换行

读者输入的换行会随文本一起发送。在提交的数据中,每个换行都会变成一对回车符和换行符(在 URL 编码的表单中是 %0D%0A),这也是大多数服务器所期望的格式。之后要在页面上显示这段文本并保留换行,可以在输出时把换行转换成 <br>,或者给元素加上 white-space: pre-line 样式。

wrap="hard"(需要配合 cols)更进一步:它还会在文本视觉上自动折行的位置插入换行,这样服务器收到的每一行都不超过 cols 个字符。默认的 wrap="soft" 只发送读者自己输入的换行。

设置 textarea 样式

Chrome 和 Firefox 给 textarea 使用约 13px 的等宽字体,这就是 textarea 常常显得格格不入的原因。font: inherit 可以解决这个问题。如果你修改了边框,要保留清晰可见的焦点样式:

placeholder 文本的对比度要足够清晰;很多设计用的浅灰色很难看清。而且和所有输入框一样,placeholder 不是标签:读者一开始输入它就消失了。标签的用法见 HTML label。

常见错误

  • <textarea value="...">。 它没有 value 属性;要把文本写在标签之间。
  • 让默认文本跟着 HTML 一起缩进。 这些空格会成为值的一部分。
  • 自闭合的 <textarea />。 它不是空元素;没有 </textarea>,页面的剩余部分都会被当作文本吞进去。
  • 没有写 font: inherit,导致输入框使用很小的等宽字体。
  • resize: none 配上很小的固定高度。 长回答只能挤在一个需要滚动的小框里。
  • 只依赖 maxlength。 在服务器端也要验证长度。

常见问题

HTML 中如何创建 textarea?

在表单里写 <textarea name="message" rows="4"></textarea>,并配上一个 <label>。和 <input> 不同,它有结束标签,标签之间的内容就是初始文本。

如何设置 textarea 的默认值?

把文本写在标签之间:<textarea name="bio">Hello</textarea>。在 HTML 中,textarea 没有 value 属性。在 JavaScript 中,用 textarea.value 读取和设置它的内容。

如何禁止调整 textarea 的大小?

在 CSS 中设置 resize: none。通常 resize: vertical 更友好:读者仍然可以为长文本把它拉高,但无法把它拖宽而破坏你的布局。

如何限制 textarea 的字符数?

加上 maxlength="280"。达到这个长度后,浏览器就不再接受输入。在旁边显示一个计数器,在 input 事件中更新,让读者知道还剩多少字,同时也要在服务器端检查长度。

为什么我的 textarea 字体和页面不一样?

Chrome 和 Firefox 默认给 textarea 使用约 13px 的等宽字体。加上 font: inherit,让它和页面其他部分保持一致。

Coddy 编程语言插图

和 Coddy 一起学编程

开始