37

当按下文本框后出现 ios 7 虚拟键盘时,我遇到了一个 div 元素粘在我的 Web 应用程序底部的问题。

我有这个 div 元素:

....
        <div id="footer" style="text-align:center">
            <div id="idName"><img alt="SomeName" src="images/logo.png" /></div>
        </div>

    </form>
</body>

它使用这种风格

#footer{
color:#CCC;
height: 48px;

position:fixed;
z-index:5;
bottom:0px;
width:100%;
padding-left:2px;
padding-right:2px;
padding:0;

border-top:1px solid #444;

background:#222; /* Old browsers */
background:-webkit-gradient(linear, 0 0, 0 100%, color-stop(0, #999), color-stop(0.02, #666), color-stop(1, #222));  
background:    -moz-linear-gradient(top, #999, #666 2%, #222); /* FF3.6+ */    
background: -webkit-linear-gradient(top, #999, #666 2%, #222); /* Chrome10+,Safari5.1+ */
background:      -o-linear-gradient(top, #999, #666 2%, #222); /* Opera 11.10+ */
background:     -ms-linear-gradient(top, #999, #666 2%, #222); /* IE10+ */
background:         linear-gradient(top, #999, #666 2%, #222); /* W3C */
}

当我按下文本框时,页脚元素会跳到虚拟键盘上方。当我的 iDevices 在 ios 7 之前的版本上运行时,它曾经可以工作。

左侧是按下文本框之前,右侧是按下文本框之后。

左侧:之前。 右侧:之后

页脚跳到虚拟键盘上方。

更新:

我已经更改了 Opossum 提供的元标记,现在页脚停留在底部:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--<meta name="viewport" content="initial-scale=1.0, user-scalable=0">-->
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, target-densityDpi=device-dpi"/>
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />

扩大

这不是问题的一部分,但是在 Android 上运行时修复会搞砸:) 有什么解决方案吗?

解决方案:删除了 maximum-scale 和 target-densityDpi,现在它适用于 IOS 和 Android。元标记现在看起来像这样:

<meta name="viewport" content="initial-scale=1.0, user-scalable=0, width=device-width, height=device-height"/>
4

7 回答 7

39

编辑:好的,我找到了另一种可能的解决方案。检查您的 html 元标记是否有类似的内容:

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">

用这个替换它:

<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, target-densityDpi=device-dpi" />

这解决了我的问题。我应该注意到我的应用程序正在使用 Cordova。

另一种可能的解决方案

如果您查看 config.xml(可能在资源目录下,您应该会看到一行内容:

<preference name="KeyboardShrinksView" value="false" />

如果将其设置为 true,它会阻止页脚在软键盘上方移动。但是,这也会导致键盘有时会掩盖用户正在输入的文本字段。

于 2013-09-24T20:06:49.360 回答
6

罪魁祸首在你的#footer课堂 上bottom:0px; 如果你给bottom任何元素,在虚拟键盘的外观上,这些元素在 iOS 7 中向上移动。解决方法是使用top属性。

于 2014-02-19T09:01:53.247 回答
3

我有点晚了,但这很好用:

var footer = $(".footer");
footer.css({ "top": footer.position().top, "bottom": "auto"});

这假设一个固定或绝对定位的元素具有底部:最初是某个数字。将此添加到 javascript 脚本中适当的位置(可能在页面加载时调用的函数上)。这使用 jQuery,但它很容易转换为 javascript。这基本上迫使页脚停留在与“顶部”值相关的底部,而不是“底部”值。

于 2014-06-17T18:48:17.410 回答
3

批准的答案有效,但可能会弄乱一些 CSS,所以我必须使用其他东西。这不是我的解决方法,但在互联网上找到了它,它对我有用:

HTML:

<body onResize="onResize();">

JavaScript:

function onResize(){
    var ios7 = (device.platform == 'iOS' && parseInt(device.version) >= 7);
    if (ios7){
        var height = $('body').height();
        if (height < 350){ // adjust this height value conforms to your layout
            $('.myBottomMenu').hide();
        }
        else {
            $('.myBottomMenu').show();
        }
    }
}
于 2013-12-20T09:45:03.923 回答
1

这是我们解决它的方法:cordova 2.9.0。解决方案 1. 添加视口元标记确实在一定程度上解决了问题,但并未完全解决。因此将其删除。解决方案 2。

$(document).on('focus','input, select, textarea',function() {
        if(OSName=== 'iOS' && ver[0] === 7){
                if($(this).attr('readonly')===undefined){
                        $('#footer').hide()
                }
         }
});
$(document).on('blur','input, select, textarea',function(){
             if(OSName=== 'iOS' && ver[0] === 7){
                   if($(this).attr('readonly')===undefined){
                   $('#footer').show();
                   }
              }
});

其中#footer 是包含页脚的 div 的 id。这将显示工具栏一秒钟并隐藏它,为了避免这种闪烁,我们在本机中添加了一些代码, 1. 在 MainViewcontroller.m 中注册键盘显示事件,在 init 函数中添加以下内容:

//fix for ios7 footer is scrolled up when the keyboard popsup.
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWillShow:)
                                                     name:UIKeyboardWillShowNotification
                                                   object:nil];

2.添加以下功能

-(void)keyboardWillShow:(NSNotification*)notification{
    //call the javascript to hide the footer.
    //fix for ios7 footer is scrolled along wiht the content when the keyboard comesup.
    if (IsAtLeastiOSVersion(@"7.0")){
        [self.webView stringByEvaluatingJavaScriptFromString:@"()"];
    }
}

3.在js文件中添加函数

//Fix for footer is misalligned when the virtual keyboard pops up ios7
//check for device is iPhone and os version is 7
function hideFooter(){
    if(OSName=== 'iOS' && ver[0] === 7){
        if($(this).attr('readonly')===undefined)
            $('#footer').hide();
    }
}

让我们知道此解决方案是否适合您。

于 2014-03-13T06:55:56.247 回答
0

在我的情况下,我曾经在输入输入文本字段事件并使用隐藏底栏时捕获事件

if($(event.target).hasClass("inputtextfield")){

        $('.bottom_bar').hide();}

并在键盘关闭时捕获事件并使用

document.addEventListener('focusout', function(e) { $('.bottom_bar').show();});
于 2014-02-06T20:03:48.407 回答
-3

你的 CSS 类属性的主要问题

页脚{}

您已设置“固定”位置和 z-index。

请根据 Iphone 处理位置属性。

于 2015-08-13T07:22:35.237 回答