弹出键盘时输入框被遮住

本文探讨了在移动端开发中,解决输入框被虚拟键盘遮挡的问题,提出了三种有效策略:通过CSS改变输入框位置,调整body高度并滚动至输入框,及使用scrollIntoViewIfNeeded()方法。

在移动端弹出键盘时输入框被遮住,如果使用定位将输入框(input或者textarea)定位到顶部区域,当手机的输入法为自带输入法时可能问题不大,但是当使用类似搜狗等输入法时,由于会高出自带输入法大约30个像素,就会造成输入框被遮盖一部分的现象。

一、根据输入框的焦点来改变输入框的位置

css 当输入框获得焦点, 改变位置

input:focus{

      position:fixed;

      top:50px;

}

二、点击输入框时加长body元素高度到9999px(当然不一定非要这么高),页面滚动到空白区域,再生成输入框添加在当前一屏页面的最顶端。

<html>
 
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
        <title>Examples</title>
        <meta content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0,user-scalable=no" name="viewport">
        <meta name="description" content="">
        <meta name="keywords" content="">
        <link href="" rel="stylesheet">
        <style type="text/css">
            * {
                margin: 0px;
                padding: 0px;
            }
 
            body,
            html {
                padding: 5px;
            }
 
            .scrollDiv {
                width: 100%;
                height: 900px;
                background: #ccc;
                font-size: 24px;
                padding-top: 40px;
                text-align: center;
            }
 
            input {
                -webkit-appearance: none;
                width: 100%;
                display: block;
                margin: 10px auto;
                border-radius: 0px;
                font-size: 16px;
                padding: 12px 10px;
                box-sizing: border-box;
                box-shadow: none;
                border: 1px solid #666;
 
                position: fixed;
                left: 0;
                bottom: 0;
 
            }
        </style>
    </head>
 
    <body style="">
        <div class="main">
            <div class="scrollDiv">滑到最下面</div>
            <input type="text" placeholder="点击我" id="inp">
        </div>
        <script type="text/javascript">
            var inp = document.querySelector('#inp');
            var bodyHeight = document.body.offsetHeight;
            inp.onclick = function(ev) {
                document.querySelector('body').style.height = '99999px';
                inp.style.position = 'static';
                setTimeout(function() {
                    document.body.scrollTop = document.documentElement.scrollTop = inp.getBoundingClientRect().top + pageYOffset - 5;
                }, 50);
                window.addEventListener('touchmove', fn, false);
            }
 
            inp.onblur = function() {
                    document.querySelector('body').style.height = "auto"
                    document.querySelector('body').removeAttribute('style')
                    window.removeEventListener('touchmove', fn, false)
                }
                //触摸取消blur
            function fn(ev) {
                var _target = ev.target || ev.srcElement;
                if(_target.nodeName != 'INPUT') {
                    inp.blur();
                }
                ev.preventDefault()
            };
        </script>
    </body>
 
</html>

三、scrollIntoViewIfNeeded() 方法

Element.scrollIntoViewIfNeeded()方法用来将不在浏览器窗口的可见区域内的元素滚动到浏览器窗口的可见区域。 如果该元素已经在浏览器窗口的可见区域内,则不会发生滚动。 此方法是标准的Element.scrollIntoView()方法的专有变体。

语法

element.scrollIntoViewIfNeeded(); // 等同于element.scrollIntoViewIfNeeded(true) 
element.scrollIntoViewIfNeeded(true); 
element.scrollIntoViewIfNeeded(false);

参数

opt_center

一个 Boolean 类型的值,默认为true:

  • 如果为true,则元素将在其所在滚动区的可视区域中居中对齐。

  • 如果为false,则元素将与其所在滚动区的可视区域最近的边缘对齐。 根据可见区域最靠近元素的哪个边缘,元素的顶部将与可见区域的顶部边缘对准,或者元素的底部边缘将与可见区域的底部边缘对准。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title></title>
    <meta
      name="viewport"
      content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
    />
    <script type="text/javascript" src="js/jquery-1.11.0.js"></script>
    <style type="text/css">
      input {
        width: 100%;
        height: 50px;
        background-color: darkgreen;
        position: fixed;
        left: 0;
        bottom: 0;
      }
      .lo {
        width: 300px;
        height: 50px;
        background-color: darkcyan;
        text-align: center;
        line-height: 50px;
      }
      .xxx {
        width: 50px;
        height: 1000px;
        background-color: darkgrey;
      }
    </style>
  </head>

  <body>
    <div class="lo">点这里</div>
    <div class="xxx"></div>
    <input type="text" id="txt" />
    <div id="dv"></div>
    <script>
      $(".lo").click(function() {
        $("#txt").css({ position: "relative" });
        $("#txt").focus();
      });

      $('input[type="text"],textarea').on("focus", function() {
        var target = this;
        setTimeout(function() {
          target.scrollIntoViewIfNeeded();
          console.log("scrollIntoViewIfNeeded");
        }, 200);
      });
    </script>
  </body>
