一、rem方案
方式一:
跟pc端网页平滑自适应一样,通过js控制html字体大小,实现移动端的页面自适应布局。 使用这种布局方式
需要在头部设置:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, minimum-scale=1">
也就意味着使用”理想视口 ” 进行布局;
方式二:
media+rem 如果通过媒体查询做移动端开发,需要把主流的屏幕大小适配出来,例:
@media screen and (min-width:350px){
html{font-size:342%;}
}
@media screen and (min-width:360px){
html{font-size:351.56%;}
}
字体的百分比计算逻辑:
依据设计稿的尺寸进行推导!
例如:
设计稿 宽:750px, 设计稿字体尺寸:16px 假定1rem = 100px,字体尺寸: 1 / 16 * 100 = 625%; (1px对应的rem大小,最后*100) 当屏幕尺寸为640px时, 字体大小是:625% * (640 / 750)= 533.3333%; 当屏幕尺寸为375px时, 字体大小是:625% * (375 / 750)= 312.5%;
二、flexible.js 方案 (手淘方案)
flexible.js方案是手淘(手机淘宝)开源的一个做移动端适配的方案,此方案的主体思路跟rem方案类似,但是也有区别; 类似:都是通过设置font-size来进行适配 区别:rem方案是通过”理想视口 ”(不考虑dpr)的方式进行适配,而flexible方案是考虑dpr,然后配合页面缩放(initial-scale)完成适配;
flexible.js 详解
flexible方案是以iPhone6 为基稿进行的设计,大家可以理解成flexble默认以750宽(因为iphon6的物理分辨率是750*1334)的设计稿为基础进行的设计。 他的设计思想是把设计稿分成十份,1rem = 1份;所以默认html的font-size =75px; 所以如果你在使用flexible设计移动端适配时,如果你的设计稿是750,那么px与rem的转换比例就是75,如果你的设计稿是640,那么px与rem的转换比例是64。 Flexible适配考虑了iphone dpr为1,2,3的情况,对于安卓来说,他统一的设置dpr为1,所以对于安卓的高清适配flexible不是很完美。
三、vm/vh 移动端适配
1vw = 屏幕宽度的1%; 1vh = 屏幕高度的1%;
使用vm/vh做移动端适配,可以说是最完美的方案,唯一不足就是部分手机厂商的支持度不是很好。
手淘的flexible方案就是模拟的vw/vh特性(flexible是把页面分成10份)。
使用vm/vh做移动端适配,不需要考虑js换算等操作,是纯css方案。唯一注意的是把设计稿的px单位转换成vw/vh单位即可。
转换px为vw/vh方案有很多,这里使用vscode的px2vw插件: px2vw
四、移动端网页布局方案会碰到的问题
1.经典1px问题
问题出现的原因:1px问题是在移动设置1px的边框时,在不同的设备上会出现比1px粗的情况。原因是在dpr为2或者更高的屏幕上,1px其实占据的真实物理像素为2px或更多,设计师的本意肯定是1px就是1px,所以就会出现1px的问题。
各种适配方案的特点:
(1) rem适配方案, 可以采用rem单位去制作1px的边框,虽然可以一定程序上避免1px的问题,但是会出现不精准的情况,这就需要跟设计师沟通看这个问题是否可以接受。如果直接使用1px单位,那么就需要处理1px问题。
(2)flexible.js适配方案,使用flexible适配方案可以避免iphone端1px的问题,因为flexible方案考虑了iphone端的dpr问题,但是安卓端是没有考虑dpr的,所以安卓端1px问题根据需求需要处理;
(3)vm/vh方案,和(1)一样的情况;
解决1px问题的方法有很多,各有各的特色,这里推荐一种方法:transform+伪元素 transform+伪元素解决1px问题
2.图片模糊问题
问题出现的原因:我们平时看使用的图片大多数都属于位图(png、jpg…),位图的由一个个像素点构成,每个像素都具有特点的位置和颜色:
理论上,位图的每个像素对应在屏幕上使用一个物理像素渲染,才能达到最佳的显示效果。
而在dpr>1的屏幕上,位图的一个像素可能由多个物理像素渲染,然而这些物理像素点并不能被准确的分配上对应位图像素的颜色,所以相同的图片在dpr>1的屏幕上就会模糊。
3.解决方案
为了保证图片质量 我们应该尽可能让一个屏幕像素来渲染一个图片像素,所以 针对不同DPR的屏幕,我们需要展示不同的分辨率图片。
如:在dpr=2的屏幕上展示两倍图(@2x),在dpr=3的屏幕上展示三倍图(@3x)。