iOS Safari 中 autocapitalize 不生效是因为 iOS 12.2 前不支持,且仅对 type="text" 等文本类 input/textarea 有效;type="email"、"tel"、"number" 等会强制覆盖该属性,inputmode 冲突或 autocorrect="off" 也会导致失效。

autocapitalize 在 iOS Safari 中为何不生效
因为 iOS 12.2 之前版本根本不支持 autocapitalize,而即使在新版中,它也只对 <input> 和 <textarea> 生效,且必须配合 type 属性使用——比如 type="text" 可以,但 type="email" 或 type="tel" 会忽略该属性。Safari 会根据输入类型自动覆盖首字母行为:邮箱默认全小写,数字键盘不触发大写。
-
autocapitalize="sentences"在type="email"上无效,iOS 仍强制小写 - Android Chrome 虽支持该属性,但仅当
inputmode未冲突时才生效 - 若同时设了
autocorrect="off",部分旧版 WebKit 会连带禁用autocapitalize
哪些值真正可用且有区别
可选值只有四个:none、sentences、words、characters。其中 sentences 是默认值(即不写该属性时的行为),但注意:它只对句号、问号、感叹号后跟空格的组合触发大写,不是每个句子开头都生效;words 对每个单词首字母大写,但用户双击选中单词再编辑时,可能重置为小写。
-
autocapitalize="none":彻底关闭首字母大写,适合密码、代码输入等场景 -
autocapitalize="characters":每个字符都转大写(视觉上像全大写),但实际输入值仍是原大小写,只是键盘显示大写 -
autocapitalize="words":对空格分隔的每段文本首字母大写,但换行符或制表符不触发
与 inputmode 和 type 的冲突处理
当 inputmode="numeric" 或 type="number" 存在时,autocapitalize 会被完全忽略——因为系统判定这是纯数字输入,无需大小写逻辑。同理,type="url" 会强制小写协议部分(如 https://),此时设 autocapitalize="words" 也无效。
- 要实现“域名首字母大写”,得用
type="text"+inputmode="text"+autocapitalize="words" - 若需兼容 Android 键盘行为,建议避免混用
inputmode="decimal"和autocapitalize - Vue/React 中动态绑定该属性时,确保字符串值不含空格或大小写错误,如
autocapitalize="{{ mode }}"中mode必须是小写字符串
实际调试时怎么快速验证
真机测试最可靠,模拟器常误报行为。可在 Safari 开发者工具中检查元素是否渲染出该属性,但更关键的是观察软键盘左下角 Shift 键状态:若设为 none 后 Shift 键灰显且无法点击,说明生效;若仍可点且首字母大写,则可能是 type 或 inputmode 覆盖了它。
立即学习“前端免费学习笔记(深入)”;
- 临时加
style="outline: 2px solid red;"确保焦点可见,避免误判失焦导致的大小写回退 - 在
input上监听input事件,打印event.target.value,确认输入值本身是否被转换(它不会改变值,只影响键盘) - 不要依赖
autocapitalize做数据校验——它纯属 UI 提示,后端仍需按业务规则处理大小写
type 和 inputmode 的隐式覆盖,尤其表单字段复用组件时,一个 type="search" 就能让整个首字母策略失效。



















