优化实战 第 50 期 - 纯CSS的移动端H5适配方案
响应式页面为了适应不同的终端设备而产生,体验较好,可以自动识别屏幕宽度以改变布局形式。但 不是所有的应用都适合做成响应式
对于一些大型复杂的应用,使用 移动端H5页面 和 PC端应用 协同使用,可以提升用户体验
基本概念
-
屏幕尺寸
电子设备的屏幕尺寸是以屏幕对角线的长度来计算的,单位:英寸(1英寸 = 2.54厘米)

-
屏幕分辨率
横纵方向上的像素点数,单位:像素(1px = 1个像素点)
例如:
iPhone 6的屏幕分辨率为750 * 1336
显示分辨率就是屏幕上显示的像素个数,
分辨率越高,显示效果就越精细和细腻 -
屏幕像素密度
像素密度
PPI表示每英寸里的像素点的个数
每英寸里的像素点的数量越多,画面自然越细腻

-
设备像素比
用
DPR表示设备像素比,在JS中可以通过window.devicePixelRatio获取到设备像素比 DPR = 物理像素 / 设备独立像素(px是一个相对单位,相对的是设备像素)

当比率为
1:1时,使用1个物理像素显示1个CSS像素当比率为
2:1时,使用4个物理像素显示1个CSS像素当比率为
3:1时,使用9个物理像素显示1个CSS像素由此衍生出的问题
当像素比为
1:1的时候,在页面中显示一个100px * 100px的图片,此时图片的实际长宽都是100个像素点,占据屏幕上100 * 100个物理像素这时候,如果在像素比为
2:1的设备上显示,如果要保持相同的显示效果,那么就需要将图片变成200px * 200px大小,此时图片的实际长宽都是200 * 200个像素点
视口(viewport)
-
布局视口
决定网页布局,由于布局宽度大于大部分手机屏幕的宽度,为了页面的显示完整性,浏览器会自动进行缩放
可通过
document.documentElement.clientWidth获取布局视口宽度 -
视觉视口
用户在移动设备上能够看到的网页区域,可通过
window.innerWidth获取视觉视口
-
理想视口
通过设置,使布局视口和视觉视口一样大
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"> -
视口单位
在
CSS3中新增了相对于视图窗口的vw和vh单位
适配方案
-
预期效果
在理想视口中,实现随着屏幕宽度大小的改变等比缩放页面内容
-
实现思路
在
CSS3中新增加了以根节点html的字体大小作为基准值进行长度计算的rem单位只要我们把根节点的字体大小和屏幕宽度进行关联,就可以解决适配的问题
100vw = 1屏幕宽度 = 750px (设计图尺寸)font-size = 1屏幕宽度(100vw) / 设计图尺寸(750px)* 100 -
字体扩大 100 倍的作用
既可以便于 rem 单位换算,又可以提升计算精度(设计图的 px 单位缩小 100 倍转换为 rem 单位)
-
方案组成(vw + rem)
html { font-size: 13.33334vw; } body { font-size: .2rem; /* 设置全局字体大小为 20px */ } -
强化 PC 端预览效果
body { min-width: 320px; max-width: 750px; margin: 0 auto; } @media screen and (min-width: 560px) { html { font-size: 54px; } }
常见问题
-
点击元素出现背景色块
a, button, input, textarea { -webkit-tap-highlight-color: rgba(255,0,0,0); } -
禁止图片长按
img { pointer-events: none; /* 阻止元素成为鼠标事件的目标 */ } -
禁止字体调整
body { text-size-adjust: 100%; }旋转屏幕可能会改变字体大小,让字体大小保持不变
-
清除输入表单的内阴影
input, textarea { -webkit-appearance: none; } -
识别文本换行
body { white-space: pre-line; }接口返回数据中包含
\n或<br>时,可交由浏览器做断行处理 -
刘海问题
<meta name="viewport" content="viewport-fit=cover">通过设置,使页面占满整个设备屏幕,必要时可以给
body添加一个background背景
关联适配方案
转载自:https://juejin.cn/post/7157901877618606110