前端 - 移动端适配

参考博客:移动前端自适应适配布局解决方案

1.flex

使用flex弹性布局,元素宽度自适应,高度固定为某个px值。

2.固定viewport + rem

这种适配方式是以html的font-size值为基础,所有元素的像素大小都使用rem表示(除了font-size以外)。

固定视口,缩放值为1.0

<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scaleable=no">

计算基础font-size值

font-size值的计算与设计稿宽度、设备横向逻辑像素有关

font-size = 设备横向逻辑像素 / (设计稿宽度 / 100)

分析:通常公司UI设计师会以iphone某个型号的尺寸进行页面设计,如果以iphone6的尺寸进行设计,那前端拿到的设计稿的宽度就是750px;如果以iphone5的尺寸进行设计,那设计稿的宽度就是640px

假设现在设计稿以iphone6尺寸设计(750px),设计稿上的banner宽度为600px,这时候不同尺寸的手机屏幕上如何准确的表示这个banner的宽度?手机的屏幕尺寸可能有很多种,如iphone6横向逻辑像素为375px,iphone5横向逻辑像素为320px

banner在iphone6上的宽度计算

600 / 750 = x / 375

换算

x = (375 * 600) / 750

等价于

x = (375 / 750) * 600 

375 / 750就是我们要计算的html font-size 基础值(1rem),为了方便样式代码的编写,可以将750除以100,在编写样式时同样除以100(如设计图600px,代码中只需要写成6rem)

注意:基础值并不都是375 / 750,375是设备横向逻辑像素,可以通过js获取。

document.documentElement.style.fontSize = document.documentElement.clientWidth / 7.5 + 'px';
window.onresize = function () {
  document.documentElement.style.fontSize = document.documentElement.clientWidth / 3.75 + 'px';
}

banner的样式.

.banner {
  width: 6rem;
}

3.动态viewport + rem(淘宝方案)

动态viewport指的是,viewport的缩放数值是通过js计算之后添加的。

哎不是很好理解觉得好麻烦,不如方法2,直接走流程

1.设置viewport

设备横向逻辑像素 = 设备横向物理像素 / (dpr * scale)

当scale等于1 / dpr时(scale等于0.5),iphone6的横向逻辑像素等于750px

var scale = 1 / window.devicePixelRatio
document.querySelector('meta[name="viewport"]').setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');

2.设置font-size

document.documentElement.style.fontSize = document.documentElement.clientWidth / 10 + 'px';

3.将设计稿上的标注转化为设备上的尺寸

​设备元素尺寸 = 设计稿元素尺寸 / (设计稿横向逻辑像素 / 10)

以iPhone6为例,动态设置viewport,设备横向逻辑像素为750px,字体设置为75px。当设计稿为640px,设计稿中的banner宽度为200px,此时展示在手机设备上的宽度如下所示

200 / 640 = x / 750

换算

x = (200 * 750) / 640

等价于

x = (200 / 640) * 750 = (200 / 64) * 75

75为手机设置的html根元素font-size,banner = (200 / 64)rem

3.vw vh

vw:1vw等于视口宽度(逻辑像素)的1%

vh:1vh等于视口高度(逻辑像素)的1%

vw vh与百分比的区别

vw vh相对于视口的高度和宽度;百分比相对于包含它的最近的父元素的高度和宽度(width: 50%;)

例如iphone6,视口逻辑像素为 375px x 667px

1vw = 375px/100 =37.5px

1 vh = 667px/100 = 66.7px,。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值