当键盘显示时,使用jquery调整窗口大小

gijlo24d  于 12个月前  发布在  jQuery
关注(0)|答案(1)|浏览(135)

首先,我知道有很多关于这个主题的问题,我已经找了几个星期了,但是我找不到一个适合我的答案。
我有一个在底部输入字段的网站。该网站有一个非常简单的设计。

  • 报头
  • 内容(动态高度)
  • 带输入字段的页脚

这个问题很简单,但很烦人。当用户在PC浏览器中点击输入字段时,一切正常。当在移动的浏览器中点击输入字段时,除了safari之外的所有都会降低内容div的高度。
当你在safari中点击它时,因为输入字段是一个底部,整个页面会向上滚动,在那里用户丢失了一部分标题和内容(溢出)。
我该怎么解决这个问题?我可以指示safari重新计算布局时,键盘是opend?我已经尝试了这么多的东西,如固定布局(痛苦的我),火灾事件时,输入字段是hierd,调整高度的内容div(但有不同的键盘在不同的设备上),调整高度的文档,身体和容器div(其中所有其他的都在里面)。
Image that shows the problem exactlysource(https://blog.opendigerati.com/the-eccentric-ways-of-ios-safari-with-the-keyboard-b5aa3f34228d)在这个源代码上还有一些变通方法,技巧。但是我不能让它们为我工作。我想实现页脚和页眉保持固定,内容减小尺寸。即使我通过jquery/css更改了内容div的高度,当键盘显示时,页脚下方也会有一个空格。
我读了很多帖子,代码,文章,如medium,旧堆栈溢出postsdifferent websites上的jquery代码,但我不能得到它的权利。
有没有一个简单而有效的方法来解决这个问题?如果可能的话,没有任何代码,使事情变得不必要的复杂。我最好的猜测是,我可以指示safari重新计算视口高度,让css在键盘出现时做它的事情?
如果需要代码示例,我很乐意给你。
先谢了。
我尝试的事情:

  • 阅读文章
  • 搜索了好几周
  • 测试许多jquery,css和插件形式不同的来源
  • 建立一个小的例子来找到问题的根源
  • 在不同设备和操作系统的不同浏览器中进行测试
puruo6ea

puruo6ea1#

好吧,经过大量的思考,我找到了一个可行的解决方案,所以我在这里张贴,而不是其他人想使用它。
首先:如果你想在输入字段获得焦点并且键盘出现时禁用滚动:

input[type=text]:focus {
  animation: DisableScrollingWhenKeyboard 0.01s;
}

@keyframes DisableScrollingWhenKeyboard {
  0% { opacity: 0; }
  100% { opacity: 1; }
}

字符串
不与下面的代码一起工作,因为innerheight永远不会更改。
它所做的很简单,它改变了不透明度,所以safari在检查输入框时看不到它;因此safari不会滚动页面。但是现在事情可以在键盘后面进行。所以这不适合我。找到了这个代码here。重要的是不用说。
我现在所做的实际上是写here,但有一些变化。
首先,检查它是否是safari(我知道有更好的替代品,但现在我很高兴与它)

var is_safari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);


当你确实有那块.浏览器检测
1.获取内部窗口的原始高度
1.获取主体的高度
1.当键盘完全向上时(大约需要200毫秒)再次检查,看看是否有差异。当有差异时:
1.得到的差异。差异是键盘的高度,现在是了。例如:高度是1000 px,与键盘了屏幕的新高度是700 px。键盘的高度是300 px。
1.将主体设置为新高度(originalHeight - newHeight)
1.向上滚动页面
是的,当键盘出现时,它会有一点闪光和 Flink 的情况,但我很高兴。它可以在不同的屏幕和键盘上工作,因为高度是计算出来的。

function resizeHandler() {       
  var OriginalviewportHeight = window.innerHeight
  var OriginalBodyHeight =  $('body').height();       
  setTimeout(function() {
    if (OriginalviewportHeight != window.innerHeight) {
      KeyboardHeight = OriginalviewportHeight - window.innerHeight;             
      $('body').css("height", + (OriginalBodyHeight - KeyboardHeight) +"px");
      $(window).scrollTop(0);
    }            
  },200); 
}


所有这些都是在输入字段获得焦点时完成的(屏幕高度的差异检查不会让它在电脑屏幕上或safari中的物理键盘上触发)。

$("#userInputField").focus(function() {
  if (is_safari){
    resizeHandler();
  }            
});


当我们再次失去焦点时,重新设置身体高度:

$("#userInputField").on("focusout", function() {
  if (is_safari) {
    $('body').css("height", "100%");
  }    
});


我知道这不是最完美的解决方案,但就目前而言,它可以解决输入字段获得焦点时滚动的问题,而且只适用于Safari移动的/平板电脑。因此,Chrome、Android、Firefox等的流畅用户体验并没有被破坏。
有什么改进的想法,请分享。我希望这能帮助别人或指出正确的方向。

相关问题