h5兼容安卓和iOS的键盘弹出影响布局的坑

本文介绍了一个关于移动端键盘弹出导致页面布局错乱的问题,并提供了解决方案。通过监听窗口尺寸变化来调整页面高度,确保键盘弹出时确认订单按钮不会被遮挡。

这个是真的坑!!!!!!!!!!!

1、先看看正常页面长什么样子,号码是我乱输入的,大家不要乱打= =

2、然后再看看输入号码后键盘把这个订单确认的框顶上去了,顶上去对大屏幕手机也没关系,就是对小屏幕手机会把订单确认订到被隐藏一些。点击键盘的下符号后,键盘收起来,但是订单确认这个框就被定位上去了,需要点击一下才能恢复原样。

      

3、查阅大量资料,呕心沥血,加了点代码,先来看看效果,这样键盘出来就不会把订单确认框顶上去下不来了(手动开心==)

       

4、我想说这个csdn也有bug,这篇我保存两次都只有一半的文章(黑人问号?)现在是第三次补全我的文章,拜托不要给我找茬儿好么,谢谢csdn了!!!!!

 

// 兼容Android 键盘弹起时,把确认订单弹窗顶上去影响布局
const h = document.body.scrollHeight  // 用onresize事件监控窗口或框架被调整大小,先把一开始的高度记录下来
window.onresize = function () { // 如果当前窗口小于一开始记录的窗口高度,那就让当前窗口等于一开始窗口的高度
  if (document.body.scrollHeight < h) {
    document.body.style.height = h
  }
}

 

邀请大家关注公众,大家一起成长

 

 

 

 

 

 

### HTML5 在 Android iOS 平台上的兼容性问题及解决方案 在开发 H5 页面时,HTML5 在 Android iOS 平台上常常会遇到一些兼容性问题。这些问题主要集中在表单元素、事件处理、样式渲染以及用户交互等方面。 #### 1. 表单元素的默认样式差异 iOS 上的 `<input>` `<textarea>` 元素默认带有内阴影效果,这与 Android 的表现不同。这种差异可能导致页面在不同设备上显示不一致。 解决方法:通过自定义 CSS 样式来覆盖默认样式,例如设置 `appearance: none` 或 `border-radius` 来消除内阴影效果,并统一输入框的外观[^3]。 #### 2. 输入框的焦点问题 在 iOS 上,使用 JavaScript 调用 `.focus()` 方法或设置 `autofocus` 属性可能无法正常工作。这是由于 iOS 对焦点获取的限制导致的。 解决方法:可以通过监听触摸事件并在事件触发后手动调用 `.focus()` 方法,或者通过延迟执行 `.focus()` 来绕过此问题[^3]。 #### 3. 长按事件引发的文字选中菜单弹出iOS 上,长按页面中的文字区域可能会触发文字选中默认菜单(如复制、粘贴)的弹出,这会影响用户体验。 解决方法:可以添加 CSS 样式 `user-select: none` 来禁止文字选择,同时阻止默认菜单的弹出。此外,也可以通过 JavaScript 监听 `touchstart` `touchend` 事件并进行逻辑判断来优化交互体验[^3]。 #### 4. Touch 事件 Click 事件混用引发的 Bug 在某些情况下,混合使用 `touch` `click` 事件可能导致意外的行为,例如点击事件被多次触发或响应延迟。 解决方法:建议统一使用 `touch` 事件处理移动端交互,避免混用 `click` 事件。如果必须使用 `click` 事件,可以考虑引入 FastClick 库来消除点击延迟并优化触控体验[^3]。 #### 5. 页面底部弹框时出现白框 在 iOS 上,当页面内触发弹窗时,页面底部可能会短暂地出现一个白框,影响视觉体验。 解决方法:可以通过对页面容器设置 `position: fixed` 或调整 `overflow` 属性来防止页面滚动,从而避免白框的出现。此外,还可以尝试将弹窗内容提前渲染并隐藏,在需要时直接显示。 #### 6. 键盘弹出导致页面布局错乱 在 iOS 上,键盘弹出页面会被向上顶起,可能导致页面布局变形或部分内容被遮挡。 解决方法:可以通过监听 `resize` 或 `keyboardWillShow` 事件动态调整页面布局。例如,在键盘弹出时,适当缩小页面高度或调整元素的位置,以确保主要内容仍然可见[^3]。 #### 7. 文字垂直居中问题 在部分 Android 设备上,使用 `height` 等于 `line-height` 或通过设置上下 `padding` 实现文字垂直居中的方法可能会导致文字偏上。这是因为字体底部预留了空间用于特殊字符的展示。 解决方法:建议使用 Flexbox 布局并通过 `align-items: center` 属性实现垂直居中。同时,可以为文字所在的元素添加 `padding-top: 1px` 来进一步修正位置,确保在不同设备上的一致性[^4]。 ### 示例代码 以下是一个简单的示例,展示如何通过 CSS JavaScript 解决部分兼容性问题: ```css /* 统一输入框样式 */ input, textarea { appearance: none; border-radius: 4px; padding: 10px; user-select: none; } /* 防止页面滚动 */ .container { position: fixed; width: 100%; height: 100%; overflow: hidden; } ``` ```javascript // 手动触发焦点 document.getElementById('inputField').addEventListener('touchstart', function() { this.focus(); }); // 动态调整页面高度 window.addEventListener('resize', function() { const windowHeight = window.innerHeight; document.querySelector('.container').style.height = `${windowHeight}px`; }); ```
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值