autocapitalize="none"是禁用首字母大写的唯一可靠写法,它明确禁止所有场景的首字母大写干预,且兼容ios 12.2+及android webview;type="password"等特定类型会强制忽略该属性,第三方组件需显式透传,js实时转小写会覆盖键盘行为。

autocapitalize="none" 是禁用首字母大写的唯一可靠写法
写 autocapitalize="off" 会被部分旧版 iOS(尤其是 iOS 12.2 前)当作无效值处理,而 autocapitalize="none" 是规范推荐、兼容性最稳的写法。它明确告诉键盘“不要做任何首字母大写干预”,包括句首、单词首、全字符等所有场景。iOS Safari 从 12.2 起全面支持该值,Android WebView 中也比 off 更可能被识别。
type="password" 或 type="email" 时 autocapitalize 会被强制忽略
很多开发者以为给密码框加 autocapitalize="none" 就万无一失,其实只要 type="password",该属性在所有主流浏览器中都直接失效——这是浏览器硬编码行为,不是 bug。同理:type="email" 默认隐式启用 autocapitalize="none",显式再写一遍没坏处但没必要;type="number"、type="tel"、type="search" 全部无视该属性。
- 密码字段必须同时设
autocapitalize="none"和autocorrect="off",否则旧版 iOS 可能因拼写纠正把user改成User - 邮箱用户名输入建议用
type="text"+autocapitalize="none"+autocorrect="off",避免type="email"的协议部分自动小写干扰 -
inputmode="numeric"或inputmode="decimal"会覆盖autocapitalize,哪怕值是words也无效
第三方 UI 组件常不透传 autocapitalize 属性
Vant、Ant Design Mobile、Naive UI 等封装组件默认不会把 autocapitalize 透传到内部原生 <input> 上。你写了 <van-field autocapitalize="none"></van-field>,实际 DOM 里根本看不到这个属性。
- Vue 中需通过
input-props显式透传:<van-field :input-props="{ autocapitalize: 'none' }"></van-field> - React 中用
inputProps(注意大小写):<input inputprops="{{" autocapitalize:> - 检查真机渲染结果:用 Safari 连接 macOS 开发者工具,选中元素看
autocapitalize是否出现在原生<input>上,而不是父容器
JS 监听 input 事件并调用 toLowerCase() 会立刻覆盖键盘大写
这是“写了却没反应”最常见原因。软键盘刚输进一个大写字母,JS 立刻执行 e.target.value = e.target.value.toLowerCase(),用户完全感知不到首字母大写过程——不是属性失效,是被当场抹平。
- 若业务强依赖格式(如注册姓名必须首字母大写),
autocapitalize="words"只能当体验层辅助,真实校验和格式化必须靠 JS 或后端完成 - 用
input事件而非change:前者覆盖粘贴、拖拽、IME 输入等所有路径;后者只在失焦时触发,漏掉大量场景 - 别信
text-transform: capitalize:它只改样式,input.value仍是原始大小写,提交/校验/存储全部失效
真正难搞的从来不是怎么写对属性,而是它只影响键盘提示状态,不改变实际输入值——用户随时可以切小写、粘贴小写、甚至直接改 DOM。如果你的表单要过实名认证或对接强校验系统,autocapitalize 最多算个锦上添花的提示,不能当数据保障线。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











