H5移动端输入框随键盘上移

本文介绍了一种在iOS设备上解决键盘遮挡网页输入框的技术方案,通过使用虚拟输入框和监听键盘事件来确保输入框始终位于键盘上方,提供更好的用户体验。
textarea置底展示问题

ios 中的输入体验永远伴随着一个问题,就是当唤起键盘后,整个页面会被键盘压缩,也就是说页面的高度变小,并且所有的fixed全部变为了absolute。
android效果:

使用 fixed 定位。

可见 android 中唤起键盘是覆盖在页面上,不会压缩页面。

在 ios 上的效果:

那么如果我们需要将输入框固定在屏幕下方,而当键盘被唤起同时输入框固定在键盘上方(如下图样式)该如何解决呢?

首先我们来看下 ios 的表现。

可以看出,键盘会将页面顶上去。那么如果希望可以将输入框和键盘完全贴合,我们可以使用div模拟一个假的输入框,使用定位将真正的输入框隐藏掉,当点击假的输入框的时候,将真正的输入框定位到键盘上方,并且手动获取输入框焦点。

在实现过程中需要注意下面几个问题:

1、真正的输入框的位置计算:

首先记录无键盘时的 window.innerHeight,当键盘弹出后再获取当前的 window.innerHeight ,两者的差值即为键盘的高度,那么定位真输入框自然就很容易了。

2、在 ios 下手动获取焦点不可以用 click 事件,需要使用 tap 事件才可以手动触发

$('#fake-input').on($.os.ios?'tap' : 'click', function() {
    initHeight = window.innerHeight;
    $('#input').focus();
});

3、当键盘收起的时候我们需要将真输入框再次隐藏掉,除了使用失去焦点(blur)方法,还有什么方法可以判断键盘是否收起呢?

这里可以使用 setInterval 监听,当当前 window.innerHeight 和整屏高度相等的时候判断为键盘收起。
注意:键盘弹起需要一点时间,所以计算当前屏幕高度也需要使用setInterval。

4、因为 textarea 中的文字不能置

H5 移动端开发中,软键盘弹出遮挡页面内容是一个常见问题,尤其是在输入框位于页面底部或接近底部时,软键盘弹出后可能会导致输入框被遮挡,影响用户输入体验。以下是几种有效的解决方案: ### 1. 使用 `scroll-padding-bottom` 动态调整页面底部内边距 当输入框获取焦点时,可以动态为页面添加底部内边距(`scroll-padding-bottom`),防止输入框键盘遮挡。这种方法在现代浏览器中兼容性较好。 ```css html { scroll-padding-bottom: 20px; } ``` ```javascript document.querySelector('input').addEventListener('focus', () => { document.documentElement.style.scrollPaddingBottom = '100px'; }); document.querySelector('input').addEventListener('blur', () => { document.documentElement.style.scrollPaddingBottom = '20px'; }); ``` ### 2. 固定定位输入框并动态调整位置输入框设置为 `position: fixed`,并根据键盘弹出时的高度动态调整其位置,使其始终可见。这种方法适用于输入框位于底部的场景。 ```css .input-wrapper { position: fixed; bottom: 0; left: 0; right: 0; padding: 10px; background: #fff; z-index: 999; } ``` ```javascript let originalHeight = window.innerHeight; window.addEventListener('resize', () => { const newHeight = window.innerHeight; const inputWrapper = document.querySelector('.input-wrapper'); if (newHeight < originalHeight) { // 键盘弹出 inputWrapper.style.bottom = '100px'; } else { // 键盘收起 inputWrapper.style.bottom = '0'; } }); ``` ### 3. 监听窗口高度变化并动态调整布局 通过监听 `window.resize` 事件判断键盘是否弹出,并根据窗口高度变化动态调整页面布局。例如,在 Vue 项目中可以结合 `localStorage` 存储原始窗口高度。 ```javascript const originalHeight = window.innerHeight; window.addEventListener('resize', () => { if (window.innerHeight < originalHeight) { // 键盘弹出,执行页面调整逻辑 document.body.classList.add('keyboard-open'); } else { // 键盘收起 document.body.classList.remove('keyboard-open'); } }); ``` 结合 CSS 控制页面样式变化: ```css .keyboard-open { padding-bottom: 100px; } ``` ### 4. 使用 vh 单位与 calc 函数动态计算高度 通过 `vh` 视口单位与 `calc` 函数动态计算页面高度,确保输入框键盘弹出后仍可见。 ```css .container { height: calc(100vh - 100px); } ``` ### 5. 页面自动滚动到输入框位置输入框获取焦点时,使用 `scrollIntoView` 方法自动将输入框滚动到可视区域。 ```javascript document.querySelector('input').addEventListener('focus', () => { document.querySelector('input').scrollIntoView({ behavior: 'smooth', block: 'center' }); }); ``` ### 6. 结合 UniApp 的页面配置与兼容性处理 在 UniApp 中,可以通过 `pages.json` 配置页面软键盘行为,避免页面被顶起: ```json { "pages": [ { "path": "pages/index/index", "style": { "navigationBarTitleText": "首页", "usingComponents": true, "h5": { "scrollTop": true } } } ], "globalStyle": { "navigationStyle": "custom" } } ``` 同时,在页面中监听输入框的 `focus` 和 `blur` 事件,动态调整样式或滚动行为,确保输入框始终可见[^4]。 ---
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值