千家信息网

html5软键盘兼容的方法

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"html5软键盘兼容的方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"html5软键盘兼容的方法"吧!获知软键盘弹起和收起状态获知软键
千家信息网最后更新 2026年11月02日html5软键盘兼容的方法

本篇内容主要讲解"html5软键盘兼容的方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"html5软键盘兼容的方法"吧!

获知软键盘弹起和收起状态

获知软键盘的弹起还是收起状态很重要,后面的兼容处理都要以此为前提。然而,H5 并没有直接监听软键盘的原生事件,只能通过软键盘弹起或收起,引发页面其他方面的表现间接监听,曲线救国。并且,在 IOS 和 Android 上的表现不尽相同。

IOS 软键盘弹起表现

在 IOS 上,输入框(input、textarea 或 富文本)获取焦点,键盘弹起,页面(webview)并没有被压缩,或者说高度(height)没有改变,只是页面(webview)整体往上滚了,且最大滚动高度(scrollTop)为软键盘高度。

Android 软键盘弹起表现

同样,在 Android 上,输入框获取焦点,键盘弹起,但是页面(webview)高度会发生改变,一般来说,高度为可视区高度(原高度减去软键盘高度),除了因为页面内容被撑开可以产生滚动,webview 本身不能滚动。

IOS 软键盘收起表现

触发软键盘上的"收起"按钮键盘或者输入框以外的页面区域时,输入框失去焦点,软键盘收起。

Android 软键盘收起表现

触发输入框以外的区域时,输入框失去焦点,软键盘收起。但是,触发键盘上的收起按钮键盘时,输入框并不会失去焦点,同样软键盘收起。

监听软键盘弹起和收起

综合上面键盘弹起和收起在 IOS 和 Android 上的不同表现,我们可以分开进行如下处理来监听软键盘的弹起和收起:

  • 在 IOS 上,监听输入框的 focus 事件来获知软键盘弹起,监听输入框的 blur 事件获知软键盘收起。

  • 在 Android 上,监听 webview 高度会变化,高度变小获知软键盘弹起,否则软键盘收起。

// 判断设备类型var judgeDeviceType = function () {  var ua = window.navigator.userAgent.toLocaleLowerCase();  var isIOS = /iphone|ipad|ipod/.test(ua);  var isAndroid = /android/.test(ua);  return {    isIOS: isIOS,    isAndroid: isAndroid  }}()// 监听输入框的软键盘弹起和收起事件function listenKeybord($input) {  if (judgeDeviceType.isIOS) {    // IOS 键盘弹起:IOS 和 Android 输入框获取焦点键盘弹起    $input.addEventListener('focus', function () {      console.log('IOS 键盘弹起啦!');      // IOS 键盘弹起后操作    }, false)    // IOS 键盘收起:IOS 点击输入框以外区域或点击收起按钮,输入框都会失去焦点,键盘会收起,    $input.addEventListener('blur', () => {      console.log('IOS 键盘收起啦!');      // IOS 键盘收起后操作    })  }  // Andriod 键盘收起:Andriod 键盘弹起或收起页面高度会发生变化,以此为依据获知键盘收起  if (judgeDeviceType.isAndroid) {    var originHeight = document.documentElement.clientHeight || document.body.clientHeight;    window.addEventListener('resize', function () {      var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;      if (originHeight < resizeHeight) {        console.log('Android 键盘收起啦!');        // Android 键盘收起后操作      } else {        console.log('Android 键盘弹起啦!');        // Android 键盘弹起后操作      }      originHeight = resizeHeight;    }, false)  }}var $inputs = document.querySelectorAll('.input');for (var i = 0; i < $inputs.length; i++) {  listenKeybord($inputs[i]);}

弹起软键盘始终让输入框滚动到可视区

有时我们会做一个输入表单,有很多输入项,输入框获取焦点,弹起软键盘。当输入框位于页面下部位置时,在 IOS 上,会将 webview 整体往上滚一段距离,使得该获取焦点的输入框自动处于可视区,而在 Android 则不会这样,它只会改变页面高度,而不会去滚动到当前焦点元素到可视区。

由于上面已经实现监听 IOS 和 Android 键盘弹起和收起,在这里,只需在 Android 键盘弹起后,将焦点元素滚动(scrollIntoView())到可视区。查看效果,可以戳这里。

// 获取到焦点元素滚动到可视区function activeElementScrollIntoView(activeElement, delay) {  var editable = activeElement.getAttribute('contenteditable')  // 输入框、textarea或富文本获取焦点后没有将该元素滚动到可视区  if (activeElement.tagName == 'INPUT' || activeElement.tagName == 'TEXTAREA' || editable === '' || editable) {    setTimeout(function () {      activeElement.scrollIntoView();    }, delay)  }}// ...// Android 键盘弹起后操作activeElementScrollIntoView($input, 1000);// ...

唤起纯数字软键盘

上面的表单输入框有要求输入电话号码,类似这样就要弹出一个数字软键盘了,既然说到了软键盘兼容,在这里就安插一下。比较好的解决方案如下:

请输入手机号

  • type="tel", 是 HTML5 的一个属性,表示输入框类型为电话号码,在 Android 和 IOS 上表现差不多,都会有数字键盘,但是也会有字母,略显多余。

  • pattern="[0-9]", pattern 用于验证表单输入的内容,通常 HTML5 的 type 属性,比如 email、tel、number、data 类、url 等,已经自带了简单的数据格式验证功能了,加上 pattern 后,前端部分的验证更加简单高效了。IOS 中,只有 [0-9]* 才可以调起九宫格数字键盘,d 无效,Android 4.4 以下(包括X5内核),两者都调起数字键盘。

  • novalidate="novalidate",novalidate 属性规定当提交表单时不对其进行验证,由于 pattern 校验兼容性不好,可以不让其校验,只让其唤起纯数字键盘,校验工作由 js 去做。

