inputmode 不是换键盘开关,仅建议浏览器弹出对应键盘;其生效受 type 属性、系统版本及输入法影响,真机测试至关重要。

inputmode 不是“换键盘”的开关,它只是告诉浏览器“建议弹哪个键盘”——写了不保证弹,不写一定不弹,真机测试比文档管用。
inputmode="numeric" 和 inputmode="decimal" 怎么选
看用户是否需要按小数点键,不是看字段叫什么:
- 验证码、商品数量、ID、手机号(纯数字)→
inputmode="numeric":键盘只出 0–9,无小数点、无负号,兼容性最稳 - 金额、评分、身高、温度(允许小数)→
inputmode="decimal":iOS 16.4+ 和 Android Chrome 82+ 会倾向弹带小数点(有时还有逗号)的键盘 - 别给验证码配
inputmode="decimal":多出来的小数点干扰输入,还可能被误粘贴 - 别指望
inputmode="decimal"弹出减号(-):软键盘默认不提供负号,用户得手动切键盘找
为什么写了 inputmode 却还是弹全键盘
不是语法错,而是被压制或不支持:
-
type="number"会覆盖inputmode,尤其在 iOS 上直接忽略后者,甚至导致键盘闪退 - 国产安卓输入法(如搜狗、华为 HMS、vivo Jovi)基本不读
inputmode,只认type="tel"或type="number" - 没写
type属性(比如<input>)时,inputmode反而更容易生效 - iOS 15.x 及更早版本完全不支持
inputmode,自动降级为 text 键盘——这本身安全,但别误以为“写了就有用”
type 和 inputmode 最稳妥的搭配
语义归 type,键盘归 inputmode,两者不互斥但有优先级:
- 手机号:
<input type="tel" inputmode="tel">(双保险,type="tel"保语义和自动填充) - 验证码:
<input type="text" inputmode="numeric" pattern="[0-9]{4,6}">(避开type="number"的粘贴拦截) - 金额:
<input type="text" inputmode="decimal" pattern="[0-9.]*">(type="text"避免 Safari 自动转逗号) - 密码明文切换:
input.inputmode = isShow ? "text" : "verbatim"(不改type,只调inputmode,防 iOS 键盘错乱)
inputmode 不拦输入,也不校验内容
它只是个“导购员”,指路可以,不管用户最后输什么:
- 中文拼音输入法激活时,
inputmode="numeric"照样能打汉字 - 用户长按粘贴
"+86 138****1234"或"abc123",依然能进输入框——这是正常行为 -
inputmode="none"只隐藏键盘,不阻止输入(适合自建软键盘场景) - 服务端永远要校验:
pattern和 JS 正则只是前端提示,不是数据约束
最容易被忽略的是:inputmode 在国产安卓输入法里基本无效,而 iOS 实机行为和模拟器差异极大——不真机测,等于没配。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











