h5实现输入框fixed定位在屏幕最底部兼容性
来源:互联网 发布:深圳知豆电动汽车租赁 编辑:程序博客网 时间:2024/06/07 03:04
1、问题由来
做h5 已经有很长一段时间了,现在做的工作h5比pc上的更多,曾经解决pc端IE各个版本的兼容性也是伤透脑筋,原以为h5的会更好,殊不知,还有更头疼的问题,当设计师要设计一个聊天窗口,把输入框定位在最底部,这是再常见不过的问题了吧,举例:
上图就是我最近做的一个功能,原以为是很简单的一个定位功能,但是没想到牛逼的测试居然用各种iphone,各种安卓,各种浏览器(qq浏览器、safari、opera等浏览器),各种输入法(系统自带、搜狗输入法),测出来一大堆问题,最后经过千辛万苦,终于做到了能大致兼容。
2、初步解决
1)、结构布局于第一次解决
1 //1部分css 2 .header { 3 width: 100%; 4 height: 40px; 5 } 6 //2部分 7 .body { 8 width: 100%; 9 overflow: auto;10 }11 //3部分12 .footer {13 width: 100%;14 height: 30px;position: fixed; bottom:0;left:0;right:0;15 }
1 <div class="header" id="header">会话问诊</div>2 <div class="body" id="body"></div>3 <div class="footer" id="footer">4 <input type="text" id="input">5 </div>
1 $('.body').css('height', $(window).height() - 39); 2 $('#input').on('focus', function () {3 setTimeout(function () {4 window.scrollTo(0, 1000000);5 }, 200);6 });
这种布局方法就让中间".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浏览器)
1 $('input').on('focus', function () { var agent = navigator.userAgent.toLowerCase(); 2 setTimeout(function () { 3 if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1 4 && agent.indexOf('coast') == -1 && agent.indexOf('android') == -1 5 && agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) {//safari浏览器 6 } else {//其他浏览器 7 window.scrollTo(0, 1000000); 8 }9 }, 200);10 });
3)、再次优化与解决
经过以上几步骤,原以为完美无缺的解决方案,可以达到很好的兼容了,可是意外又发生了,测试们用了搜狗输入法来做测试,问题又来了,苹果手机自带的输入法的实现是把body挤上去,搜狗则是在得到focus之后,直接弹出的一块遮罩层,这就导致了问题,此时我们的输入框被挡在了输入法之后,因此又增加了下面的判断与处理,
1 $('input').on('focus', function () { 2 setTimeout(function () { 3 if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1 4 && agent.indexOf('coast') == -1 && agent.indexOf('android') == -1 5 && agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) {//safari浏览器 6 if(scope.$txtWrap.offset().top-winobj.scrollTop() > document.body.offsetHeight/2) { //说明软键盘遮盖页面 7 window.scrollTo(0, winobj.height() - 270); 8 } 9 } else {//其他浏览器10 window.scrollTo(0, 1000000);11 }12 }, 200);13 });
3、解决
经过几次测试,看似几乎没问题,最后又在iphone5上面的QQ浏览器中用搜狗输入法又测试出了问题,它在第一次点击当input获取到第一次focus事件的时候,window执行了scrollTo方法,第二次,他不再执行,不难发现,系统是以为已经滚动到了下方,因此便不再执行,那么我又增加了一个事件
$('input').on('blur', function () { window.scrollTo(0, 0);});
终于大功告成,基本上解决了现在普遍浏览器中大部分搜狗和自带输入法对模拟fix的input定位问题。
总结最后解决js为:
1 $('input').on('focus', function () { 2 var agent = navigator.userAgent.toLowerCase(); 3 setTimeout(function () { 4 if (agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -1 5 && agent.indexOf('coast') == -1 && agent.indexOf('android') == -1 6 && agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1) {//safari浏览器 7 if(scope.$txtWrap.offset().top-winobj.scrollTop() > document.body.offsetHeight/2) { //说明软键盘遮盖页面 8 window.scrollTo(0, winobj.height() - 270); 9 }10 } else {//其他浏览器11 window.scrollTo(0, 1000000);12 }13 }, 200);14 });15 16 $('input').on('blur', function () {17 var agent = navigator.userAgent.toLowerCase();18 setTimeout(function () {19 if (!(agent.indexOf('safari') != -1 && agent.indexOf('mqqbrowser') == -120 && agent.indexOf('coast') == -1 && agent.indexOf('android') == -121 && agent.indexOf('linux') == -1 && agent.indexOf('firefox') == -1)) {//非safari浏览器22 window.scrollTo(0, 0);23 }24 }, 0);25 });
重中之重,一定要让body产生滚动,不然以上方法依然无法解决。
这是我解决这个问题的过程与实践,若大家有更好的思路,或者发现我这个方式依然无法解决某些问题,请在留言区提出,谢谢!
- h5实现输入框fixed定位在屏幕最底部兼容性
- 绝对定位和overflow-y: scroll实现不使用fixed固定定位将元素固定在页面顶部或底部
- 移动端fixed定位在底部的按钮
- fixed 定位在 IE6 下的实现
- 在IE6下实现fixed定位效果
- 移动端fixed定位按钮在底部,键盘弹起,底部按钮顶上去另类解决办法
- 定位到最底部
- javascript 实现页面在屏幕底部
- textarea:文本输入区内实现换行、出现横向(水平)滚动条、自动定位到最底部
- fixed 定位在 IE6 下的实现技巧一则
- Flexbox如何将页面底部固定在屏幕最下方
- 解决html页面中含有input输入框fixed布局底部按钮在Android和ios中被弹起的问题
- "把一个div标签,给它的属性设置position: fixed;bottom:0;固定在浏览器的最底部。 这个div标签在浏览器上下滚动的时候,会一直保持在屏幕最底部,这一点没有问题。但问题是当浏览
- ios系统针对底部input设置fixed的输入框不兼容问题
- 实现底部的弹出框(官方API实现Android的在屏幕中间)
- 定位底部的输入框被软键盘覆盖解决方案
- CSS实现定位DIV固定在网页底部
- 自定义Dialog实现全屏和位置在屏幕底部
- nginx-反向代理原理
- # C++网络请求(get,post,上传图片)与QML混合编程
- 记录1
- 代码中快捷安装、删除apk的两种方式
- 从zbar中提取的bresenham算法
- h5实现输入框fixed定位在屏幕最底部兼容性
- ajax session失效后,跳转到登录页面的全局处理
- iOS小问题(三)
- BootStrap table分页
- Android中attrs.xml文件的使用详解
- DVWA-1.9系列操作之FileInclusion
- R
- jquery事件与绑定事件
- numpy学习日记(二)