如何为只读input标签添加闪烁光标?适配最新Chrome浏览器
解决readonly输入框安卓Chrome下有闪烁光标且禁用虚拟键盘的方案
嘿,这个需求我刚好踩过坑!要让设置了readonly的输入框在安卓Chrome中选中时显示闪烁光标,同时不弹出虚拟键盘,这里有两个适配最新版Chrome的可靠方案:
方案一:CSS模拟闪烁光标(无需JS)
核心思路是利用CSS伪元素模拟原生光标,同时依赖readonly属性本身阻止虚拟键盘弹出(安卓Chrome中readonly输入框聚焦时不会唤起键盘)。
代码示例:
<input id="input" type="text" value="0" readonly="true">
#input { position: relative; /* 确保输入框可以被聚焦选中 */ cursor: text; } /* 聚焦时显示模拟光标 */ #input:focus::after { content: ''; position: absolute; /* 根据输入框内边距调整位置,这里是示例值 */ left: calc(10px + 0.5em); top: 50%; transform: translateY(-50%); width: 2px; height: 70%; background-color: #000; /* 模拟光标闪烁动画 */ animation: blink-caret 1s step-end infinite; } @keyframes blink-caret { from, to { opacity: 1; } 50% { opacity: 0; } }
注意事项:
- 调整
left值适配你的输入框内边距和字体大小,确保光标位置和原生一致 - 如果输入框内容长度变化,可能需要动态调整光标位置(此时可以结合JS计算)
方案二:保留原生光标(JS辅助)
如果想要原生光标体验,可以去掉readonly属性,通过JS阻止输入行为和键盘唤起,同时保留聚焦和光标:
代码示例:
<input id="input" type="text" value="0">
const inputEl = document.getElementById('input'); // 阻止键盘事件,避免弹出虚拟键盘 inputEl.addEventListener('keydown', (e) => { e.preventDefault(); }); // 阻止粘贴行为,保持内容只读 inputEl.addEventListener('paste', (e) => { e.preventDefault(); }); // 阻止输入修改,确保内容始终为初始值 inputEl.addEventListener('input', (e) => { e.target.value = '0'; }); // 可选:允许用户选中内容但不能修改 inputEl.addEventListener('selectstart', (e) => { // 允许选中,无需阻止 });
优势:
- 完全使用原生光标,适配系统主题的光标样式(比如深色模式)
- 无需调整CSS光标位置,更贴合原生体验
这两个方案在最新版Chrome(100+版本)下都能完美适配安卓端,你可以根据需求选择~
内容的提问来源于stack exchange,提问作者Radex




