移动端弹出软键盘时会将页面顶上去

本文探讨了移动端项目中软键盘弹出导致的页面布局错乱问题,包括样式破坏和自动填充影响,提供了通过调整父元素定位及监听窗口尺寸变化来保持页面可见性的解决方案。

之前做移动端项目时有出现过这样的情况,主要原因是因为当软键盘弹出,因为软键盘与页面处于相同层级,软键盘的出现会破坏原本的样式,造成部分页面不可见问题
还有一个细节问题,之前因为会出现浏览器保存的信息(类似于模糊查找),弹出后如果不选择弹出的选项的话,直接关闭软键盘,弹出的位置不会改变,影响效果
需要在input框阻止自动填充

注:当时我设置最外层父元素为相对定位,不可将之设置为固定定位,否则下面样式不会生效

<input type="text"  autocomplete="off"/>
软键盘出现前页面高度
var winHeight = window.outerHeight;
    window.onresize = function(){
    软键盘出现时页面的高度
        var changeHeight = window.outerHeight;
        if(winHeight-changeHeight>40){
            document.body.style.height=winHeight+"px";
        }else{
            document.body.style.height='100%';
        }
 	 }
移动端开发中,软键盘弹起导致页面布局错位是一个常见的问题,特别是在输入框聚焦时,软键盘弹出会压缩页面可视区域,导致页面内容被顶起或滚动,从而隐藏了头部的 `navbar`。这个问题通常出现在 H5 页面、微信小程序或者 Hybrid App 中。 ### 解决方案 #### 1. 监听软键盘弹出事件并调整样式(适用于 H5) 我们可以监听 `focus` 和 `blur` 事件来判断输入框是否获得焦点,并据此对页面进行适配处理。 ```html <!-- HTML 示例 --> <input type="text" id="inputField" placeholder="点击输入"> ``` ```javascript // JavaScript 示例 const input = document.getElementById('inputField'); const navbar = document.querySelector('.navbar'); input.addEventListener('focus', () => { // 软键盘弹出时的操作 navbar.style.position = 'absolute'; // 或者 hidden navbar.style.top = '0'; window.scrollTo(0, 0); // 强制页面回到顶部 }); input.addEventListener('blur', () => { // 软键盘收起时恢复 navbar.style.position = 'fixed'; navbar.style.top = '0'; }); ``` **解释:** - 当输入框获得焦点时,我们修改 `navbar` 的定位方式为 `absolute`,避免其跟随页面滚动; - 使用 `window.scrollTo(0, 0)` 可以防止页面自动滚动到底部; - 当输入框失去焦点时,恢复 `navbar` 的固定定位。 --- #### 2. 使用 CSS 媒体查询(适用于部分场景) 你可以使用 `height: 100vh` 来固定视口高度,结合媒体查询来检测设备方向变化或键盘弹出: ```css body { height: 100vh; overflow: hidden; } .container { height: 100%; display: flex; flex-direction: column; } .navbar { flex-shrink: 0; } .content { flex: 1; overflow-y: auto; } ``` 这样即使软键盘弹出,主体内容也可以保持滚动,而 `navbar` 不会被顶上去。 --- #### 3. 在 Hybrid App 中处理(如 Android) 如果你是在 WebView 中加载 H5 页面,可以通过原生代码监听软键盘状态,并通过 JSBridge 通知前端做适配。 ##### Android 示例: ```java // 在 Activity 中监听软键盘变化 final View activityRootView = findViewById(R.id.activityRoot); activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int heightDiff = activityRootView.getRootView().getHeight() - activityRootView.getHeight(); if (heightDiff > dpToPx(activityRootView.getContext(), 200)) { // 键盘弹出 webView.loadUrl("javascript:onKeyboardShow()"); } else { webView.loadUrl("javascript:onKeyboardHide()"); } } }); ``` 然后在 JS 中定义这两个函数: ```javascript function onKeyboardShow() { document.querySelector('.navbar').style.display = 'none'; } function onKeyboardHide() { document.querySelector('.navbar').style.display = 'block'; } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值