1、问题由来

做h5 已经有很长一段时间了,现在做的工作h5比pc上的更多,曾经解决pc端IE各个版本的兼容性也是伤透脑筋,原以为h5的会更好,殊不知,还有更头疼的问题,当设计师要设计一个聊天窗口,把输入框定位在最底部,这是再常见不过的问题了吧,举例:

上图就是我最近做的一个功能,原以为是很简单的一个定位功能,但是没想到牛逼的测试居然用各种iphone,各种安卓,各种浏览器(qq浏览器、safari、opera等浏览器),各种输入法(系统自带、搜狗输入法),测出来一大堆问题,最后经过千辛万苦,终于做到了能大致兼容。

 2、初步解决

1)、结构布局于第一次解决

 //1部分css
.header {
width: %;
height: 40px;
}
//2部分
.body {
width: %;
overflow: auto;
}
//3部分
.footer {
width: %;
height: 30px;position: fixed; bottom:0;left:0;right:0;
}
 <div class="header" id="header">会话问诊</div>
<div class="body" id="body"></div>
<div class="footer" id="footer">
<input type="text" id="input">
</div>
 $('.body').css('height', $(window).height() - 39);
$('#input').on('focus', function () {
setTimeout(function () {
window.scrollTo(0, 1000000);
}, 200);
});

这种布局方法就让中间".body"中的内容在".body"中滚动,对整个html中的body产生了1px的滚动,此处滚动的目的是为了执行"window.scrollTo(0, 1000000);",经过测试,若body没有产生滚动,则这个方法是不会执行的。

相信很多人都会以 以上的方法解决input在弹出键盘时候的问题,当键盘弹出来后,就让滚动条一直往下面滚直到滚动到最下面,没错,这种措施之后能保证大部分的正常,但是在safari浏览器中就出现了问题,由于safari浏览器下部有一块

图中是safari浏览器自带的一块标签,当使用以上滚动时,你会发现,他虽然是滚动上去了,但是也会出现一块空白,没错,相当于给你的感觉是滚动上去过多,那么此时,也会被测试打回,是不是感觉很伤心无助,(safari浏览器把下面那块当作了body的东西,他自己实现了一块,把我们的html内容装在了他自己实现的容器里面)

2)、进一步解决

经过大量的比较与测试,我发现了一个问题,safari下面的自带输入法根本不用处理,键盘依然可以正常弹出与收起。(ps:safari浏览器没有特别的判断,因此此处判断过于复杂,如有更好的判断,请留言,谢谢!此处之所以判断safari浏览器并不是判断QQ浏览器,是因为测试了opera浏览器的展示等跟QQ浏览器一样,因此此处就判断safari浏览器)

 $('input').on('focus', function () {  var agent = navigator.userAgent.toLowerCase();
setTimeout(function () {
if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1
&& agent.indexOf('coast') == -1 && agent.indexOf('android') == -1
&& agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) {//safari浏览器 } else {//其他浏览器
window.scrollTo(0, 1000000);
}
}, 200);
});

3)、再次优化与解决

经过以上几步骤,原以为完美无缺的解决方案,可以达到很好的兼容了,可是意外又发生了,测试们用了搜狗输入法来做测试,问题又来了,苹果手机自带的输入法的实现是把body挤上去,搜狗则是在得到focus之后,直接弹出的一块遮罩层,这就导致了问题,此时我们的输入框被挡在了输入法之后,因此又增加了下面的判断与处理,

 $('input').on('focus', function () {
setTimeout(function () {
if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1
&& agent.indexOf('coast') == -1 && agent.indexOf('android') == -1
&& agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) {//safari浏览器
if(scope.$txtWrap.offset().top-winobj.scrollTop() > document.body.offsetHeight/2) { //说明软键盘遮盖页面
window.scrollTo(0, winobj.height() - 270);
}
} else {//其他浏览器
window.scrollTo(0, 1000000);
}
}, 200);
});

3、解决

经过几次测试,看似几乎没问题,最后又在iphone5上面的QQ浏览器中用搜狗输入法又测试出了问题,它在第一次点击当input获取到第一次focus事件的时候,window执行了scrollTo方法,第二次,他不再执行,不难发现,系统是以为已经滚动到了下方,因此便不再执行,那么我又增加了一个事件

$('input').on('blur', function () {
window.scrollTo(0, 0);
});

终于大功告成,基本上解决了现在普遍浏览器中大部分搜狗和自带输入法对模拟fix的input定位问题。

总结最后解决js为:

 $('input').on('focus', function () {
var agent = navigator.userAgent.toLowerCase();
setTimeout(function () {
if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1
&& agent.indexOf('coast') == -1 && agent.indexOf('android') == -1
&& agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) {//safari浏览器
if(scope.$txtWrap.offset().top-winobj.scrollTop() > document.body.offsetHeight/2) { //说明软键盘遮盖页面
window.scrollTo(0, winobj.height() - 270);
}
} else {//其他浏览器
window.scrollTo(0, 1000000);
}
}, 200);
}); $('input').on('blur', function () {
var agent = navigator.userAgent.toLowerCase();
setTimeout(function () {
if (!(agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1
&& agent.indexOf('coast') == -1 && agent.indexOf('android') == -1
&& agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1)) {//非safari浏览器
window.scrollTo(0, 0);
}
}, 0);
});

重中之重,一定要让body产生滚动,不然以上方法依然无法解决。

最近同事又测出了我的方案对某些手机的不兼容性,所以他给出了另一个解决方案,经测试已经达到了几乎所有手机的兼容,下面提供给大家:

