@@ -9,13 +9,15 @@ outline: deep
9
9
10
10
## 适配方案 {#rem-or-vw}
11
11
12
- 目前移动端适配主要有两种方案,包括 ` vw ` 布局和 ` rem ` 布局。vw(视口宽度)布局根据视口宽度进行尺寸调整;rem(文档根元素)布局则基于根元素字体大小,保证不同设备上文字和元素的相对比例一致。选择上,我们采用了 vw 方案,首先是因为它得到了众多浏览器的兼容,其次它不用像 rem 在运行时通过 JavaScript 设置根元素的 ` font-size ` 。vw 让我们的代码更纯粹。
12
+ 目前移动端适配主要有两种方案,包括 vw 布局和 rem 布局。vw 布局根据视口宽度进行尺寸调整;rem 布局则基于文档根元素字体大小,保证不同设备上文字和元素的相对比例一致。
13
+
14
+ 选择上,我们** 默认** 采用了 vw 方案,首先是因为它得到了现代浏览器的支持,很少出现兼容性问题,其次它更容易理解,不用像 rem 动态修改根元素的 ` font-size ` 。vw 让我们的代码更纯粹。
13
15
14
16
## Viewport 布局 {#viewport}
15
17
16
- Vant 组件和业务代码,全部采用 ` px ` 作为样式单位,如果需要使用 ` viewport ` 单位(` vw ` , ` vh ` , ` vmin ` , ` vmax ` ),我们推荐使用 [ ` postcss-mobile-forever ` ] ( https://github.com/wswmsword/postcss-mobile-forever ) 进行转换。
18
+ Vant 组件和业务代码,全部采用 ` px ` 作为样式单位,如果需要使用 ` viewport ` 单位(` vw ` , ` vh ` , ` vmin ` , ` vmax ` ),我们推荐使用 [ postcss-mobile-forever] ( https://github.com/wswmsword/postcss-mobile-forever ) 进行转换。
17
19
18
- 它是一款 PostCSS 插件,用于将 ` px ` 单位转换为 ` vw/vh ` 单位。
20
+ 它是一款 PostCSS 插件,用于将 ` px ` 单位转换为 ` vw ` 单位。
19
21
20
22
### PostCSS 示例配置 {#postcss-example}
21
23
@@ -45,7 +47,7 @@ postcss: {
45
47
46
48
但想象这样一个场景,当我们从桌面端访问我们移动应用的时候,我们的视图元素也会同比例放大,这让我们的使用体验非常差,甚至无法操作 ` DOM ` 元素。
47
49
48
- 再次推荐 [ ` postcss-mobile-forever ` ] ( https://github.com/wswmsword/postcss-mobile-forever ) ,它不仅可以完成样式单位的转换,还对桌面端可访问性做了功能增强,提升了用户体验。我们只需要配置 ` maxDisplayWidth ` 属性,它可以限制视口单位的最大宽度。
50
+ 再次推荐 [ postcss-mobile-forever] ( https://github.com/wswmsword/postcss-mobile-forever ) ,它不仅可以完成样式单位的转换,还对桌面端可访问性做了功能增强,提升了用户体验。我们只需要配置 ` maxDisplayWidth ` 属性,它可以限制视口单位的最大宽度。
49
51
50
52
``` ts{7}
51
53
// vite.config.ts
@@ -61,10 +63,10 @@ postcss: {
61
63
```
62
64
63
65
::: warning
64
- 桌面端访问的特性是通过 CSS 函数 ` min() ` 、` max() ` 、` calc() ` 实现的,请注意业务中有否老旧设备的投放场景,如果有,请关闭 ` maxDisplayWidth ` 选项 。更多的兼容性情况可以查看 [ MDN] ( https://developer.mozilla.org/en-US/docs/Web/CSS/min#browser_compatibility ) 和 [ caniuse.com] ( https://caniuse.com/css-math-functions ) 。
66
+ 桌面端访问的特性是通过 CSS 函数 ` min() ` 、` max() ` 、` calc() ` 实现的,请注意业务中有否老旧设备的投放场景,如果有,请关闭 ` maxDisplayWidth ` 选项或查看后面的 [ Rem 布局 ] ( #rem ) 。更多的兼容性情况可以查看 [ MDN] ( https://developer.mozilla.org/en-US/docs/Web/CSS/min#browser_compatibility ) 和 [ caniuse.com] ( https://caniuse.com/css-math-functions ) 。
65
67
:::
66
68
67
- ## 行内样式转换 {#inline-px-to-vw}
69
+ ### 行内样式转换 {#inline-px-to-vw}
68
70
69
71
虽然这款 PostCSS 插件可以帮我们转换单位,但是像是一些行内样式单位它无法进行转换,因为这款插件是用于编译阶段的。我们需要一个运行时解决方案,在我们的行内样式需要转换的时候可以工作。好消息是,模板已经内置好这样一组函数。
70
72
@@ -96,6 +98,41 @@ import vw from '@/utils/inline-px-to-vw'
96
98
<div :style="`width: ${vw(width)}; height: ${vw(height)}`"></div>
97
99
```
98
100
101
+ ## Rem 布局 {#rem}
102
+
103
+ Viewport 布局使用 ` max() ` 等 CSS 函数实现,无法兼容老旧设备,会出现样式错乱问题。
104
+
105
+ 为了解决兼容问题,同时希望限制视图的最大宽度以适配桌面端屏幕,请按下面的配置启动 Rem 布局:
106
+
107
+ ``` ts{8}
108
+ // vite.config.ts
109
+ postcss: {
110
+ plugins: [
111
+ viewport({
112
+ appSelector: '#app',
113
+ viewportWidth: 375,
114
+ maxDisplayWidth: 600,
115
+ mobileUnit: 'rem',
116
+ }),
117
+ ],
118
+ }
119
+ ```
120
+
121
+ 相比 Viewport 布局配置,多了一行 ` mobileUnit: 'rem' ` 选项来指定 Rem 布局。添加配置后,在全局样式文件中添加一个空的 ` <html> ` 样式(若已存在则无需添加):
122
+
123
+ ``` css{1}
124
+ html { }
125
+ body, p, li {
126
+ margin: 0;
127
+ /* 省略样式 */
128
+ }
129
+ /* 省略其它选择器样式 */
130
+ ```
131
+
132
+ 恭喜你!已经完成了 Rem 布局的适配,现在请重新检查兼容性问题是否解决。
133
+
134
+ > 遇到问题[ 扫码进群] ( /vue3-vant-mobile/#feedback ) 或提交[ 议题] ( https://github.com/easy-temps/vue3-vant-mobile/issues ) 寻求帮助。
135
+
99
136
## 原子化 CSS (Atomic CSS) {#atomic-css}
100
137
101
138
目前,我们已经基本覆盖了常规 ` css ` 单位的转换。但是像是原子化 CSS 框架,比如 ` Tailwind CSS ` ,` Windi CSS ` ,以及我们模板内置的 ` Unocss ` ,它们都使用 ` rem ` 单位作为样式单位。面对这种新的情况,我们需要将 ` rem ` 转成 ` px ` ,再由 PostCSS 插件把 ` px ` 转成 ` vw ` 。
0 commit comments