<textarea>必须写成成对标签,自闭合或嵌套均无效;其value保留原始换行符,rows关乎可访问性,placeholder换行需CSS支持,禁用拖拽须设resize,服务端换行符需统一处理。

直接写 <textarea></textarea> 就是标准、兼容、可访问的多行文本结构;别试图用 <input type="text"> 加 JS 模拟,也别把 <textarea> 塞进 <div> 里包装——它天生就是独立双标签,强行“加”只会破坏换行语义和表单序列化。
为什么 <textarea> 不能写成自闭合或嵌套在 <input> 里
浏览器只认 <textarea>内容</textarea> 这种成对结构。写成 <textarea /> 或 <input></input> 会直接被解析为无效标签,内容不渲染、value 为空、表单提交时字段消失。
- DOM 中
textarea.value只读取标签体内的原始文本(含\n),而input.value永远不带换行符 - 移动端软键盘的“换行键”只对
<textarea>生效;<input type="text">按 Enter 会直接触发表单提交 - 屏幕阅读器会读出 “5 行文本框”,前提是用了
rows属性——这是可访问性刚需,不是“可有可无”
rows 和 cols 是布局起点,不是最终样式控制手段
rows 决定初始可见行数(影响可访问性提示),cols 是等宽字体下的字符宽度参考值,但实际渲染受字体、padding、line-height 影响极大。纯靠它们无法响应式适配。
- 设
rows="4"后又用style="height: 200px;",会导致滚动条行为异常(比如输入第 5 行时突然出现滚动) -
cols在非等宽字体下几乎失效;现代项目建议用 CSS 的width/min-width替代 - 若要禁用用户拖拽调整大小,必须加
style="resize: vertical;"或"resize: none;",否则默认允许任意方向拉伸
placeholder 换行无效?这不是 bug,是 HTML 规范行为
placeholder 属性值里的 \n 默认被忽略,因为规范将其视为普通内联文本,不解析换行。想实现多行占位提示,得靠 CSS 强制换行:
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
立即学习“前端免费学习笔记(深入)”;
textarea::placeholder {
white-space: pre-line;
}
注意:这仅影响 placeholder 显示,不影响用户输入内容;用户输入的 \n 仍会原样保留在 value 中传给后端。
- 不要在
<textarea>标签体里手动加空格或换行来“模拟 placeholder”,那会变成默认值,清空后仍残留 - 服务端收到的换行符可能是
\n或\r\n,统一用.replace(/\r\n/g, '\n')处理更稳妥 - 如果用 JS 动态设置 placeholder(如
el.placeholder = '第一行\n第二行'),同样需要上面的 CSS 才能生效
最易被忽略的是:哪怕你用 JS 实现了自适应高度,也要保留 rows 属性——它不只是视觉参数,更是无障碍支持的必要信号。没有它,屏幕阅读器不会告知用户这是“多行输入”,而只是读作“编辑框”。


















