textarea必须成对闭合,value属性无效,预设内容须写在标签体内;rows和cols仅作布局提示,推荐配合CSS控制;name属性缺失将导致后端收不到数据;placeholder不支持换行;换行符需服务端统一规范化。

textarea必须成对闭合,不能自闭合
浏览器不认 <textarea></textarea> 或 <textarea></textarea> 这种写法——前者是非法语法,后者漏了内容体,实际会被解析为普通文本或破坏后续 DOM。最常见后果:输入框不显示、placeholder 不出现、表单提交时字段为空。
正确写法只有一种:<textarea name="content"></textarea>(空内容也要闭合),或带默认值:<textarea name="draft">欢迎编辑</textarea>。注意:value 属性对 textarea 无效,预设内容必须写在标签体内。
rows 和 cols 只是布局提示,不是硬限制
rows 控制初始可见行数(默认 2),cols 控制等宽字体下的近似字符宽度(默认 20)。它们既不限制输入长度,也不影响换行逻辑,更可能被 CSS 覆盖。
- 旧版 Safari 对
cols特别敏感,只设rows="4"不设cols会导致宽度极窄、文字横向溢出 -
rows="0"或负数会被忽略,浏览器按默认值渲染 - 移动端慎用
cols:iOS 和 Android 字体渲染差异大,cols="30"在不同设备上显示宽度可能差一倍
推荐做法:rows="4" cols="50" 作 fallback,再用 CSS 的 width、min-height 精确控制,并加 resize: vertical 允许用户拉高。
立即学习“前端免费学习笔记(深入)”;
name 属性缺失 = 后端收不到数据
表单提交时,只有带 name 的 textarea 才会生成键值对传给后端。id、class、data-* 都替代不了它。这是“前端看着正常、后端 request.Form 拿不到值”的头号原因。
容易踩坑的场景:
- 用 JS 动态插入
textarea,但忘了赋name - 复制代码时删掉了
name却没补上 - 用数组式命名但写错格式,比如
name="items[0].desc"写成name="items.0.desc",后端解析失败
务必写:<textarea name="comment"></textarea>;不要只写:<textarea id="comment"></textarea>。
placeholder 不支持换行,别指望它展示多行示例
无论你在 placeholder 里写 "第一行\n第二行" 还是手动敲回车,所有主流浏览器都会把它折叠成一行显示。这不是 bug,是规范行为。
想引导用户分段输入,有更靠谱的做法:
- 在
<label></label>里说明:“请分段填写,每段以空行隔开” - 用 JS 初始化时往
textarea.value注入示例文本(不是 placeholder) - 配合
required+maxlength做基础校验,但必须同步做服务端验证——前端限制可被绕过
真正容易被忽略的是换行符本身:textarea 提交的换行在 Windows 是 \r\n,macOS/Linux 是 \n,服务端处理前得统一规范化,否则数据库存、搜索、展示都可能出问题。



















