这一点不能算是建议,应该说是解决方案。css
最近查了好多关于移动端适配的资料,把人都看懵了,收获了如下名词git
CSS像素、物理像素、逻辑像素、设备像素比、PPI、DPI、DPR、DIP、Viewport
说实话,我一点都不想了解这些名词到底有着什么样的解释,只想知道怎么让开发的页面能适配不一样的移动端设备。简单点说,我想知道怎么获取设备的真实开发尺寸(根据这几天查资料所得,这个概念叫逻辑像素)。github
例如 iphone 6,它的分辨率是 750 x 1334,真实开发尺寸是 375 x 667(逻辑像素),打开 chrome 控制台,切换 device toolbar, 选择 iphone 6 设备就能看到。chrome
苹果设备大多都能查到它的开发尺寸是多少。但安卓设备不是,没有这种条件,因此要靠其余手段了。小程序
根据查资料所得,目前有两种方法能够得到移动设备的真实开发尺寸。浏览器
真实开发尺寸 = 分辨率 / 设备像素比
经过 window.devicePixelRatio
能够获取设备像素比,例如 iphone 6 的设备像素比是 2,即 分辨率 / 2 = 真实开发尺寸,750 x 1334 / 2 = 375 x 667
。移动设备的分辨率随处可查,看发行参数就知道了,而后再经过浏览器获取设备像素比,从而得知设备真实开发尺寸。app
这种方法不须要知道设备分辨率,也不须要知道设备像素比,简单粗暴。iphone
在页面创建一个恰好铺满全屏的 div 元素,而后获取它的宽高,这个宽高就是该设备的真实开发尺寸。布局
.test-div { position: fixed; left: 0; top: 0; width: 100vw; height: 100vh; background: red; }
document.querySelector('test-div').clientWidth // 宽 document.querySelector('test-div').clientHeight // 高
恰好我手上有一个华为 m5 平板和华为 m5 pro 平板,大小分别为 10.1 寸和 10.8 寸,分辨率为 1920 x 1200,2560 x 1600。获取到它们的真实开发尺寸分别为 960 x 600
1024 x 640
,根据分辨率和真实开发尺寸还能得知两个设备的设备像素比分别为 2 和 2.5。
如图所示(华为 m5)字体
为了证实推断是正确的,我拿了一个专门在 m5 pro 上使用的 app 放在 chrome 上运行(模拟该设备的开发尺寸),完美适配。
另外提一下,为手机开发的网站放在其余手机上通常都能适配,可是放在平板上很难适配,毕竟屏幕大小差太多了,反之亦然。没有网站能完美适配全部的端,固然,简单的页面仍是能够的,不过得写一堆 @media screen
。
在 css 中有不少相对长度,其中经常使用的有 em rem vw vh,在小程序上有 rpx。
在此,我建议你使用 vw 和 vh 做为移动端开发的相对单位,包括字体大小、元素宽高、距离等等。
理由以下:
1vw = 屏幕 1% 的宽度 1vh = 屏幕 1% 的高度
不管是在网页仍是在小程序,只要支持 css 就能完美兼容。
PS:在页面上有 input 输入框的时候,不要使用 vh 做为计量单位,由于软键盘弹出时会压缩页面高度,若是用 vh 做为计量单位,会致使页面严重变形,此时用 vw 就没有这个风险了。
像边框或者分隔线等“固定”高度的,能够使用 px。
若是开发的 app 只是应用在手机上,适配通常不会有什么问题,由于屏幕大小不会相差不少。可是放到平板上就会有问题,若是计量单位使用的是相对长度,各个元素相对于手机都会变大,致使不美观。
在这种状况下,咱们能够使用栅格化布局。例如在手机上采起两列布局,在平板上采起三列布局。另外还要用 @media
根据分辨率来调整元素的大小、字体的大小等等。
PS:若是一个 app 要应用在手机和平板上,相对计量单位建议使用 rem,这样在手机和平板上能够设置两个不一样的根元素字体大小。
推荐阅读
PC 端的 UI 组件库在移动端上会有不少样式 BUG,如非必要,不要使用。
若是 app 在移动设备上不须要全屏展现,那么在 chrome 上模拟设备大小时要减去设备状态栏的高度。
固然,这通常都不会有什么问题,只是为了多加一条建议。