textarea必须成对闭合,不可自闭合;rows和cols仅为布局提示,不约束输入长度;name属性缺失将导致后端收不到数据;placeholder不支持换行,仅适合简短提示。

textarea 必须成对写,不能自闭合
写错成 <textarea></textarea> 或漏掉结束标签,浏览器会把它当成普通文本渲染,甚至破坏后续 DOM 结构。它和 <input> 不同,没有自闭合形式,必须显式写 <textarea>内容</textarea>。
常见错误现象:输入框不显示、placeholder 不出现、表单提交时字段为空——十有八九是标签没闭合或写成了自闭合。
- 正确写法:
<textarea name="desc">默认文字</textarea> - 错误写法:
<textarea name="desc"></textarea>、<textarea name="desc"></textarea>(缺结束标签) - 如果内容为空,也得保留闭合标签:
<textarea name="note"></textarea>,不能省略
rows 和 cols 是布局提示,不是硬约束
rows 控制初始可见行数,cols 控制等宽字体下的近似字符宽度,两者都不限制用户实际能输多少内容,也不影响换行逻辑。它们只是告诉浏览器“大概画多高多宽”,最终尺寸仍会被 CSS 覆盖或重排。
容易踩的坑是只设 rows 不设 cols,某些浏览器(尤其是旧版 Safari)会把宽度压到极窄,导致文字横向溢出或自动折行异常。
立即学习“前端免费学习笔记(深入)”;
- 推荐组合:
rows="4" cols="50"作为 fallback,再用 CSS 的width和min-height精确控制 - 移动端慎用
cols:字体渲染差异大,cols="30"在 iOS 上可能只显示 20 个字宽 -
rows值为 0 或负数会被忽略,浏览器按默认值(通常是 2)渲染
name 属性缺失 = 后端收不到数据
表单提交时,只有带 name 的 textarea 才会生成键值对传给后端。id 或 class 都不能替代它。漏掉 name 是最隐蔽的“功能正常但数据丢失”问题。
常见错误场景:用 JS 动态插入 textarea,但忘了赋值 name;或者复制代码时删掉了属性却没补上。
- 必须写:
<textarea name="content">...</textarea> - 不要只写:
<textarea id="content">...</textarea>(后端 request.Form["content"] 会返回空) - 若需多个同类字段,用数组式命名:
name="tags[]"或name="items[0].desc",后端解析更方便
placeholder 换行会被折叠,别指望它展示多行示例
placeholder 文本在所有主流浏览器中都会被强制压缩成一行显示,即使你写了 placeholder="第一行
第二行" 或含 \n 的字符串,它也不会换行。这是规范行为,不是 bug。
想引导用户输入多行内容,得靠其他方式:比如在 label 里说明“请分段填写”,或用 JS 动态注入示例文本到 textarea 内容体中(而非 placeholder)。
- placeholder 只适合简短提示:
placeholder="请输入反馈意见" - 避免写长文本或含换行符的 placeholder,视觉上反而显得拥挤或错位
- focus 后 placeholder 立即消失,无法作为格式参考,这点和
input完全一致
resize: vertical 和 overflow: auto 的组合会影响滚动条出现时机,而用户是否能看清自己输入的全部内容,往往取决于这一组样式是否稳定生效。



















