autocapitalize="none"必须搭配autocorrect="off"、spellcheck="false"、autocomplete="off"才真正生效,否则易被JS转换、组件封装、type限制或拼写纠正覆盖;仅对可编辑文本控件有效,type="number"等数字类型下完全失效。

autocapitalize="none" 能关掉 iOS Safari 和部分 Android 浏览器软键盘的首字母大写提示,但它不是万能开关——写对了也不一定立刻生效,失效几乎总是因为被其他机制覆盖。
为什么写了 autocapitalize="none" 还是首字母大写
最常见原因不是属性写错,而是它被更高优先级行为压制:
- JS 代码里监听
input事件并调用toLowerCase()或toUpperCase(),会把键盘刚输的大写又转回去,同时光标跳动干扰体验 - 用了封装组件(如 Vant、Ant Design Mobile),但没把
autocapitalize透传到底层<input>,比如只写在<van-field>上而没通过:input-props="{ autocapitalize: 'none' }"传下去 - 元素本身不支持该属性:
type="number"、type="tel"、inputmode="numeric"或contenteditable="false"下,autocapitalize完全无效 -
autocorrect="on"(默认值)还在运行,拼写纠正会把 “user” 自动改成 “User”,看起来像首字母大写
autocapitalize="none" 必须搭配哪些属性才真正生效
单写 autocapitalize="none" 是低效的,尤其在密码、验证码、用户名等场景下,必须组合使用:
-
autocorrect="off":禁用 iOS 键盘自动更正逻辑(Android 部分版本已弃用,但 iOS 仍关键) -
spellcheck="false":标准 HTML 属性,隐藏红色波浪线,且在 Firefox/Edge 中抑制拼写干预;iOS Safari 下需和autocorrect="off"共存才稳定 -
autocomplete="off":防止输入法基于字段名(如name="username")做上下文联想和纠错
完整示例:
<input type="text" spellcheck="false" autocorrect="off" autocapitalize="none" autocomplete="off">
立即学习“前端免费学习笔记(深入)”;
哪些输入类型下 autocapitalize="none" 会直接失效
它只对可编辑的文本类输入控件起作用,以下情况完全忽略:
-
type="number"、type="range"、type="date"等非文本型 input —— 数字键盘没有大小写切换能力 -
type="password"在旧版 iOS(12 之前)有例外行为,即使设了autocapitalize="none"仍可能大写,建议额外加inputmode="text"强制唤起全键盘 -
readonly或disabled状态的元素,浏览器不触发软键盘,属性自然无意义 -
contenteditable="true"的元素虽支持,但部分 UI 框架会劫持焦点或重写渲染,导致属性未实际挂载到真实编辑节点上
真正难的不是写对属性,而是确认它在目标设备上是否被底层输入法、系统设置或封装逻辑绕过。测试时别只看 HTML 源码,得真机输 “hello world”,观察键盘左下角是否还默认高亮大写键,以及提交后值是否仍是小写 —— 这才是生效的唯一证据。



















