解决 - 移动端(H5) ios 在点击input输入框,弹起软键盘后,顶部输入框失效的问题

在移动端H5开发中遇到一个问题,在iOS设备上,当点击input输入框弹出软键盘后,顶部的输入框定位失效。安卓设备表现正常。解决方案是监听触摸事件,当点击或滑动时触发输入框失去焦点(blur),使软键盘消失,防止页面被撑高。

问题:
在项目开发过程中发现这个问题,在安卓下是正常的,ios固定定位就会失效,在网上看了许多ios兼容的博客,都没有效果,卡了很久,
ios 的软键盘弹出后,会把页面撑高.他就不在原来的位置定位了
后面同事提了个思路,当我点击搜索框的时候,会弹出软键盘,往上滑的话,搜索框也会跟着滑走,那我们就在滑动上做文章.往上滑的时候(或者点击屏幕的时候) 让软键盘消失就ok了,那么页面就不会被撑高了

vue开发代码

mounted () {
    document.body.addEventListener('touchstart',function () {
        document.getElementsByClassName('van-field__control')[0].blur()
      }, { passive: false })
  },

这里是用有赞的vant组件库开发的,里面的van-field__contro是组件 < van-search >

原理: 搜索框的焦点事件
focus(): 会弹出软键盘
blur():软键盘会消失

通过监听触摸事件 touchstart (触摸开始,多点触控) 或者 touchmove (接触点改变,滑动时)
来让焦点消失,从而达到让软键盘消失

求点赞,评论,收藏,关注

H5页面中,iOS系统唤起软键盘时会出现页面偏移、样式布局错乱等问题,主要是因为fixed定位在iOS唤起软键盘失效,且iOS键盘弹起时不会压缩视图,键盘会占用一块区域,页面内容会往上顶[^2][^3]。以下是几种解决方法: #### 方法一:添加CSS属性 在uni-app项目的H5页面中,可通过判断是否为iOS系统来添加相应的CSS属性。示例代码如下: ```javascript <script> export default { mounted() { let u = navigator.userAgent; let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); if (isIOS) { let iosApp = document.getElementById('app'); iosApp.style.backfaceVisibility = 'hidden'; iosApp.style.transform = 'translate3d(0,0,0)'; } }, }; </script> ``` 该代码在页面挂载时,通过`navigator.userAgent`判断是否为iOS系统,若是则为ID为`app`的元素添加`backfaceVisibility`和`transform`属性,以此解决iOS软键盘上推页面的问题[^2]。 #### 方法二:监听输入框的聚焦和失焦事件 通过监听输入框的聚焦和失焦事件,在键盘弹起收起时对页面进行相应的处理。示例代码如下: ```javascript // 获取所有输入框元素 const inputs = document.querySelectorAll('input, textarea'); // 为每个输入框添加聚焦和失焦事件监听器 inputs.forEach(input => { input.addEventListener('focus', () => { // 键盘弹起时的处理逻辑 // 例如,可以调整页面滚动位置,确保输入框可见 input.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }); input.addEventListener('blur', () => { // 键盘收起时的处理逻辑 // 例如,可以恢复页面的初始状态 }); }); ``` 此方法在输入框聚焦时,使用`scrollIntoView`方法将输入框滚动到可见区域,避免键盘挡住输入框。 #### 方法三:监听窗口的resize事件(适用于安卓) 虽然iOS不会触发窗口的resize事件,但在某些情况下,结合安卓和iOS的处理逻辑时,可以监听该事件。示例代码如下: ```javascript window.addEventListener('resize', () => { // 窗口大小改变时的处理逻辑 // 例如,可以根据窗口高度的变化判断键盘是否弹起收起 const windowHeight = window.innerHeight; if (windowHeight < previousWindowHeight) { // 键盘弹起 } else { // 键盘收起 } previousWindowHeight = windowHeight; }); ``` 这里通过比较窗口高度的变化来判断键盘是否弹起收起,然后进行相应的处理。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值