时间过的飞快,转眼间作移动端已经将近两个月时间了,在这两个月中作了不少个页面,有js,jq,还有页面适配等相关内容,虽然一切看上去都很正常,但是总感受适配性不是特别好,这就致使在后续要作不少补救工做,甚至有的时候要靠牺牲页面性能(直接用图片)或细微调整设计稿来实现,长路漫漫啊~接下来就将工做中遇到的一些问题总结下来,以及对相似腾讯,京东,淘宝的页面进行简要分析。javascript
1.自适应css
在手机端页头咱们通常要加两行代码:java
<meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>ios
<meta content="telephone=no,email=no" name="format-detection">(禁止浏览器将数字识别为电话号码;) web
这是网上主流的作法,设定viewport视口宽度等于设备的宽度,而且初始缩放比例为1.0,同时禁止用户缩放页面。好比通常手机的device-width都为320,即视口宽度为320,假如页面中某元素的尺寸直接用像素设定,而且超过320,那么将不可以在窗口中彻底显示,所以这时候咱们将宽度,高度改成百分比,字体也用相对单位em或rem,这样也能更好的适应屏幕,但是问题来了,若是为图片,这问题很简单,咱们能够简单粗暴的设定图片的最大宽度或最小宽度,这样能保证图片再整个屏幕中的显示效果一致。但是若是不是图片的话,假如咱们给外层div宽度设为90%,div里有一行大字,大概占div宽度的95%,字体大小用em(假设浏览器默认字体大小为1em=16px),不一样设备宽度的95%是不一样的,这就意味着有的屏幕下字体会换行。。。固然,若是div宽度不是很大的话,咱们也能够将宽度设为XXem,不过貌似这样还要不停的计算。固然我作移动端时间不长,若是理解有误,请及时告诉我,以避免我误入歧途。。。浏览器
<meta id="screeMeta" name="viewport" content="width=640, initial-scale=1,minimum-scale=0.5, maximum-scale=0.5">iphone
这是咱们如今的作法,经过js来控制缩放。布局
<script type="text/javascript"> var sW=$(window).width(); //alert(sW); if(sW>=640&&sW<720){ $("#screeMeta").attr("content","width=640, initial-scale=1,minimum-scale=0.5, maximum-scale=0.5"); }else if(sW>=720&&sW<750){ $("#screeMeta").attr("content","width=640, initial-scale=1,minimum-scale=0.5, maximum-scale=0.56"); }else if((sW>=750&&sW<800)){ $("#screeMeta").attr("content","width=640, initial-scale=1,minimum-scale=0.5, maximum-scale=0.58"); }else if(sW>=800&&sW<1000){ $("#screeMeta").attr("content","width=640, initial-scale=1,minimum-scale=0.5, maximum-scale=0.65"); } </script>
在制做的时候宽度,字号等均可以按照设计来直接进行设置,不过会有不少屏幕像素是大于640的,这就会在页面中出现各类各样的小缝隙,而后咱们在逐个解决。。性能
下面看看腾讯,京东,淘宝都是怎么作的~字体
这是京东的页面设置,viewport设为设备尺寸,在页面中整个页面(除导航外),设定了一个外围容器viewport;css是这样设置的:
min-width:300px;max-width:640px;margin:0px auto;padding:0 5px;页面中高度,宽度百分比和实际像素都有,字号用的是px;
淘宝页头设置为<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">
页面不少元素的宽度,高度设置用了rem单位设置。
淘宝页头设置为<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
页面不少元素的宽度,高度设置用百分比,字体用em,天猫与腾讯相似,不过字号为px。
看来巧妙的布局能解决不少适应问题
2.关于overflow兼容性问题
以前要作一个页面,咱们从新设计了滚动条的样式,与传统滚动条形式彻底不一样,因为时间关系,直接找了一个插件,在前面的博文中有过介绍,经过简单的设置后,在iphone中表现完美,
但是放到Android中,问题就来了,样式没有出来,并且滑动时会出现bug,(div设置overflow:auto)。查了不少资料也没找到解决办法,最后只能是在页面加载最开始后判断为ios或andriod,
而后只有ios执行新滚动条样式,andriod用默认样式~(判断ios或andriod,经过js的navigator来进行判断)
3.关于动态生成元素的绑定事件
咱们知道,对于动态生成的元素通常用on方法绑定事件,好比click,咱们这样写document.on("click","#xx",function(){}),bug来了,再iphone6上点击无效,百思不得其解,最后的解决办法居然是。。。
给当前元素添加css属性-cursor:pointer,缘由不详,不过确实是能够解决的~
4.iphone6弹出虚拟键盘
需求是这样的,点击输入框,弹出虚拟键盘,而后输入完成后弹窗(这时候其实虚拟键盘应该是滑出的过程),弹窗在整个页面中居中,具体经过js计算,这时候发现iphone6仅仅是iphone6的弹窗外置会跑出窗口外~猜测多是高度计算问题,因而alert了计算所需的高度,发现当alert后肯定,弹窗位置正确,那就应该是事件执行时间问题了,我将弹窗弹出延迟100ms,即setTimeout(function(){},100),问题解决。
5.关于元素均匀分布,能够借助box,flex属性来解决。
好了,先写到这里,有想到的问题会陆续补充~