先记住这个答案
minlength 和 maxlength 可以约束适用文本类 <input> 与 <textarea> 的值,不是某一个标签独有。长度单位是 UTF-16 代码单元,像部分 emoji 在 JavaScript 的 length 中也会占两位。minlength 不会让空值自动无效,若必须填写还要加 required;服务端也需按约定重新验证。
- 两个属性适用于文本输入与文本域
- 长度按 UTF-16 代码单元计算
minlength不隐含required- 服务端仍需按业务规则验证长度
同样的属性,不同的编辑外观
单行用户名可用文本输入,多行简介用 <textarea>,二者都能声明最短与最长文本长度。输入框可能阻止用户继续键入超限内容,但粘贴、脚本赋值或网络请求仍需另行验证,不能把浏览器 UI 当作服务器边界。
<label for="bio">个人简介</label>
<textarea id="bio" name="bio" required
minlength="10" maxlength="200"></textarea>
<!-- 需要非空时,required 与 minlength 一起使用 -->minlength="10" 只表达长度下限;如果没有 required,空值一般不会因最小长度而失败。maxlength 应不小于 minlength,否则用户无论怎么输入也难以满足两条约束。
为什么 emoji 的计数和字数不同
HTML 这里的长度按 UTF-16 代码单元算。大部分常用汉字是一单位,而某些 emoji、组合序列或罕见字符可能占多个单位。页面若向用户承诺“最多 200 个可见字符”,不能直接把 maxlength="200" 当作完整实现;需要明确产品所用的计数方法和提示文案。
对由脚本直接设置的值,原生最短长度校验与用户实际输入后的约束校验可能表现不同。自动填入内容后应按业务需要主动检查值;服务器始终按自己的规则验证,不能只信浏览器提交前的状态。
把“最多 10 个字”直接实现成 maxlength="10" 之前,先确认产品说的“字”指什么。HTML 长度约束按 UTF-16 码元计算,普通汉字计 1,许多 emoji 计 2,组合表情可能更多。用户复制粘贴时,浏览器对超过上限的输入会做限制,但脚本设置控件值仍需要单独考虑校验;服务端也不能信任客户端长度限制。若业务按数据库字节数或用户感知的字素簇计数,应明确写自己的验证与提示。
容易答错的地方
- 认为
minlength自动包含必填 - 空值若没有
required通常可通过;两者需要分别声明。 - 把 UTF-16 单位当作用户眼中的字数
- 部分 emoji 和组合字符的计数会不同,字数提示需要单独设计。
面试官还会怎么问?
maxlength 能用于 type="number" 吗?
不应依靠它限制数值位数;数字控件的值域和步长应使用数字约束与业务校验。
textarea 与文本输入的长度单位不同吗?
两者按 UTF-16 代码单元计算,差别主要在单行与多行交互。
脚本把值改短会自动触发同样提示吗?
不要假定与用户键入完全一致;若业务依赖该限制,应主动检查并在服务端验证。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。