</html>

 

<think>嗯,用户这次的问题是关于在uniapp移动端开发中解决键盘弹出遮挡输入框的方法。从用户提供的引用内容来看,已经有三个具体的解决方案参考,但用户希望我整合出更系统的方法说明。 用户可能是正在开发uniapp应用的工程师,遇到了实际界面交互问题,比较着急解决。ta特意强调“不是用户真正的需求”,说明需要的是经过验证的通用方案而非单纯引用。深层需求应该是找出最简单高效且跨平台兼容的方案。 我注意到三个引用都聚焦在同一个问题,但提供了不同角度: 1. 引用[1]给出了两种方案:动态监听键盘高度改变布局 + 修改全局软键盘模式 2. 引用[2]补充了pages.json的配置语法细节 3. 引用[3]展示了adjust-position属性的用法 需要特别注意两点技术细节:一是App和小程序的兼容性差异(keyboardheightchange事件在App 3.1.0+才支持),二是adjustResize模式在安卓iOS的表现差异。用户没提平台,所以回复里要区分说明。 最好把方案归类为全局配置和局部控制两种思路。全局方案适合整个应用都需要统一处理的情况,用softinputMode设置;局部方案适合特定页面精细化控制,用事件监听。还要提醒用户注意安卓全面屏适配可能出现的黑边问题,这在引用[1]末尾提到过。 用户上次的对话历史是关于LaTeX格式的系统指令,和当前问题无关,可以忽略。但需要遵守当前对话的中文回答要求,并且保持技术指导的准确性。回复要突出核心方法的代码片段,像示例那样用代码块展示关键配置。 </think>在 UniApp 移动端开发中,解决键盘弹出遮挡输入框的常见方法如下,根据实现方式和适用场景分为两类: --- ### **方法一:全局配置软键盘模式(推荐基础方案)** 通过修改 `pages.json` 中的 `softinputMode` 参数,强制 Webview 窗体高度自动调整: ```json "pages": [ { "path": "pages/yourPage", "style": { "app-plus": { "softinputMode": "adjustResize" // 关键配置 } } } ] ``` **原理**: 键盘弹出,Webview 窗体高度会被压缩(屏幕高度 = Webview 高度 + 键盘高度),页面内容自动上推,避免输入框遮挡。 **优缺点**: - ✅ **简单高效**:无需额外代码,全页面生效 - ⚠️ **兼容性问题**: - Android 部分机型可能出现短暂黑屏(Webview 重绘导致)[^1] - iOS 默认支持此行为,Android 需显式配置 --- ### **方法二:动态监听键盘高度(精细控制方案)** 适用于需自定义底部布局(如悬浮按钮、固定工具栏)的场景: ```vue <template> <view class="input-container" :style="{ bottom: keyboardHeight + 'px' }"> <input @keyboardheightchange="handleKeyboardChange" :adjust-position="false" // 禁用自动上推 /> </view> </template> <script> export default { data() { return { keyboardHeight: 0 }; }, methods: { handleKeyboardChange(e) { this.keyboardHeight = e.detail.height; // 获取键盘高度 } } }; </script> <style> .input-container { position: fixed; bottom: 0; left: 0; width: 100%; } </style> ``` **关键说明**: 1. `@keyboardheightchange`:监听键盘高度变化(支持 App 3.1.0+、微信小程序基础库 2.7.0+)[^1] 2. `:adjust-position="false"`:禁用输入框自动上推,避免与手动布局冲突[^3] 3. **定位策略**:通过 `position: fixed` + 动态 `bottom` 值,使输入区域始终高于键盘 --- ### **方法三:混合模式(应对复杂场景)** 结合上述两种方案,在全局配置的基础上局部微调: ```json // pages.json "app-plus": { "softinputMode": "adjustResize" // 基础布局自适应 } ``` ```vue // 特定页面 <input :adjust-position="false" @focus="scrollToInput()" // 自定义滚动逻辑 /> ``` --- ### **选择建议** | 方案 | 适用场景 | 注意事项 | |---------------------|----------------------------------|----------------------------| | 全局 `adjustResize` | 简单表单页 | 测试 Android 机型兼容性[^2] | | 动态高度监听 | 底部固定栏、悬浮按钮等复杂交互 | 需处理键盘收起重置逻辑 | | 混合模式 | 页面中存在特殊布局组件 | 优先确保全局配置生效 | > ⚠️ **避坑提示**: > - Android 全面屏手机需在 `manifest.json` 中配置 `"fullScreen": false`,避免安全区域问题 > - 若使用 `adjustResize` 后仍有遮挡,检查页面 CSS 是否包含 `overflow: hidden` > - 动态方案中,键盘收起需将 `keyboardHeight` 重置为 `0` --- #### **相关问题** 1. UniApp 中 `adjustResize` 模式在 Android 机型失效如何解决? 2. 如何兼容 iOS 和 Android 的键盘弹起动画差异? 3. 在 Vue3 + UniApp 组合式 API 中如何监听键盘事件?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值