xuweinet 2019-06-21
在移动端的web开发中,大家会发现,当给一个元素设置
overflow:sroll;
属性时,在ios端滑动页面,页面滚动的反应很慢,有种卡顿的感觉,但是在安卓端滚动很快,于是这时就有人想到用iscroll.js插件,让页面中有overflow:scroll;属性的元素在ios端和安卓端滚动的都很流畅,是的,这可以解决问题,元素滚动也很流畅,但是,iscroll.js的也经常伴随着很多问题。例如,他会屏蔽页面上的很多点击事件和input框输入问题等等。当然这些都可以解决,但是弊端很多。于是乎,就有了-webkit-overflow-scrolling:touch;
属性,来解决ios端带有overflow:sroll;属性的元素,让其滚动很流畅。记住,-webkit-overflow-scrolling: touch;属性要写在有overflow:sroll;属性的元素的样式里。
有时页面里的一个div给他写了固定的高度,也写了overflow:scroll;属性,并且这个div里有很多input输入框,当我点击某一个input时,软键盘弹出,input输入框在安卓端不会自动顶上去,这时测试就会给你提bug了,这就很麻烦了。于是乎,我就写了一个自己的方法,让安卓端的input框自动顶上去,因为在安卓有这个情况,所以做了终端判断,以下代码仅供参考:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no"/> <title>Document</title> <script> /*动态计算html的font-size*/ //自己的写法 window.onload = function(){ getRem(720,100) }; window.onresize = function(){ getRem(720,100) }; function getRem(pwidth,prem){ var html = document.getElementsByTagName("html")[0]; var oWidth = document.body.clientWidth || document.documentElement.clientWidth; html.style.fontSize = oWidth/pwidth*prem + "px"; } </script> <link rel="stylesheet" type="text/css" href="../css/reset-min.css"> <style> html,body{height:100%;} .absolutewrapper{position:relative;width:100%;height:100%;} .absolutewrapperslide{position:absolute;left:0;top:0;bottom:1rem;width:100%;overflow:scroll;-webkit-overflow-scrolling : touch;z-index:10000;margin:0 auto;} .absolutewrapperslide div{padding:0.1rem;font-size:0.32rem;border-top:0.03rem solid #efefef;} .absolutewrapperslide div input{padding:0.1rem;border:0.02rem solid #ddd;} .footer{display:block;position:absolute;bottom:0;left:0;z-index: 10001;font-size:0.32rem;background-color:#e02222;color:#fff;width:100%;height:1rem;text-align:center;line-height:1rem; } .text{padding:16px;text-align: center;background:#efefef;} </style> </head> <body> <div class="absolutewrapper"> <div class="absolutewrapperslide"> <div class="text"> 您即将审核通过订单,请您填写结算信息 </div> <div>输入姓名:<input type="text"/></div> <div>输入年龄:<input type="text"/></div> <div>输入性别:<input type="text"/></div> <div>输入民族:<input type="text"/></div> <div>输入籍贯:<input type="text"/></div> <div>输入现住地址:<input type="text"/></div> <div>输入手机:<input type="text"/></div> <div>输入姓名:<input type="text"/></div> <div>输入年龄:<input type="text"/></div> <div>输入性别:<input type="text"/></div> <div>输入民族:<input type="text"/></div> <div>输入籍贯:<input type="text"/></div> <div>输入现住地址:<input type="text"/></div> <div>输入手机:<input type="text"/></div> </div> <a href='javascript:void(0)' class="footer">确定</a> </div> </body> <script src="../js/jquery-3.0.1.min.js" type="text/javascript"></script> <script> $(function(){ //判断访问终端 var browser={ versions:function(){ var u = navigator.userAgent, app = navigator.appVersion; return { trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,//火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, //android终端 iPhone: u.indexOf('iPhone') > -1 , //是否为iPhone或者QQHD浏览器 iPad: u.indexOf('iPad') > -1, //是否iPad webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部 weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增) qq: u.match(/\sQQ/i) == " qq" //是否QQ }; }(), language:(navigator.browserLanguage || navigator.language).toLowerCase() }; function pso(_this){ var _top = parseInt($(_this).offset().top);//这个_top指当前目标元素相对于当前视口(window)的顶部距离 var scrol = $(".absolutewrapperslide").scrollTop(); $(".absolutewrapperslide").scrollTop(scrol+_top-100);//这个100是自己定的,最后的作用是当软键盘弹出后让该目标input距离视口顶部多少距离,从而让input自动顶上去。可以根据自己的视觉感受,自定义这个值,只要input框在几乎所有的手机中都不能被软键盘遮住就可以了。 } if(browser.versions.android){//如果是安卓手机则执行这个功能 $("input").on("focusin",function(event){ var _this = this; $(window).resize(function(){//当点击input框之后,视口高度发生变化,则软键盘弹出了,这时,调用pso()函数,让input顶上去。 pso(_this); }) }) } }) </script> </html>
截图: