移动端适配
视口 ViewPort
在移动端中有三种类型
- layoutviewport: 大于实际屏幕,元素的宽度继承于
layoutviewport
, 用于保证网站的外观特性与桌面浏览器一样。layoutviewport
每个浏览器不同。可以通过document.documentElement.clientWidth
去获取 - visualviewport:当前显示在屏幕上的页面,即浏览器可视区域的宽度。
- idealviewport:浏览器定义的可完美适配移动端的理想 viewport,固定不变,可以认为是设备视口宽度。
设置 viewport
通过对几种 viewport
设置可以对网页的展示进行有效的控制,在移动端我们经常会在 head
标签中看到这段代码:
<meta name='viewport' content='width=device-width,initial-scale=1,user-scale=no' />
通过对 meta
标签三个 viewport
的设置,最终使页面完美展示:
- width 设置的是
layoutviewport
的宽度 - initial-scale 设置页面的初始缩放值,并且这个初始缩放值是相对于 idealviewport 缩放的,最终得到的结果不仅会决定 visualviewport,还会影响到 layoutviewport
- user-scalable 是否允许用户进行缩放的设置
为什么要设置viewport
viewport
设置不会对 PC
页面产生影响,但对于移动页面却很重要。
- 媒体查询
@media
响应式布局中,会根据媒体查询功能来适配多端布局,必须对viewport
进行设置,否则根据查询到的尺寸无法正确的匹配视觉宽度而导致布局混乱。如不设置viewport
参数,移动端媒体查询的结果将是980px
这个节点布局的参数。 - 目前多数手机的drp都不再是1,为了产出高保真页面,我们一般会给出
750px
的设计稿,就需要通过设置 viewport 的参数来进行整体换算。
设备像素比 dpr 与 1px 物理像素
物理像素(physical pixel)
手机屏幕上显示的最小单元,该最小单元具有颜色及亮度的属性可供设置,iPhone6、7、8 为:750 * 1334
,iPhone6+、7+、8+ 为 1242* 2208
设备独立像素(density-indenpendent pixel)
此为逻辑像素,计算机设备中的一个点,css
中设置的像素指的就是该像素。老早在没有 retina
屏之前,设备独立像素与物理像素是相等的。简称DIPs。
屏幕密度
屏幕密度是指一个设备表面上存在的像素数量,它通常以每英寸有多少像素来计算(PPI)。
屏幕密度
屏幕密度是指一个设备表面上存在的像素数量,它通常以每英寸有多少像素来计算(PPI)。
设备像素比(device pixel ratio)
设备像素比(dpr) = 物理像素/设备独立像素。iPhone 6、7、8 的 dpr 为 2,一个设备独立像素便为 4 个物理像素, 因此在 css 上设置的 1px 在其屏幕上占据的是 2 个物理像素,0.5px 对应的才是其所能展示的最小单位。
1px 的物理像素的解决方案
对于 dpr=2 的屏幕,1px压缩一半便可与1px的设备像素比匹配,可以通过将缩放比 initial-scale 设置为 0.5=1/2 而实现。dpr=3的屏幕可以将 initial-scale设置为 0.33=1/3 来实现。
设备像素比 dpr 与 rem 的适配方案
rem 如何设置
rem 是相对于根元素 html 的 font-size 来做计算,通常在页面初始化时加载时通过对document.documentElement.style.fontSize 设置来实现
rem 适配规则
通过对 initial-scale = 1/dpr
的设置,已将对屏幕的描述从物理像素转化到了物理像素上了,这将是后续推导的基础,且设计稿为 750px
。
- 物理像素为 750 = 375 * 2,若屏幕等分为 10 份,那么 1rem = 75px,10rem = 750px;
- 物理像素为 1125 = 375 * 3,若屏幕等分为 10 份,那么 1rem = 112.5px, 10rem = 1125px;
- 物理像素为 1242 = 414 * 3, 若屏幕等分为 10 份,那么 1rem = 124.2px, 10rem = 1242px;
由此可知 rem
的设定方式:
document.documentElement.style.fontSize = document.documentElement.clientWidth / 10 + 'px';
视口单位适配方案
将视口宽度 window.innerWidth
和视口高度 window.innerHeight
等分为 100 份,且将这里的视口理解成 idealviewport
,并不会随着 viewport
的不同设置而改变。
- vw: 1vw 为视口宽度的 1%
- vh: 1vh 为视口高度的 1%
- vmin: vw 和 vh 中的较小值
- vmax: vw 和 vh 中的较大值
如果设计稿为 750px,那么 1vw = 7.5px,100vw = 750px。使用 pxtoviewport
的库就可以帮我们转换。