Skip to content

移动端适配

名词解释

  1. 视口 就是浏览器显示页面内容的屏幕区域,分为布局视口、视觉视口和理想视口。(比如移动端布局想要的是理想视口,就是手机屏幕有多宽,我们的布局视口就有多宽)
  2. 物理像素 指的是设备的实际像素,这个主要由设备自身的硬件所决定,因此同一类型的设备物理像素是固定的。(比如:iphone6的物理像素宽度为 1334 x 750 px)
  3. 逻辑像素 是相对于物理像素之后提出的一个概念,也被称为设备独立像素(Device Independent Pixel),我们在css中设置的1px就等于一个设备独立像素。(逻辑像素为 667 x 375 px)
  4. 设备像素比(Device Pixel Ratio,DPR) DPR = 物理像素 / 逻辑像素(例如DPR = 2,也就相当于一个逻辑像素实际上由四个物理像素组成),厂商在设备出厂时就已经设置了DPR值,并且禁止用户进行更改。

问题

众所周知,手机端设备视口、逻辑像素、分辨率这些变量的不同,在每个设备展示都不一样,需要一种方案来统一。

  • 首先、不论转换是否方便,我就是不想在开发代码的时候换算这些单位,更不想去操心什么转换系数(根节点单位)
  • 我会考虑某些属性不需要转换为REM、VW等,如果统一转换,这会不符合我的项目需求。
  • 我不想在我的代码中一些地方使用px,另一些地方又使用em、rem、vw等这些视口单位,我就想一把梭全部使用px单位。

确定方案

名词解释

  1. px像素(Pixel),相对长度单位。像素px是相对于显示器屏幕分辨率而言的。
  2. rem 相对单位(root em,根em),是相对HTML根元素。
  3. vw 视口单位,1vw 等于视口宽度的1%。
  4. rm 根元素(html节点)字体大小的倍数。

采用PostCSS插件postcss-px-to-viewport的适配方案,它能完美解决上面的三个痛点,高效的将代码中px单位转为rm、rem、vw等视口单位,一份配置文件完美解决适配问题。

确定设计稿尺寸

这里选择物理像素宽度为750px的iphone6作为移动端设计稿尺寸。

原因

iphone6 是中型手机的一个代表,从中间尺寸向上和向下适配的时候界面调整的幅度最小。

方案配置

给postcss-px-to-viewport配置字段:

字段名值解释
unitToConvert'px'需要转换的单位,默认为"px"
viewportWidth1920设计稿的视口宽度
unitPrecision5单位转换后保留的精度
propList['*']能转化为vw的属性列表
viewportUnit'vw'希望使用的视口单位
fontViewportUnit'vw'字体使用的视口单位
selectorBlackList[]需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。
minPixelValue1设置最小的转换数值,如果为1的话,只有大于1的值会被转换
mediaQueryfalse媒体查询里的单位是否需要转换单位
replacetrue是否直接更换属性值,而不添加备用属性
excludeundefined忽略某些文件夹下的文件或特定文件,例如node_modules下的文件
includeundefined如果设置了include,那将只有匹配到的文件才会被转换
landscapefalse是否添加根据 landscapeWidth 生成的媒体查询条件@media (orientation: landscape)
landscapeUnit'vw'横屏时使用的单位
landscapeWidth1920横屏时使用的视口宽度

配置生效后,原有的代码中px在编译阶段被自动实时转换成vw视口单位,DOM元素与视口大小等比例缩放。

适配iphone屏幕的安全区域与边界

名词解释

  1. 安全区域 针对iphone手机提出的概念,指的是一个可视窗口范围,处于安全区域的内容不受圆角(corners)、齐刘海(sensor housing)、小黑条(Home Indicator)的影响。

iOS11 新增特性,苹果公司为了适配 iPhoneX 对现有 viewport meta 标签的一个扩展,用于设置网页在可视窗口的布局方式,可设置三个值:

  • contain: 可视窗口完全包含网页内容
  • cover:网页内容完全覆盖可视窗口
  • auto:默认值,跟 contain 表现一致

iOS11 新增特性,Webkit 的一个 CSS 函数,用于设定安全区域与边界的距离,有四个预定义的变量:

  • safe-area-inset-left:安全区域距离左边边界距离
  • safe-area-inset-right:安全区域距离右边边界距离
  • safe-area-inset-top:安全区域距离顶部边界距离
  • safe-area-inset-bottom:安全区域距离底部边界距离
css
// 需要适配 iPhoneX 必须设置 viewport-fit=cover,这是适配的关键步骤。
<meta name="viewport" content="width=device-width, viewport-fit=cover">
// 根据情况设置padding或者margin
padding-bottom: constant(safe-area-inset-bottom); /* 兼容 iOS < 11.2 */
padding-bottom: env(safe-area-inset-bottom); /* 兼容 iOS >= 11.2 */