iOS 5固定定位和虚拟键盘

jef*_*ffc 135 css-position virtual-keyboard ios5

我有一个移动网站,它通过位置固定在屏幕底部的div.一切都在iOS 5中正常工作(我在iPod Touch上测试),直到我在一个带有表单的页面上.当我点击输入字段并出现虚拟键盘时,我的div的固定位置突然丢失.只要键盘可见,div就会随页面滚动.单击完成以关闭键盘后,div将恢复到屏幕底部的位置并遵循位置:固定规则.

有没有其他人经历过这种行为?这是预期的吗?谢谢.

Nic*_*ack 49

我的申请中遇到了这个问题.这是我如何解决它:

input.on('focus', function(){
    header.css({position:'absolute'});
});
input.on('blur', function(){
    header.css({position:'fixed'});
});
Run Code Online (Sandbox Code Playgroud)

我只是滚动到顶部并将其定位在那里,因此iOS用户不会注意到任何奇怪的事情.在一些用户代理检测中包含此内容,以便其他用户不会出现此行为.

  • 我还删除了$(窗口).scrollTop(0)...我不认为这是必要的,它导致不必要的滚动. (8认同)
  • 这非常有效.我只为iOS设备调用它:var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent); (2认同)

ds1*_*111 15

我的ipad问题略有不同,虚拟键盘将我的视口推到屏幕外.然后在用户关闭虚拟键盘后,我的视口仍在屏幕外.在我的情况下,我做了类似以下的事情:

var el = document.getElementById('someInputElement');
function blurInput() {
    window.scrollTo(0, 0);
}
el.addEventListener('blur', blurInput, false);
Run Code Online (Sandbox Code Playgroud)

  • 对我没有帮助:( (3认同)

Hat*_*tch 14

这是我们用来解决ipad问题的代码.它基本上检测偏移和滚动位置之间的差异 - 这意味着'固定'不能正常工作.

$(window).bind('scroll', function () {
    var $nav = $(".navbar")
    var scrollTop = $(window).scrollTop();
    var offsetTop = $nav.offset().top;

    if (Math.abs(scrollTop - offsetTop) > 1) {
        $nav.css('position', 'absolute');
        setTimeout(function(){
            $nav.css('position', 'fixed');
        }, 1);
    }
});
Run Code Online (Sandbox Code Playgroud)


Ril*_*ton 12

当键盘启动时,位置固定元件不会更新它们的位置.我发现通过欺骗Safari认为页面已经调整大小,元素将重新定位自己.它并不完美,但至少你不必担心转换到"位置:绝对"并自己跟踪变化.

以下代码只是监听用户何时可能正在使用键盘(由于输入被聚焦),并且直到它听到模糊,它只是侦听任何滚动事件然后执行调整大小的技巧.到目前为止,似乎对我来说工作得很好.

    var needsScrollUpdate = false;
    $(document).scroll(function(){
        if(needsScrollUpdate) {
            setTimeout(function() {
                $("body").css("height", "+=1").css("height", "-=1");
            }, 0);
        }
    });
    $("input, textarea").live("focus", function(e) {
        needsScrollUpdate = true;
    });

    $("input, textarea").live("blur", function(e) {
        needsScrollUpdate = false;
    });
Run Code Online (Sandbox Code Playgroud)

  • 不再起作用,iOS可能修复了这项工作的任何错误 (6认同)

小智 6

以防有人在研究这个问题的时候发生了这个问题.我发现这个帖子有助于激发我对这个问题的思考.

这是我最近一个项目的解决方案.您只需将"targetElem"的值更改为表示标题的jQuery选择器.

if(navigator.userAgent.match(/iPad/i) != null){

var iOSKeyboardFix = {
      targetElem: $('#fooSelector'),
      init: (function(){
        $("input, textarea").on("focus", function() {
          iOSKeyboardFix.bind();
        });
      })(),

      bind: function(){
            $(document).on('scroll', iOSKeyboardFix.react);  
                 iOSKeyboardFix.react();      
      },

      react: function(){

              var offsetX  = iOSKeyboardFix.targetElem.offset().top;
              var scrollX = $(window).scrollTop();
              var changeX = offsetX - scrollX; 

              iOSKeyboardFix.targetElem.css({'position': 'fixed', 'top' : '-'+changeX+'px'});

              $('input, textarea').on('blur', iOSKeyboardFix.undo);

              $(document).on('touchstart', iOSKeyboardFix.undo);
      },

      undo: function(){

          iOSKeyboardFix.targetElem.removeAttr('style');
          document.activeElement.blur();
          $(document).off('scroll',iOSKeyboardFix.react);
          $(document).off('touchstart', iOSKeyboardFix.undo);
          $('input, textarea').off('blur', iOSKeyboardFix.undo);
      }
};

};
Run Code Online (Sandbox Code Playgroud)

修复程序有一点延迟,因为iOS在滚动时停止了DOM操作,但它确实有效......