隐藏在安卓Chrome键盘后面的输入文本框



我有一个以下格式的移动网页:

标题-徽标等-绝对定位

内容-可滚动,绝对定位

页脚,40px绝对定位

内容区域有多个输入框。在Android上的Chrome上,点击页面底部的输入框可进行输入当软键盘弹出时不在视野中。页面确实滚动以尝试向上移动框,但不足以实际移动可见。它最终隐藏在页脚后面。

知道怎么解决这个问题吗?这种情况仅在Chrome Android上发生。iOS上的SafariWindows Phone和其他移动浏览器上的IE也可以正常工作。

我希望有一个只支持CSS的解决方案,但我认为没有。Gaunt Face的答案是一个很好的方法。不幸的是,在我的情况下,这需要一些更改,并且有可能破坏自动化等(因为url中添加了#targets)。

我通过在2个点击处理程序中更改位置类型来解决这个问题。

我有一个用于任何输入/文本区域字段的点击处理程序。在该点击处理程序中,我将表单容器div的位置样式更改为静态。注意,如果容器字段有滚动条,这将把页脚推到底部。在我的情况下,这不是问题,因为当键盘弹出时,只有几个字段可见。用户看不到任何区别。

当用户点击输入字段时,我有第二个处理程序——页面点击处理程序——在这里我将位置类型恢复为绝对,使页面看起来和以前一样。

这有一个意想不到的后果——滚动位置丢失。我通过获取输入字段的偏移量并用该偏移量调用父div上的scrollTop来修复这个问题,从而恢复位置。

我看到了一些关于这方面的问题,但没有找到答案。我希望这能帮助到别人。

有几种方法可以解决这个问题,最明显的解决方案是使用javascript在URL上设置哈希。

你可以在这里看到一个例子:http://jsbin.com/emumeb/24/quiet代码:http://jsbin.com/emumeb/24/edit

对于稍微复杂一点的示例,如果有固定的页眉和页脚,则可能需要在设置哈希时使用目标来更改页面的外观。

根据你的布局,你可能需要更有创意,你可以在机身上设置一个类,用于聚焦状态和非聚焦状态,并相应地更改UI,但在移动、桌面等中保持良好体验开始变得棘手

下面是一个例子http://jsbin.com/emumeb/30/quiet代码:http://jsbin.com/emumeb/30/edit

显然,这是chrome应该自己处理的事情(类似于iOS的UX),所以我提出了一个针对chrome的错误-https://code.google.com/p/chromium/issues/detail?id=270018&can=4&colspec=ID%20Pri%20M%20迭代%20ReleaseBlock%20Cr%20Status%20Owner%20Summary%20OS%20已修改。

我不像你们聪明,

于是我拿了把尺子量了量手机屏幕的大小。第二然后测量键盘的大小

我注意到键盘占据了38%的屏幕。

所以我在页脚放了一个div,亲切地称它为青蛙。

我用了这个代码:

 $('body').on('focus', 'input, textarea', function(event) {
        var altura = $(window).height();
        var scrollp = parseInt(parseInt(altura)/100*38);
        $("#divSapo").css("height",scrollp + "px");
        window.scrollTo(0,document.body.scrollHeight);
    });

绝对定位更改为固定位置应该可以解决此问题。页面加载期间,元素相对于初始页面大小的绝对位置(添加键盘会缩小可见页面)。固定了元素相对于当前页面大小的位置,使元素保持在键盘上方。

#myElement {
  position: fixed;
  bottom: 2em;
}

我发现了一个运行良好的CSS解决方案。

你可以对300px高度或更小的窗口屏幕进行css查询,这是显示软件键盘的手机的主要屏幕高度。它工作得很快,也很好。例如

@media screen and (max-height: 300px) {
    #myinputtext{
        position: absolute; 
        top: 50px;
    }
}

我使用scrollIntoView来解决这个问题。

$(document).on('focus', selector, function() {
    document.querySelector(selector).scrollIntoView();
});

如果您使用jQuery,您可以使用以下代码:

$('body').on('focusin', 'input, textarea', function(event) {
  if(navigator.userAgent.indexOf('Android') > -1 && ...){
   var scroll = $(this).offset();
   window.scrollTo(0, scroll);
 }
});

不过,这个错误现在应该解决了。

相关内容

最新更新