Android软键盘弹出,覆盖h5页面输入框问题

之前我们在使用vue进行 h5 表单录入的过程中,遇到了Android软键盘弹出,覆盖 h5页面 输入框 问题,在此进行回顾并分享给大家:

系统:Android

条件:当输入框在可视区底部或者偏下的位置

触发条件:输入框获取焦点,弹出软键盘

表现:软键盘 覆盖 h5页面中的输入框

问题分析:

1.发现问题:当前页面中box为flex布局,内容为上下固定高,中间自适应(中间区域内容过多会出现滚动条,input框在wrapper的底部),input获取焦点,手机键盘弹出,input未上移到可视区内,怀疑是flex布局导致。

h5页面 测试代码如下:

<html lang="en">
    <head>
      <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
      <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
        <style>
            html,body{
                width:100%;
                height:100%;
                margin:0;
                padding:0;
            }
            .box{
                display:flex;
                flex-direction:column;
                width:100%;
                height:100%;
            }
            .header{
                height:50px;
                width:100%;
                background:#368CDA;
                text-align:center;
                line-height:50px;
                font-size:20px;
                color:#fff;
            }
            .wrapper{
                flex:1;
                overflow:auto;
                width:100%;
            }
            .content {
                margin:0;
                padding:0;
            }
            .content li{
                margin:0;
                padding:0;
                list-style:none;
                height:150px;
                background:#FFCC99;
                text-align:center;
                line-height:150px;
                font-size:20px;
                color:#fff;
            }
            .content li:nth-child(2n){
                background:#CC99CC
            }
            .t-input{
                width:300px;
                height:50px;
                border:1px solid #FF0000;
            }
            .footer{
                width:100%;
                height:48px;
                background: #368CDA;
                text-align:center;
                line-height:48px;
                font-size:18px;
                color:#fff;
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div class="header">头部</div>
            <div class="wrapper">
                <ul class="content">
                  <li>内容区</li>
                  <li>内容区</li>
                  <li>内容区</li>
                  <li>内容区</li>
                  <li>内容区</li>
                </ul>
                <input type="text" class="t-input" placeholder="输入框">
            </div>
            <div class="footer">保存</div>
        </div>
    </body>
</html>

2.修改布局:去除box中的flex布局,将wrapper、footer通过position:absolute的方式定位在页面中,发现input依旧不上移,判定与flex布局无关,代码修改如下:

<style>
    .box{
        /*
        display:flex;
        flex-direction:column;
        */
        width:100%;
        height:100%;
        position:relative;

    }
    .wrapper{
        /*
        flex:1;
        */
        overflow:auto;
        width:100%;
        // 通过同时设置top、bototm,撑开wrapper,使之占屏幕除header和footer外的剩余高
        position:absolute;
        top:50px;
        bottom:48px;
    }
    .footer{
        width:100%;
        height:48px;
        background: #368CDA;
        text-align:center;
        line-height:48px;
        font-size:18px;
        color:#fff;
        position:absolute;
        bottom:0;
    }
</style>

3.真机模拟:进行真机与电脑连接调试,打开chrome的chrome://inspect,(如下图所示),发现键盘未弹出时html高度为512px,键盘弹出后html的高度为288px(减少区域的为软键盘区域),怀疑是否是因为html、body设置了height:100%的自适应布局后,高度跟随屏幕的可用高度改变而改变导致的。

4.代码调试:去除body的height:100%,给body添加一个正好能让软键盘弹出后遮住输入框的高度,body高度 = 288(软键盘出现后html高度)+50(输入框高度)+48(保存按钮高度) ,发现键盘弹出遮挡着input后,input框会自动上移到可视区内,问题定位成功。

解决方案:

方案1    页面渲染完成后,通过JS动态获取屏幕可视区高度(注:屏幕旋转后,需重新获取屏幕高度并赋值),并将其赋值到body的height,这样body的高度一直都是屏幕的高度,当软键盘弹出后,会将body向上推(因为body有了固定高度,不会再继承html的自适应高度),使输入框置到可视区内,代码如下:

document.body.style.height = window.screen.availHeight +‘px‘;

方案2    我们可以借助元素的 scrollIntoViewIfNeeded() 方法,这个方法执行后如果当前元素在可视区中不可见,则会滚动浏览器窗口或容器元素,最终让它可见,如果当前元素在可视区中,这个方法什么也不做,代码如下:

window.addEventListener(‘resize‘, () => {
    if (document.activeElement.tagName == ‘INPUT‘) {
        //延迟出现是因为有些 Android 手机键盘出现的比较慢
         window.setTimeout(() => {
            document.activeElement.scrollIntoViewIfNeeded();
         }, 100);
     }
});

原文地址:https://www.cnblogs.com/yalong/p/9112369.html

时间: 2024-08-07 17:01:39

Android软键盘弹出,覆盖h5页面输入框问题的相关文章

android软键盘弹出引起的各种不适终极解决方案

很多写登录界面的开发者都会遇到一个问题:那就是在登录界面时,当你点击输入框时,下边的按钮有时会被输入框挡住,这个不利于用户的体验,所以很多人希望软键盘弹出时,也能把按钮挤上去.很多开发者想要监听键盘的状态,这无疑是一个很麻烦的做法. 我们可以在AndroidManifest.xml的Activity设置属性:android:windowSoftInputMode = "adjustResize" ,软键盘弹出时,要对主窗口布局重新进行布局,并调用onSizeChanged方法,切记一点

Android软键盘弹出,布局移动

在项目的androidmanifest.xml文件中界面对应的<activity>里加入 android:windowsoftinputmode="adjustpan"这样键盘就会覆盖屏幕.. 如果不想键盘覆盖屏幕,想让屏幕整体上移,就加入属性android:windowsoftinputmode="statevisible|adjustresize" Android软键盘弹出,布局移动,布布扣,bubuko.com

Android软键盘弹出,界面整体上移的问题

AndroidManifest.xml文件中界面对应的<activity>里加入 android:windowSoftInputMode="adjustPan" 键盘就会覆盖屏幕 android:windowSoftInputMode="stateVisible|adjustResize" 屏幕整体上移 Android软键盘弹出,界面整体上移的问题

Android软键盘弹出时布局问题

最近项目需要做一个类似聊天室的模块,基于Socket实现的,这部分稍后一段时间再做总结,功能上的相关点都实现了小例子也做出来了,最后发现一个比较腻歪的问题就是软键盘弹出时总是会把标题“挤出”屏幕,(无论标题是写在布局中还是仿照theme的方式添加到style中),输入时有失观赏如下图:      隐隐感觉之前项目一直有类似问题,只不过一般只在登陆界面,无伤大雅,用户输入后一掠而过,可以忽略,但这个页面这么处理确实不太美观. 查了下此类问题大致两种思路解决:         一.调整布局在底层使用

Android 软键盘弹出时布局内指定内容上移实现及问题解决

Android SDK目前提供的软键盘弹出模式接口只有两种: 一是弹出时自动回冲界面,将所有元素上顶, 一种则是不重绘界面,直接将控件元素遮住,   没有其他模式,如果想实现其他效果,光使用系统接口是不行的.   解决方法:   第一步:给想要被顶上去的内容嵌套一个 ScrollView :   <ScrollView     android:layout_width="match_parent"     android:layout_height="0dp"

Android软键盘弹出时把布局顶上去的解决方法

原文: 解决Andriod软键盘出现把原来的布局给顶上去的方法(转) 链接:http://blog.sina.com.cn/s/blog_9564cb6e0101g2eb.html 决方法,在mainfest.xml中,对那个Activity加: <activityandroid:name=".activity.HomeActivity"android:windowSoftInputMode="adjustPan|stateHidden"></ac

android 软键盘弹出隐藏挤压界面等问题

Android中软键盘的使用是非常多的,下面为软键盘常用的设置: 1.横屏时,点击输入框出现全键盘解决方案: 在EditText.searchview等控件中加 android:imeOptions="flagNoExtractUi" 2.竖屏时,安卓会出现半屏. case1:你的输入框处于中下的位置,这样的话,键盘可能挡住输入框. 解决方法:在manifest中对activity设置 android:windowSoftInputMode="adjustResize&quo

Android软键盘弹出不影响布局的方法

The AndroidManifest.xml File android:windowSoftInputMode=["stateUnspecified", "stateUnchanged", "stateHidden", "stateAlwaysHidden", "stateVisible", "stateAlwaysVisible", "adjustUnspecified&q

edittext禁止android软键盘弹出

1. EditText ed=(EditText) findViewById(R.id.test); ed.clearFocus(); 2. 在AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为adjustUnspecified|stateHidden 比如:<activity android:name=".Main" android:label="@string/app_name" androi