15 移动端布局及解决方案
移动端项目
移动端浏览器及内核分析
- 手机浏览器种类:
UC浏览器,QQ浏览器,欧朋浏览器,百度手机浏览器,360安全浏览器,谷歌浏览器, 搜狗手机浏览器,猎豹浏览器,其他杂牌浏览器。
国内的UC和QQ,百度等手机浏览器都是根据Webkit修改过来的内核,国内尚无自助 研发的内核,就像国内的手机操作系统都是基于Android修改的。
viewport
- width:设置viewport的宽度(即之前所提及到的,浏览器的宽度),这里可以为 一个整数,又或者是字符串〃device-width〃。
- initial-scale:页面初始的缩放值,为数字,可以是小数。
- minimum-scale:允许用户的最小缩放值,为数字,可以是小数。
- maximum-scale:允许用户的最大缩放值,为数字,可以是小数。
- height:设置viewport的高度(我们一般不用)。
- user-scalable:是否允许用户进行缩放,’ no’ 为不允许,’ yes’为允许我们把 这个标签设在head里面。
移动端布局解决方案
- 固定布局
- 在<head>里把viewport加好,跟pc端一样,设想整个网页的宽度为750px居中即可, 超出部分留白。
优点:思路沿用PC端,上手简单。
缺点:大屏幕手机及手机横屏时,两边是留白较大,且大屏幕手机下看起来页面会特 别小,操作的按钮也很小,用户体验较差。
- 流式布局
- 流动布局重点就是使用百分比来代替传统px,但是高度大都是用px来固定住,所以 在大屏幕的手机下显示效果会变成有些页面元素宽度被拉的很长,但是高度还是和原来一 样,优点是流动布局可以很好解决自适应需求,缺点是通过大量的百分比布局,会出现兼 容性的问题,且更适用于对横向拉伸的设计元素,设计的时候存在很多局限性。
- 响应式做法
- 根据目标用户的访问设备的主要类型做三种或四种布局。
每种布局有一个区间即可利用媒体查询@media,可以为不同分辨率的设备加载不同的 样式。这种方法的优点是可以相对精确的控制显示效果,但可能需要对同一个类书写不同 的样式会导致代码比较繁复,后期维护困难
- rem 布局
- rem是指相对于根元素的字体大小的单位,即根据html元素的font-size来计算大小。 比如说 html 的 font-size 大小为 100px, 一个 div 的 width 为 1rem,则 div 的 width大小为100px
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=0">
<script>
function auto() {
//获取html宽度(设备宽度)
var deviceWidth = document.documentElement.clientWidth;
// 720可以根据实际设计宽度进行修改
if (deviceWidth > 720) {
deviceWidth = 720;
}
var fs = (deviceWidth * 100) / 720;
document.documentElement.style.fontSize = fs + "px";
}
window.onresize = function () {
auto();
}
</script>
- vw + vh
- vw 即 Viewport’s width 的简写,是 CSS3 规范中的视口单位,相对于视口的宽度,视口被均分为 100 单
位的 vw, 相对于视口的高度,视口被均分为 100 单 位的 vh。 - 750px设计稿 750px=100vw 1px = 0.1333333vw;
如果使用rem 预设1rem = 100px 100px就是 13.333333vw 由此vm和rem 就可以进行换算了
- Media
@media (max-width: 768px) {
.banner {
margin-top: 44px;
background-color: blue;
height: 2.88rem;
width: 100%;
}
}
orientation: portrait;/*锁定为纵向*/
orientation: landscape;/* 锁定为横向*/
@media screen and (orientation: landscape) {
div {
width: 300px;
height: 300px;
background-color: red;
}
}
@media screen and (orientation: portrait) {
div {
width: 300px;
height: 300px;
background-color: blue;
}
}
- 兼容问题
- 小字体处理
- 不同浏览器的最小字体不同,有的是10px,有的是12px。
解决办法:设置字体时,不要小于12px,如果一定要小于12px,使用
transform:scale()进行缩放。
- 移动端重置样式
- 1、禁止用户选中文字,安卓无效(在事件那章解决,包括长按的时候会出菜单,用阻止 touchstart 后的默认
行为搞定)。
-webkit-user-select: none;
2、禁止长按弹出系统菜单
-webkit-touch-callout: none;
3、去除 android 下 a/button/input 标签被点击时产生的边框 & 去除 ios 下 a 标签被点击时产生的半透明灰
色背景。
-webkit-tap-highlight-color: rgba(0,0,0,0);
4、切换横竖屏或者用户自己通过浏览器设置的话,可以改变字体的大小 ( 需要给 body 下的所有元素 )。
-webkit-text-size-adjust: 100%;
5、按钮在 ios 下都是圆角。
-webkit-appearance: none; //button 与 input 都会有个默认背景
border-radius: 0; //input 有个默认圆角