后台留言功能上线,测试同事输了两行字,按回车直接提交了,第二行根本没录进去。查代码发现用的是 input,不是多行文本框。

textarea 才是多行输入

HTML 里单行输入用 input type=text,多行就得用 textarea。基本写法是 <textarea name=content rows=4 cols=40></textarea>,rows 控制显示几行,cols 控制宽度,高度也可以先用 rows 定个初值,实际大小一般再用 CSS 调。它不是自闭合标签,结束标签不能省。

默认值写在开始和结束标签中间,不要用 value 属性。placeholder 可以提示请输入留言,maxlength 限制字数,但只算字符,不算行数。表单提交时拿到的是纯文本,回车换行都在里面。

样式上常踩的坑

浏览器给 textarea 自带字体和边框,和页面风格不一致,用 font: inherit、border、padding 统一一下。右下角的拖拽手柄由 resize 控制,设成 none 就固定大小,设成 vertical 只能上下拉。宽度建议 100%,配合 box-sizing: border-box,不然会撑破容器。

换行和显示

用户按回车产生的是换行符,提交到后端存进数据库没问题。再显示到页面上,如果放在普通 div 里,换行会被当成空格,整段挤在一起。要么输出时用 nl2br 转成 br 标签,要么给容器加 white-space: pre-wrap。前者改变 HTML 结构,后者保留原文本,按场景选。

字数统计和移动端

要做还可以输入 200 字,监听 input 事件,读 value.length,中文和英文都按字符算。移动端有个细节:字号小于 16px,iOS 点进输入框会自动放大页面,把 font-size 设成 16px 就正常了。Word 里的开发工具也有多行文本框控件,属性里能设多行,用法和网页不是一回事。

多行文本框看着简单,真正要管的是换行怎么存、怎么显示、长度怎么限制。先把这三点定下来,再谈样式。