应根据字段是否允许小数点选择:整数用 numeric(仅数字键),带小数用 decimal(含小数点);金额等须小数的字段禁用 type="number",改用 type="text" + inputmode="decimal" + pattern 校验。

inputmode="numeric" 和 inputmode="decimal" 怎么选
看字段是否允许小数点:整数就用 numeric,带小数就用 decimal。前者只弹出 0–9 数字键,后者额外提供小数点(.),部分系统还带逗号(,)——iOS Safari 16.4+、Android Chrome 82+ 都能稳定识别这个区别。
常见误用是把金额字段写成 inputmode="numeric",结果用户得切键盘输小数点,体验断层。反过来,验证码用了 decimal,键盘多出小数点反而干扰输入。
-
numeric:验证码、手机号、商品数量、邮政编码 -
decimal:金额、身高、体重、评分、温度 - 别用
type="number"混搭——它在 iOS 上会覆盖inputmode,还自带微调按钮和粘贴拦截
为什么写了 inputmode 却没弹出对应键盘
不是语法错,而是被其他属性压制或环境不支持。最常踩的坑是:type="number" 和 inputmode 同时存在时,iOS 直接忽略后者;国产安卓输入法(如搜狗、百度)压根不读 inputmode,只认 type。
- 必须搭配
type="text"使用才最可靠,例如:<input type="text" inputmode="tel"> -
inputmode="search"和inputmode="url"在多数浏览器里基本无效,别依赖 - iOS 15.x 及更早版本不支持
inputmode,会自动降级为text键盘——这本身安全,但别误以为“写了就有用” - 真机测试不可省:模拟器里的键盘行为和实机差异极大,特别是 iOS 实机
inputmode 不校验,也不锁输入法
它只是个键盘“导购员”,指路可以,不管用户最后输什么。中文拼音输入法激活时,inputmode="numeric" 照样能打汉字;用户复制 “+86 138****1234” 进去,你拦不住——除非用 pattern 或提交前 JS 正则校验。
-
inputmode="none"只隐藏键盘,不阻止输入(适合自建软键盘场景) -
inputmode="email"在 Android Chrome 上可能显示@和.com快捷键,但在 iOS Safari 基本被无视 - 别在
input事件里实时过滤字符(比如删掉中文),会破坏粘贴体验 - 服务端永远要校验:前端提示 ≠ 数据约束
type 和 inputmode 搭配的底线原则
语义归 type,键盘归 inputmode,两者不互斥但有优先级。真正影响键盘的是 inputmode,而 type 决定表单验证、默认行为和可访问性。
- 手机号:
type="tel"+inputmode="tel"(双保险,tel值兼容性最好) - 邮箱:
type="email"+inputmode="email"(不冲突,且type提供基础校验) - 金额:
type="text"+inputmode="decimal"+pattern="[0-9.]*"(避开type="number"的区域格式陷阱) - 纯整数 ID:
type="text"+inputmode="numeric"+pattern="[0-9]*"
最容易被忽略的一点是:写了 inputmode="decimal",不代表用户一定输对小数——长按小数点可能触发空格或句号,键盘只是辅助,不是守门员。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











