h5端移动端软键盘弹起改变高度问题

在移动端H5页面中,当安卓浏览器的input或textarea触发软键盘时,会导致可视窗口高度变化,进而挤压页面内容。与iOS不同,安卓软键盘占据窗口部分区域。为解决这一问题,可以设置viewport的height值为window.innerHeight,以保持页面在键盘弹出后的正常显示。通过监听窗口大小变化和键盘事件,可以确保页面在各种场景下适应性良好。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

在移动端h5页面,当页面中包含input、textarea输入框的时候,或者有调起软键盘的操作时,安卓浏览器下,可视窗口的高度改变,导致页面上的vh重新计算,页面被压扁。ios下的浏览器(safari)没有这个问题。

原因

在ios下,软键盘是叠在可视窗口上面的,也就是不影响可视窗口的大小。但是在安卓,软键盘是在窗口中,即占用窗口的面积。

解决方案

给viewport设置height值,可用window.innerHeight赋值。

 <meta name="viewport" id="viewportMeta">

var initViewport = function(height){
	var metaEl = document.querySelector("#viewportMeta");
	var content = "height=" + height + ",width=device-width,initial-scale=1.0,user-scalable=no";
	metaEl.setAttribute('name', 'viewport');
	metaEl.setAttribute('content', content);
}
var realHeight = window.innerWidth > window.innerHeight ? window.innerWidth : window.innerHeight
initViewport(realHeight);

亲测在键盘谈起、屏幕旋转的情况下,可使页面正常显示

### Vue3 和 UniApp 中监听键盘弹起高度的解决方案 在 Vue3 和 UniApp 的开发环境中,可以采用多种方法来监听软键盘高度变化并处理相应的界面调整问题。以下是具体的实现方式: #### 方法一:使用 `@/utils/keyboardHeight` 工具类 如果项目中有现成工具类用于监听键盘高度的变化,则可以直接引入该模块进行操作[^1]。 ```javascript import keyboardListener from "@/utils/keyboardHeight"; // 添加键盘高度变化监听器 keyboardListener.onKeyboardHeightChange(({ height, extra }) => { console.log("键盘高度:", height); console.log("额外高度(iOS):", extra); // 可在此处更新页面布局逻辑 }); // 当组件销毁时移除监听器 onUnmounted(() => { keyboardListener.offKeyboardHeightChange(); }); ``` 此方法适用于已有封装好的工具库场景,能够快速集成到现有项目中。 --- #### 方法二:利用原生 API 实现键盘高度监听 对于未提供专用工具的情况,可借助 `Window.visualViewport` 或其他事件机制手动捕获软键盘触发的行为[^2]。 ##### H5 实现思路 通过监听页面可视区域 (`visualViewport`) 的尺寸变化检测软键盘弹出与否。 ```javascript let initialHeight = window.innerHeight; function onResize() { const currentHeight = window.innerHeight; const keyboardHeight = initialHeight - currentHeight; if (keyboardHeight > 0) { console.log(`键盘弹起高度为 ${keyboardHeight}px`); } else { console.log("键盘已收起"); } } window.addEventListener('resize', onResize); // 组件卸载时清理事件监听 onUnmounted(() => { window.removeEventListener('resize', onResize); }); ``` 这种方法依赖于浏览器对 `resize` 事件的支持程度,在部分老旧设备上可能需要额外适配。 --- #### 方法三:UniApp 提供的内置 API 针对移动端应用开发,推荐优先考虑 UniApp 自带功能完成需求。例如可通过 `onKeyboardHeightChange` 生命周期钩子获取动态数据[^2]。 ```javascript export default { data() { return { keyboardHeight: 0, }; }, methods: { handleKeyboardChange(e) { this.keyboardHeight = e.height || 0; console.log(`当前键盘高度为 ${this.keyboardHeight} px`); }, }, onLoad() { uni.onKeyboardHeightChange(this.handleKeyboardChange); }, onUnload() { uni.offKeyboardHeightChange(this.handleKeyboardChange); }, }; ``` 以上代码片段展示了如何绑定全局范围内的键盘状态改变回调函数,并及时同步至内部变量存储以便后续调用。 --- #### 封装与复用建议 为了提高代码质量以及降低维护成本,强烈建议将上述任意一种技术打包成为独立服务层或者插件形式发布出去共享给团队成员重复利用。 比如创建名为 `useKeyboardHeight.js` 的组合式 API 文件如下所示: ```javascript import { ref, onMounted, onUnmounted } from 'vue'; export function useKeyboardHeight() { const keyboardHeight = ref(0); const updateHeight = ({ height }) => { keyboardHeight.value = height; }; onMounted(() => { uni.onKeyboardHeightChange(updateHeight); }); onUnmounted(() => { uni.offKeyboardHeightChange(updateHeight); }); return { keyboardHeight }; } ``` 随后只需简单导入即可享受便捷体验: ```javascript <script setup> import { useKeyboardHeight } from '@/composables/useKeyboardHeight'; const { keyboardHeight } = useKeyboardHeight(); console.log(keyboardHeight); // 动态反映实时数值 </script> ``` --- ### 注意事项 - 不同平台间可能存在细微差异,请务必测试覆盖 Android/iOS/H5 多种环境。 - 若发现某些机型无法正常工作,尝试查阅官方文档寻找替代方案或联系技术支持寻求帮助。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值