h5 ios端input获取焦点弹出键盘后页面可滚动的问题

ios端input获取焦点后,弹出软键盘,底部页面在软键盘和顶部之间的区域可以触摸滚动的问题的尝试解决。目前尝试了几种方案,解决的并不是很完美,欢迎有相关经验的大佬评论指点。

问题描述

ios端,当input获取焦点,弹出软键盘后,发现当前页面在软键盘到顶部的区域可以滚动起来。如图所示:

当前页面的布局如下:

js 复制代码
.add-page {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  height: 100vh;
}

解决方案

查看小程序发现,在input聚焦出现软键盘时,触摸/点击页面上其它位置,软键盘会收起,当前input失焦。 参考小程序的方案,做了如下实现:触摸其它元素时,手动让当前的input失焦。 代码如下:

js 复制代码
// app.vue
function manualBlur(event: Event): void {
  const activeElement = document.activeElement as HTMLElement | null
  // 空值检查确保后续操作安全
  if (!activeElement) return

  // 类型收窄至具体表单元素
  const isFormElement = activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA'
  if (!isFormElement) return

  // 明确事件目标类型
  const target = event.target as Node | null
  // 确保目标存在且不是当前焦点元素
  if (target && !activeElement.contains(target)) {
    activeElement.blur()
  }
}

onMounted(() => {
  document.addEventListener('touchstart', manualBlur)
})

onUnmounted(() => {
  document.removeEventListener('touchstart', manualBlur)
})

当前方案是目前尝试的最为有效的方案,有一个小漏洞:保持当前input不失焦,还是可以滚动页面

尝试未果的方案

  1. 由于页面内容只占大概1/3的屏幕高度,所以首先考虑了将当前页面使用fixed定位,不给高度。期望表现出和安卓类似的结果:软键盘出来将页面顶上去,不可滑动。发现没什么效果,和一开始的表现一致。 代码如下:
js 复制代码
.add-page {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  position: fixed;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
}
  1. 在软键盘弹出时,在vconsole输出window.innerHeight,发现和软键盘收起时的不一样。想着通过监听resize事件,动态设置页面高度。尝试发现,在软键盘弹起时,ios并不会触发resize事件

  2. 在input获取焦点时,尝试禁用页面滚动,尝试无效。参考该篇文章:blog.51cto.com/u_16175474/...

相关推荐
এ慕ོ冬℘゜14 小时前
前端核心知识体系进阶:从安全机制、网络协议到原生 JS 实战全解析
前端·网络协议·安全
前端H14 小时前
Biome & Rolldown:Rust 工具链接管前端基建
开发语言·前端·rust
forever_world14 小时前
# 💧 从前端视角,彻底搞懂 AI 流式输出 —— 从"接根水管"到 Vue 3 实战
前端·vue.js
灯澜忆梦15 小时前
GO---map函数
开发语言·前端·后端·golang
李剑一15 小时前
uni-app x 实现本地 JSON 文件的导入导出(APP端可用)
android·前端·uni-app
Android出海15 小时前
iOS 出海新门槛:未成年人合规来了
ios·app store·ios开发·苹果开发者·ios开发者·ios出海
踩蚂蚁15 小时前
在 ESP32 上跑自定义唤醒词:从 TFLite 到离线语音唤醒,一个下午搞定
前端
hunterandroid15 小时前
Room 数据库迁移:让本地数据升级更稳
android·前端
徐小夕15 小时前
倒腾2天,我开源了一款AI驱动的实时 3D CAD / 参数化建模工作台
前端·架构·github
少年白马醉春风丶15 小时前
任务分解的经典范式 · 和 ReAct「走一步看一步」到底差在哪
前端