说在开头
工作接触移动端也有几个月了。本人也比较懒,这里正好做个总结。方便平时坐地铁途中回顾0.0
##移动端的一些适配
之前做移动端面对的适配问题很棘手。不过现在主流也就是这几种情况
- 640px设计稿切320px
这一种一般很简单直接让UI妹子给你640的设计稿,然后如果一个元素width
为30,则写的时候改为15px 即可。。
- 等比缩放
1
2
3
4
5
6
7
8
9
10
11
12<script>(function () {
var w = window.screen.width, s = w / 750, u = navigator.userAgent, m = '<meta name="viewport" content="width=750,';
if (/android (\d+\.\d+)/i.test(u)) {
if (parseFloat(RegExp.$1 > 2.3)) {
m += "minimum-scale = " + s + ", maximum-scale = " + s + ","
}
} else {
m += "user-scalable=no,"
}
m += 'target-densitydpi=device-dpi">';
document.write(m)
}());</script>
这里我设置的是750的设计稿,这种适配的方式就是有点好处,可以直接写原始的px
,比较方便,而且手机上面体验效果也不错。不过有的安卓机器(极少数)会有Bug。。比如我那个产品大佬的安卓手机…. 解决办法不明。。。。。
- 使用动态rem,动态改变font-size
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18(function init(){
var width=document.documentElement.clientWidth;
var head=document.getElementsByTagName("head")[0];
var style=document.createElement("style");
if(width>640){
style.innerHTML="html,body{font-size:"+64+"px;"+"width:"+640+"px;"+"margin:0 auto;}"+
".footer-main{width:640px;margin:0 auto}";
}else{
style.innerHTML="html,body{font-size:"+width/10+"px;}";
}
head.appendChild(style);
for(var i=0;i<document.getElementsByTagName("style").length-1;i++){
document.getElementsByTagName("style")[i].remove();
}
})()
window.addEventListener("resize",function(){
init();
})
1 | 这样只用知道 设计稿的原本大小,和元素的原本大小(px) |
怎么说呢?比如我一个设计稿是750,一个元素width
为100px;height
为100px。
转换之后
width= 100px10/750=1.34rem;
height=100px10/750=1.34rem;
当然 如果是使用sass
这样 用一个自定义方程计算,更好。
移动端的一些常用 meta
这一点没啥好说的。。。可能别处别我这边更为详细一点..不过我平时也就是使用这一些1
2
3
4
5<meta charset="UTF-8">
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<meta content="telephone=no" name="format-detection">
移动端的tap
点击穿透
触发过程
:当网速良好的情况下,点击右上角抽奖.瞬间弹出模块框,然后回到首页按钮响应。页面发生跳转。回到首页
解决办法
:
针对zepto.js的
tap
办法,将tap
事件触发改为,touchend
,然后禁止其默认事件1
2
3btn.on("touchend",function(e){
e.preventDefault();
})设置一个
setTimeout
延迟300ms之后响应1
2
3
4
5btn.on("tap",function(){
setTimeout(function(){
todo....
},400)
})
利用padding-top
高度自适应占位
原理
:
不管是margin
还是padding
如果百分比都是取的相对于父级的宽度。
例如1
2
3<div class="ct">
<div class="content"></div>
</div>
然后设置1
2
3
4
5
6
7
8
9
10
11body{
width:600px;
}
.ct{
width:50%;
background:red;
}
.content{
//这里相对于父级宽度,
padding-top:100%;
}
如果是如要上面装有图片。一个很好的一点就是.用浮动,利用伪类元素padding-top:100%
撑开容器。然后设置imgposition:absolute
ios input框激活后不支持position:fixed
bug
就好比这个情况
触发过程
当用户使用ios
系统点击激活input框时,此时浏览器会不在支持fixed
解决办法
两种方案:
- 使用js控制,当input框激活时,改变将position状态由
fixed
改为relative
,然后当input框失去焦点时,将position状态由relative
恢复成fixed
。
不过这种办法感觉挺麻烦的。。。一般能用css解决的就经量用css解决。
- 模拟
position:fixed
好比这样1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27header{
height:200px;
width:100%;
position: absolute;
left:0;
top:0;
}
section{
position: absolute;
width:100%;
left:0;
top:200px;
bottom:200px;
-webkit-overflow-scrolling: touch;
}
footer{
position: absolute;
height:200px;
width:100%;
left:0;
bottom:200px;
}
<header>我是头部</header>
<section>我是内容</section>
<footer>我是页脚</footer>
目前 一直使用的还是第二种css的方法。让section
内部滑动
移动端常见取消默认重置
1 | /*去除点击高亮效果*/ |
文本溢出隐藏
1 | //单行文本溢出 |
暂时就想到这些啦,后面的在总结