当前位置: 首页 > 科技观察

可能这些是你想要的H5软键盘兼容方案

时间:2023-03-18 14:59:22 科技观察

或许这些就是你想要的输入法框上的H5软键盘兼容解决方案。需求很明确,看似很简单,其实不然。从部分机型的实验来看,主要问题如下:在Android和IOS上,已知软键盘的弹出和缩回状态不同,页面webview表现不同。IOS12,微信版本v6.7.4及以上,输入框获取焦点,键盘弹出,页面(webview)整体向上滚动。键盘收起后,没有回到原来的位置,导致键盘原位空白。IOS上,使用第三方输入法,高度计算存在偏差,导致部分输入法弹出,部分遮挡输入框。在某些浏览器上使用一些操作技巧,输入框仍然被输入法挡住。下面我们就针对上述问题一一探讨解决方法。知道软键盘的上下状态知道软键盘是向上还是向下是非常重要的,下面的兼容处理必须基于此。但是H5并没有直接监听软键盘的原生事件,只能通过软键盘的弹出或者收回来间接监听,触发页面其他方面的表现,曲线救国。此外,它在IOS和Android上的工作方式也不尽相同。IOS软键盘弹出IOS上,输入框(input,textarea或富文本)获得焦点,弹出键盘,页面(webview)没有压缩,或者高度(height)没有变化,只是页面(webview)整体向上滚动,最大滚动高度(scrollTop)为软键盘高度。Android软键盘弹出的表现也是一样的。在Android上,输入框获得焦点,弹出键盘,但是页面(webview)的高度会发生变化。一般来说,高度就是可见区域的高度(原始高度减去软键盘的高度),除了因为页面内容被拉伸会发生滚动外,webview本身是不能滚动的。IOS软键盘折叠表现当触发软键盘或输入框外页面区域的“折叠”按钮时,输入框失去焦点,软键盘折叠。Android软键盘折叠触发输入框外区域时,输入框失去焦点,软键盘折叠。但是当键盘上的retract按钮被触发时,输入框不会失去焦点,软键盘也会塌陷。//判断设备类型varjudgeDeviceType=function(){varua=window.navigator.userAgent.toLocaleLowerCase();varisIOS=/iphone|ipad|ipod/.test(ua);varisAndroid=/android/.test(ua);return{isIOS:isIOS,isAndroid:isAndroid}}()//监听输入框软键盘的弹出和关闭事件functionlistenKeybord($input){if(judgeDeviceType.isIOS){//IOS键盘弹出-up:IOS和Android输入框获得焦点弹出键盘$input.addEventListener('focus',function(){console.log('IOS键盘弹出!');//IOS键盘后操作popsup},false)//IOS键盘关闭开始:IOS点击输入框外区域或点击收起按钮,输入框失去焦点,键盘收起,$input.addEventListener('blur',()=>{console.log('IOS键盘收回!');//IOS键盘收回后操作})}//Andriod键盘收回:Andriod键盘弹出时页面高度会发生变化或收回,基于wh如果(judgeDeviceType.isAndroid){varoriginHeight=document.documentElement.clientHeight||document.body.clientHeight;window.addEventListener('resize',function(){varresizeHeight=document.documentElement.clientHeight||document.body.clientHeight;if(originHeight请输入您的电话号码

type="tel",是HTML5的一个属性,表示输入框类型是电话号码,在Android和IOS上表现类似。会有数字键盘,但也会有字母,略显多余。pattern="[0-9]",pattern用于验证表单的输入内容,通常是HTML5的type属性,如email、tel、number、dataclass、url等,已经有一个简单的数据格式验证功能。添加pattern后,前端部分的验证更加简单高效。在IOS中只有[0-9]\*可以激活九宫格数字键盘,\d无效,Android4.4及以下(包括X5内核)都可以激活数字键盘。novalidate="novalidate",novalidate属性规定表单提交时不验证。由于模式验证的兼容性不好,无法验证,只能让它唤起纯数字键盘,验证工作由js完成。兼容IOS12+V6.7.4+如果你用IOS12和V6.7.4+版本的微信浏览器打开上面表单输入的demo,你会惊奇地发现,键盘关闭后,原来的页面向上滚动不返回底部弹出键盘的位置是“空”。其实这是苹果IOS的一个bug,它会出现在所有用Xcode10打包的IOS12设备上。微信官方给出了一个解决方案,只要把软键盘收起后,将页面(webview)滚动回窗口顶部位置(clientHeight位置)即可。以上表单输入修复后的demo可以点击这里:console.log('IOS键盘关闭!');//IOS键盘关闭后的操作//微信浏览器6.7.4+IOS12版本后会出现键盘关闭,视图向上不向下varwechatInfo=window.navigator.userAgent.match(/MicroMessenger\/([\d\.]+)/i);if(!wechatInfo)return;varwechatVersion=wechatInfo[1];varversion=(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,确实大部分安卓浏览器都可以,但是测试是在IOS上。UC浏览器自带输入法和第三方输入法(如搜狗输入法),输入框会被完全屏蔽;QQ浏览器或微信浏览器,使用第三方输入法,输入框会被遮住一半;百度浏览如果设备配合第三方输入法,输入框也会被完全覆盖。可以使用相应的浏览器访问这里查看效果。在UC浏览器上,弹出软键盘后,浏览器上方的标题栏高度有一个递减高度和延迟的动态效果,导致webview向下滚动一点,底部的输入框滚动到不可见区域。至于第三方输入法,自己猜测是由于输入法面板弹出后的高度计算错误导致webview初始滚动定位错误。其实这两点都是webview滚动不够充分造成的。软键盘弹出后,让focus元素再次滚动到可见区域,强制webview原地滚动。console.log('Android键盘弹出!');//Android键盘弹出后运行activeElementScrollIntoView($input,1000);Android小米浏览器兼容的Hack方案将上述方案应用到Android小米浏览器上,发现聊天输入框依然被死死堵住,scrollIntoView()依然一动不动。所以猜测,其实就是滚动到底部,弹出软键盘,页面高度大于可见区域高度。这样只能在软键盘弹出后强行增加页面高度,才能显示输入框。以上是兼容第三方输入法,可以点击这里查看效果://Andriod键盘回缩:当Andriod键盘弹出或折叠时,页面高度会发生变化,基于此,您可以知道键盘收回了.body.clientHeight;if(originHeight