移动端input type="date"弹键盘是浏览器默认行为,需同时设readonly、inputmode="none"并移除js focus逻辑;ios旧版需加-webkit-appearance:none和caret-color:transparent隐藏光标。

移动端 <input type="date"> 为什么总弹键盘?
因为多数安卓 WebView 和部分 iOS Safari 在聚焦 <input type="date"> 时,会同时触发软键盘(尤其当 input 有 inputmode、autofocus 或被 JS 主动 .focus()),这不是 bug,是浏览器对“可编辑表单控件”的默认响应。你没写错,它就是会弹。
禁用键盘的三个关键操作
必须**同时满足**以下三点,缺一不可:
-
readonly属性设为true(注意:不是disabled,否则无法触发日期选择器) -
inputmode设为"none"(明确告诉浏览器“不要输入法”) - 移除所有可能触发
.focus()的 JS 逻辑(包括点击后手动 focus、表单自动聚焦、第三方库的 focus 行为)
正确写法示例:
<input type="date" readonly inputmode="none" id="my-date">
此时点击仍能唤起原生日期选择器,但不会弹软键盘。
iOS Safari 下的兼容性补丁
iOS 16.4+ 对 readonly + inputmode="none" 支持良好,但旧版 iOS(如 15.x)可能仍会聚焦并短暂闪动光标。此时加一行 CSS 可彻底隐藏光标并阻止聚焦行为:
#my-date { -webkit-appearance: none; caret-color: transparent; }
注意:-webkit-appearance: none 本身不破坏日期选择器,但会移除原生样式(需自行补基础边框/背景);caret-color: transparent 是防光标闪动的关键。
别踩这个坑:用 pointer-events: none 或 disabled
这两个方案看似“禁止交互”,实则直接废掉日期选择功能:
-
disabled→ 无法唤起任何系统选择器,且值不会提交 -
pointer-events: none→ 点击穿透,根本点不到 input,选择器完全不触发 - 用
tabindex="-1"也无效——它只影响键盘导航,不影响点击聚焦逻辑
真正可控的边界就一条:让 input “可点击、可聚焦(由系统触发)、但不可键盘输入”。readonly + inputmode="none" 是目前唯一稳定跨端的组合。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











