vue3+js+vant4使用van-popup在ios端打开弹窗,软键盘会挡住弹窗,或者将header部分顶出屏幕,如何解决

前言:安卓会自动实现下图的效果,而ios不会,ios软键盘会覆盖弹窗

要实现的效果:点击输入框van-field,弹窗会出现在键盘顶部

问题一: 软键盘弹起时 header 部分被顶出屏幕

一般情况,直接加入vant4官方预留的teleport属性,可以把组件挂载到最外层boby上,可以解决键盘弹起时 header 部分被顶出屏幕的问题:

问题二:软键盘会挡住弹窗(我这个弹窗是封装在了子组件)

我的由于布局原因,试了网上多种方法,依旧不行,所以最终使用原始、稍笨拙的方式实现了上图所示的效果:

<template>
  <van-popup round position="bottom" :style="{bottom:popupBottom}">
     <van-field v-model="title" @focus="onFocus" @blur="onBlur" />
  </van-popup>
</template>
<script setup>
import { isIOS } from "vant/lib/utils";//判断是否是ios设备,只对ios设备进行处理

const onFocus=()=>{//点击输入框时
  if (isIOS()) {
    setTimeout(() => { // 延迟调整弹窗位置,确保页面布局稳定后再聚焦(必须加延时器,不然点击输入框不出现键盘)
      popupBottom.value = '320px'; //ios的软键盘高度差不多都一样,标准的是336px,可根据自己需求适当修改
      console.log("popupBottom.value", popupBottom.value);//查看是否给van-popup 的style样式赋值成功
      const activeElement = document.activeElement;      // 延迟聚焦,确保布局调整后软键盘能够正确弹出
      if (activeElement && activeElement.tagName === 'INPUT') {
        activeElement.focus(); // 确保输入框聚焦
      }
    }, 50); // 设置小的延迟,确保布局变化后焦点能够生效
  } else {
    console.log("非ios系统");
  }
}
//失去焦点
const onBlur=()=>{
  if (isIOS()) {
    popupBottom.value = '0'; //删除掉增加的键盘高度
  }
}

这样就解决问题了~~~

注意:(如果你设置好后,发现偶尔键盘和弹窗中间会有很大的空隙,大概30px甚至更大。。。那就是和我的布局差不多,因为我发生了这种情况,那么请往下看~ )

什么时候会出现这种情况:

    当你父组件滑到最底部的时候,再打开子组件,点击输入框,键盘和弹窗中间会有很大的空隙

原因:

  父组件已经滑动到最底部了,又随着子组件增高了336px;所以弹窗就又被顶上去一段距离

解决:

在你关闭弹窗的时候,让父组件再滚回最顶部,而不是停留在最底部

// 关闭弹窗事件
const closeInputPicker=()=>{
    showButtonPicker.value = false // 关闭弹窗
    if (isIOS()) {
      addHeight.value=true  //我这里设置了动态高度,当ios设备时,这个页面的最小高度是1500px;这样就不会在打开弹窗的时候父组件已经是最底部了,你们可以不用设置
      window.scrollTo(0, 0);   // 滚动到页面顶部
    }else{
      addHeight.value=false
    }
}

以上代码是因为自己踩坑好久才搞出来,所以记录下,如果有更好的解决方式,欢迎评论区留言哦(*╹▽╹*)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值