inputmode是软提示而非强制指令,真机不弹数字键盘通常因浏览器或输入法不支持;iOS 16.4+、Android Chrome 82+支持有限,国产安卓和桌面端基本无视。

inputmode不是开关,是软提示——真机不弹数字键盘别急着改代码
写了 inputmode="decimal" 却还是弹全键盘,大概率不是你写错了,而是它本就不保证生效。这个属性是向浏览器和输入法发建议,不是强制指令;iOS Safari 直到 16.4 才开始支持部分值,旧机型自动 fallback 到 text;国产安卓(vivo、OPPO、华为)系统输入法基本不读 inputmode,只响应 type="tel" 或 type="number"。桌面浏览器(包括 Chrome 桌面版)完全无视它,只在触屏设备上可能起效。
哪些 inputmode 值在真机上最稳?优先选 tel 和 email
inputmode="tel" 和 inputmode="email" 是目前跨平台兼容性最好的两个值:
-
inputmode="tel"搭配type="tel"是双保险:iOS 16.4+ 和 Android Chrome 82+ 上基本都显示带 *# 的拨号键盘;单独用type="text"+inputmode="tel"语义弱,自动填充可能失效 -
inputmode="email"在 Android Chrome 上有 @ 和 .com 快捷键,但 iOS Safari 基本无视——中文输入法激活时,所有快捷键都会消失,这是系统级限制,前端拦不住 -
inputmode="search"是目前回车键文字最稳的:多数系统会把 Enter 键显示为「搜索」,且keydown事件中event.key === 'Enter'可靠;但它不改变键盘布局,别指望它弹出数字键
金额、验证码这类场景该用什么组合?别碰 type="number"
要输金额或验证码,type="number" 是陷阱:
- iOS 上小数点被转成逗号、粘贴失败、长按复制被禁、滚动 spinner 干扰布局
-
type="number"会压制inputmode:iOS 直接忽略,Chrome 行为不一致,有的弹数字键、有的闪退 - 验证码 →
<input type="text" inputmode="numeric" pattern="[0-9]{4,6}"> - 金额(含小数)→
<input type="text" inputmode="decimal" pattern="[0-9.]*">,再用parseFloat()处理输入值 - 别写
inputmode="decimal"却允许用户输 “-12.5”——多数软键盘不显示减号,用户得手动切键盘找
为什么加了 inputmode 还是没反应?检查这三件事
真正起效必须同时满足三个条件,缺一不可:
立即学习“前端免费学习笔记(深入)”;
- 用对
type:inputmode="tel"就配type="tel",inputmode="decimal"就配type="text";混用type="number"和任何inputmode值,大概率白写 - 选对值:看用户要按什么键,不是看字段叫“金额”还是“手机号”。
numeric只有 0–9,不含小数点;decimal多一个点(.),部分系统还带逗号(,)或负号(−),但减号并不总默认出现 - 真机验证:模拟器里看到的 “*# 键出现了”,不代表用户手里的 vivo X100 能看到;国产安卓各厂输入法行为差异极大,同一页面在小米弹数字键,在华为却弹拼音是常态
父容器用了 transform 或 position: fixed,可能导致聚焦异常、键盘不弹或错位;Vue/React 中动态渲染时,属性没正确绑定:Vue 要写成 inputmode="'decimal'",React 要用 inputMode 驼峰写法。这些细节,比纠结 inputmode 值本身更容易导致失效。



