inputFocus: function (e) {
var winobj = $(window),
scope = this,
agent = navigator.userAgent.toLowerCase();
setTimeout(function () {
if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1
&& agent.indexOf('coast') == -1 && agent.indexOf('android') == -1
&& agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) {//safra浏览器
window.scrollTo(0, 1000000);//先滚动到最底部,再用scrollY得到当前的值,必须延迟 否则拿到的就是1000000
setTimeout(function(){
window.scrollTo(0, window.scrollY - 45);//45像素 所有浏览器都是这么高
}, 50)
} else {//其他浏览器
window.scrollTo(0, 1000000);
// window.scrollTo(0, ++this.scrollNum);
}
}, 200);
},

  

这是我解决这个问题的过程与实践,若大家有更好的思路,或者发现我这个方式依然无法解决某些问题,请在留言区提出,谢谢!

h5实现输入框fixed定位在屏幕最底部兼容性的更多相关文章

  1. H5项目常见问题及注意事项,视频全屏,定位,屏幕旋转和触摸,偏页面重构向 来源joacycode的github

    Meta基础知识: H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 //一.HTML页面结构 <meta name="viewport" content="wi ...

  2. fixed 定位 苹果手机输入框触发时内容全部隐藏

    问题出现在东钿微信公众号用户注册页面 页面中只有两个输入框 页面没有超过一屏,悬浮按钮也要出现在本页面 ,开始布局页面的时候没什么问题,然后我在我自己手机上测试 ,输入手机号码,非常奇怪的问题出现了, ...

  3. 移动端ios 输入框fixed固定在底部 焦点时乱跳加遮盖问题的解决 转自zhangyunling 加个人项目解决方案

    如果您有过移动端的开发经验,那么您是否碰到过这样的问题,一个页面有输入框,当这个输入框聚焦时,输入框在IOS下,被移动到手机屏幕的当中去了,而在Android端,有些浏览器的输入框,会被键盘盖住. 1 ...

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

    之前我们在使用vue进行 h5 表单录入的过程中,遇到了Android软键盘弹出,覆盖 h5页面 输入框 问题,在此进行回顾并分享给大家: 系统:Android 条件:当输入框在可视区底部或者偏下的位 ...

  5. css+js定位到屏幕中间

    ex:让一个div始终显示在屏幕中间 一. css:#idName{position: absolute;z-index: 999;width: ?px;margin-top: ?px;}//此处的初 ...

  6. web移动端input获得光标Fixed定位失效解决方案

    移动端业务开发,iOS 下经常会有 fixed 元素和输入框(input 元素)同时存在的情况. 但是 fixed元素在有软键盘唤起的情况下,会出现许多莫名其妙的问题. 这篇文章里就提供一个简单的有输 ...

  7. 文件正在上传的转圈圈gif图片引出的fixed定位和absolute定位

     文件正在上传的转圈圈gif图片  一.文件上传时,未上传返回成功状态之前给个gif动态图片显示在页面,改善用户体验. <!--S 遮罩层 --> <div id="mas ...

  8. fixed定位兼容性

    不过从ios5.1以来,fixed定位就已经支持了,但很遗憾,ios现在对它还只是半支持. 但是在某些情况下,会出现一些比较奇葩的问题,比如fixed元素中存在输入框子元素,这个时候就会跪了. 可以看 ...

  9. 关于iframe中使用fixed定位的一些问题

    先来看看position: fixed:的定义:生成绝对定位的元素,相对于浏览器窗口进行定位: 但是在iframe中使用fixed定位,实际上是相对于iframe窗口进行定位,原因在于iframe类似 ...

随机推荐

  1. C++编译器详解(一)

    C/C++编译器-cl.exe的命令选项 和在IDE中编译相比,命令行模式编译速度更快,并可以避免被IDE产生的一些附加信息所干扰,本文将介绍微软C/C++编译器命令行模式设定和用法. 1.设置环境变 ...

  2. 25个Linux相关的网站

    下面是25个最具有影响力,也是最重要的Linux网站,这些网站提供了Linux的分发包,软件,文件,新闻,以及其它所有的关于Linux的东西.关于Linux的分发包历史,可以看看本站的这篇文章< ...

  3. hibernate之三种时态之间的转换

    判断状态的标准 oid  和    session相关性 public class HibernateUtils { private static SessionFactory sessionFact ...

  4. [au3]复制选择性粘贴文本到excel

    案例:在一张网页上有许多你要复制的内容,但是你必须一个一个找到他们,然后一个一个复制出来粘贴到excel表格里.时间一长你的眼睛容易花,而且复制多了容易出错. 方法:当然有许多方法可以自动化的做这一件 ...

  5. day02_雷神_字符串、列表、字典

    1.字符串 1.1 字符串相加 s1 = " ale x " s2 = " sb " print(s1 + s2) #识别空格 print(s1.strip() ...

  6. vnc搭建

    PS:偶以前基本不用Linux的远程图形桌面,前几天有开发的同事配置CentOS的vnc有问题,找我解决,就顺便记录总结一下,这个总结是比较完整的.下面的配置在CentOS5.x和6.x.SUSE企业 ...

  7. java基础梳理

  8. 在线团队协作工具+在线UML工具

    话不多说直接上https://worktile.com去看,顺便附上小众软件上面的介绍 默默增加worktile的外国原版https://trello.com/,worktile照着trello做的, ...

  9. Django:全文检索功能可参考博客

    https://blog.csdn.net/AC_hell/article/details/52875927 https://www.zmrenwu.com/courses/django-blog-t ...

  10. Asp.Net Mvc异步上传文件的方式

    今天试了下mvc自带的ajax,发现上传文件时后端action接收不到文件, Request.Files和HttpPostedFileBase都接收不到.....后来搜索了下才知道mvc自带的Ajax ...