Appearance
常见问题
H5 平台的html {font-size: calc(100vw / 7.5);}
是什么意思?
construct-scss 模仿了小程序,小程序将视口宽度划分为 750 个单位,因此 construct-scss 的 H5 版本将视口宽度划分为 7.5 个单位。为什么是 7.5,不是 750?
屏幕宽度划分为单位数 | iPhone 8 375 px 宽度屏幕下,根元素 font-size 值 |
---|---|
750 个 | 375 / 750 = 0.5px(❌ 浏览器不支持这个大小) |
75 个 | 375 / 75 = 5px(❌ 浏览器不支持这个大小) |
7.5 个 | 375 / 7.5 = 50px(✔️) |
TIP
浏览器不支持 8px 以下的 font-size。
由于浏览器不支持 8px 以下的 font-size,所以,只能选择划分为 7.5 个单位。
想表达font-size: 16px
的字,它的 rem 值就是0.32rem
,原因是:16px / 50px = 0.32rem。
理解 CSS 分辨率、物理分辨率
iPhone 8 的 CSS 分辨率为 375px,物理分辨率为 750px(信息来源Apple.com.cn),CSS 分辨率不要跟设备物理分辨率混淆。
TIP
CSS 分辨率 = 设备物理分辨率 / devicePixelRatio
比如 iPhone 8 的物理分辨率是 750px,devicePixelRatio 是 2,那么 CSS 分辨率是 750px / 2 = 375px。
CSS 开发中始终要认定设备宽度是 375px,使用 Chrome 的手机模拟器也是显示 375px。
设计稿要做 750px,因为手机是将 750px 的图压缩到手机上,像素密度更高,为了保证清晰度,还是建议设计稿用 750px。
H5 版与其他 UI 框架的配合注意事项
H5 版 construct-scss 所有的长度单位一律用 rem 单位,与 UI 框架配合使用的话,UI 框架必须是使用 px 单位(而不是 rem 单位)的框架。因为如果 UI 框架也使用 rem 单位,那么如果恰好对根元素 font-size 的设定不统一,就会导致错误。除非,恰好 UI 框架也用了html {font-size: calc(100vw / 7.5);}
。
好在主流的移动端 CSS 框架和 UI 框架都是使用 px 单位的,比如 Vant,你只需要根据 Vant 的手册,使用插件让 Vant 的 px 转成统一的 rem 即可。
一些团队选择calc(100vw / 3.75)
,各有什么优势?
主要看哪个方案的心智负担较小。心智负担小的优点以粗体标出。从表格可以看出,还是 7.5 方案心智负担更小,优势更大。
根元素 font-size | calc(100vw / 3.75 | calc(100vw / 7.5 |
---|---|---|
优势 | ✔️与 CSS 像素匹配,.14rem 就是常说的 14 号字,CSS 像素的30px 对应.3rem | ✔️1. 与小程序 rpx 单位匹配; ✔️2. 与设计稿物理像素匹配,设计稿的 30px 对应.3rem |
劣势 | 1. 与小程序 rpx 单位不匹配; 2. 与设计稿物理像素不匹配,总要惦记着乘以(或除以)2 | 与 CSS 像素不匹配,总要惦记着乘以(或除以)2 |
iPhone 8 下根元素字号计算值 | ✔️375px / 3.75 = 100px | 375px / 7.5 = 50px |
iPhone 8 下视口宽度(rem 单位) | 375px / 100px = 3.75rem | ✔️375px / 50px = 7.5rem |
750px 设计稿在 iPhone 8 下是多宽 | 3.75rem | ✔️7.5rem |
iPhone 8 下 14px 字号改写为 rem 单位 | ✔️14px / 100px = .14rem | 14px / 50px = .28rem |
附录:Flex 和 Grid 布局容易混淆的属性对比
Flex | Grid | |
---|---|---|
维度 | 一维(但可折行) | 二维 |
层级 | 容器 > 子元素 | 容器 > 整个内容区域 > 单元格 > 格内元素 |
justify-content | 子元素在主轴上如何对齐 | 整个内容区域在容器内的水平对齐方式(左中右) (前提是整个内容区域小于容器) |
align-content | 多行/列时,整个内容区域在交叉轴上如何对齐 单行/列时,该属性不起作用 | 整个内容区域在容器内的垂直对齐方式(上中下) (前提是整个内容区域小于容器) |
align-items | 子元素在交叉轴上如何对齐 | 单元格内元素相对于单元格的垂直位置(上中下) |
justify-items | 没有这个属性 | 单元格内元素相对于单元格的水平位置(左中右) |
align-self | 专用于子元素,覆盖容器全局的 align-items 值 | 专用于格内元素,覆盖容器全局的 align-items 值 |
其它的 *-items *-content *-self | 没有这些属性 | 有这些属性,从略 |