兼容 IOS12 + V6.7.4+

如果你在用 IOS12 和 V6.7.4+版本的微信浏览器打开上面表单输入的 demo ,就会惊奇的发现键盘收起后,原本被滚动顶起的页面并没有回到底部位置,导致原来键盘弹起的位置"空"了。

其实这是 Apple 在 IOS 的 bug,会出现在所有的 Xcode10 打包的 IOS12 的设备上。微信官方已给出解决方案,只需在软键盘收起后,将页面(webview)滚回到窗口最底部位置(clientHeight位置)。修复后的上面表单输入 demo 可以戳这里

console.log('IOS 键盘收起啦!');// 微信浏览器版本6.7.4+IOS12会出现键盘收起后,视图被顶上去了没有下来var wechatInfo = window.navigator.userAgent.match(/MicroMessenger/([d.]+)/i);if (!wechatInfo) return;var wechatVersion = wechatInfo[1];var version = (navigator.appVersion).match(/OS (d+)_(d+)_?(d+)?/);if (+wechatVersion.replace(/./g, '') >= 674 && +version[1] >= 12) {  window.scrollTo(0, Math.max(document.body.clientHeight, document.documentElement.clientHeight));}

兼容第三方输入法

上面说了那么多,其实已经把 H5 聊天输入框的坑填了一大半了,接下来就先看下聊天输入框的基本HTML结构:

一些聊天内容1

样式:

/* 省略一些样式 */.chat__content {  height: calc(100% - 40px);  margin-bottom: 40px;  overflow-y: auto;  overflow-x: hidden;}.input__content {  display: flex;  height: 40px;  position: absolute;  left: 0;  right: 0;  bottom: 0;  align-items: center;}/* 省略一些样式 */

很简单,就是划分内容区和输入区,输入区是绝对定位,按照上面表单输入 demo 的做法,确实大部分 Android 浏览器是没问题的,但是测试在 IOS 上,UC 浏览器配合原生输入法和第三方输入法(比如搜狗输入法),输入框都会被完全挡住;QQ 浏览器或微信浏览器,配合第三方输入法,输入框会被遮住一半;百度浏览器配合第三方输入法输入框也会被完全遮住。

在 UC 浏览器上,软键盘弹起后,浏览器上面的标题栏高度就有个高度变小延时动态效果,这样导致 webview 往下滚了一点,底部输入框滚到了非可视区。

而对于第三方输入法,猜测本身是由于输入法面板弹起后高度计算有误,导致 webview 初始滚动定位有误。其实这两点都是 webview 滚动不到位造成的。可以让软键盘弹起后,让焦点元素再次滚到可视区,强迫 webview 滚到位。

console.log('Android 键盘弹起啦!');activeElementScrollIntoView($input, 1000);

兼容 Android 小米浏览器的 Hack 方案

在 Android 的小米浏览器上,应用上面的方案,发现聊天输入框还是被遮挡得严严实实,scrollIntoView() 仍然纹丝不动。所以猜测,其实是滚到底了,软键盘弹起,页面实现高度大于可视区高度,这样只能在软键盘弹起后,强行增加页面高度,使输入框可以显示出来。综合上面兼容第三方输入法,查看效果可以戳这里:

// Andriod 键盘收起:Andriod 键盘弹起或收起页面高度会发生变化,以此为依据获知键盘收起if (judgeDeviceType.isAndroid) {  var originHeight = document.documentElement.clientHeight || document.body.clientHeight;  window.addEventListener('resize', function () {    var resizeHeight = document.documentElement.clientHeight || document.body.clientHeight;    if (originHeight < resizeHeight) {      console.log('Android 键盘收起啦!');      // 修复小米浏览器下,输入框依旧被输入法遮挡问题      if (judgeDeviceType.isMiuiBrowser) {        document.body.style.marginBottom = '0px';      }    } else {      console.log('Android 键盘弹起啦!');      // 修复小米浏览器下,输入框依旧被输入法遮挡问题      if (judgeDeviceType.isMiuiBrowser) {        document.body.style.marginBottom = '40px';      }      activeElementScrollIntoView($input, 1000);    }    originHeight = resizeHeight;  }, false)}

到此,相信大家对"html5软键盘兼容的方法"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

键盘 输入 高度 焦点 页面 浏览器 浏览 输入法 视区 监听 表单 内容 数字 第三方 位置 元素 方法 事件 小米 方案 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司税收优惠 互联网核心科技是什么 奇酷互联网络科技公司 顺玮阁互联网科技 新华互联网科技校企合作 华脉科技工业互联网产品 宁波青枫互联网科技有限公司 顶级互联网科技成果有哪些 互联网校园科技培训 受益于互联网科技的高速发展 港股科技和互联网 互联网科技大奖都有哪些公司 互联网科技如何创业 济南有互联网科技公司吗 互联网时代的科技公司 富国互联网金融科技混合基金 国产互联网科技公司 万物互联网智能科技 长沙渺峰互联网科技有限公司 互联网科技创业有什么好项目 互联网科技有限公司经营范围 互联网科技未来 安控科技rtu产品工业互联网 深圳市优智互联网科技有限公司 中国互联网十大科技股排名 科技类公司包括互联网吗 工业互联网等科技实现智能化赋能 三亚科技创新互联网基地 华人运通互联网科技公司 互联网科技创新方面的资料
0