|
1 |
| -# 可伸缩布局方案 |
| 1 | +#lib.flexible |
| 2 | + |
| 3 | +移动端自适应方案 |
2 | 4 |
|
3 | 5 | ## 最新版本
|
4 | 6 |
|
5 | 7 | **1.0rc1**
|
6 | 8 |
|
7 |
| -## 依赖 |
| 9 | +## 依赖库 |
8 | 10 |
|
9 | 11 | 无
|
10 | 12 |
|
11 |
| -## 原理 |
12 |
| - |
13 |
| -在页面加载之初,判断当前系统以及其`device pixel ratio`,把文档宽度除以16作为文档的字体大小。在之后的样式中通过`rem`单位来实现元素的尺寸等设置,以便确保元素是可伸缩且自适应的。并且配合meta的scale缩放,来达到高清适配的目的。 |
14 |
| - |
15 |
| -## 栅格使用方法 |
| 13 | +## 使用方法 |
16 | 14 |
|
17 |
| -如选择grid三栏布局,一栏跨4列,则由3个col-4组成 |
18 |
| - |
19 |
| - <!-- .col-*的父节点要为.grid* --> |
20 |
| - <div class="grid"> |
21 |
| - <div class="col-4"></div> |
22 |
| - <div class="col-4"></div> |
23 |
| - <div class="col-4"></div> |
24 |
| - </div> |
| 15 | +建议对于js做`内敛处理`,在**所有资源加载之前**执行这个js。 |
25 | 16 |
|
26 |
| -如选择grid-thin两栏布局,一栏跨6列,则由2个col-6组成 |
| 17 | +执行这个js后,会在`html`(也就是document.documentElement)上增加一个`data-dpr`属性,以及`font-size`样式。 |
27 | 18 |
|
28 |
| - <div class="grid-thin"> |
29 |
| - <div class="col-6"></div> |
30 |
| - <div class="col-6"></div> |
31 |
| - </div> |
| 19 | +之后页面中的元素,都可以用rem单位来设置。`html`上的`font-size`就是rem的基准像素。 |
32 | 20 |
|
33 |
| -如选择grid-fat四栏布局,一栏跨3列,则由4个col-3组成 |
| 21 | +## 把视觉稿中的px转换成rem |
34 | 22 |
|
35 |
| - <div class="grid-fat"> |
36 |
| - <div class="col-3"></div> |
37 |
| - <div class="col-3"></div> |
38 |
| - <div class="col-3"></div> |
39 |
| - <div class="col-3"></div> |
40 |
| - </div> |
| 23 | +首先,假设视觉稿大小是`750`(iPhone6)。 |
41 | 24 |
|
| 25 | +当前方案会把这3类视觉稿分成`100份`来看待(为了以后兼容vh,vw单位)。每一份被称为一个单位a。同时,1rem单位认定为10a。拿750的视觉稿举例: |
42 | 26 |
|
43 |
| -## 单位rem使用方法 |
| 27 | + 1a = 7.5px |
| 28 | + 1rem = 75px |
44 | 29 |
|
45 |
| -对于320宽度来设计的视觉稿,只需要把视觉稿上的尺寸除以20,即可得出rem单位的数值。如果是以640宽度来设计的视觉稿,则除以40即可,依次类推。 |
46 |
| - |
47 |
| - <div class="grid-fat"> |
48 |
| - <div class="col-6"><div class="list">列表</div></div> |
49 |
| - <div class="col-6"><div class="info">信息</div></div> |
50 |
| - </div> |
51 |
| - <style> |
52 |
| - .list { |
53 |
| - padding-left: 0.2rem |
54 |
| - } |
55 |
| - .info { |
56 |
| - padding-right: 0.2rem; |
57 |
| - } |
58 |
| - </style> |
| 30 | +因此,对于视觉稿上的元素的尺寸换算,只需要`原始px值`除以`rem基准px值`即可。例如240px * 120px的元素,最后转换为3.2rem * 1.6rem。 |
59 | 31 |
|
60 | 32 | ## 字体不使用rem的方法
|
61 | 33 |
|
62 |
| -在document上会有一个属性`data-dpr`,值为当前网页的dpr实际值,包括1和2,未来可能有1.5和3。 |
| 34 | +字体的大小不推荐用rem作为单位。所以对于字体的设置,仍旧使用px作为单位,并配合用`data-dpr`属性来区分不同dpr下的的大小。 |
63 | 35 |
|
64 |
| -字体的大小不能用rem作为单位,仍旧采用px为单位。所以对于字体的设置,需要用data-dpr属性来区分不同dpr的大小。例如: |
| 36 | +例如: |
65 | 37 |
|
66 | 38 | div {
|
67 | 39 | width: 1rem;
|
68 | 40 | height: 0.4rem;
|
69 |
| - font-size: 12px; |
70 |
| - } |
71 |
| - [data-dpr="1"] div { |
72 |
| - font-size: 12px; |
| 41 | + font-size: 12px; // 默认写上dpr为1的fontSize |
73 | 42 | }
|
| 43 | + |
74 | 44 | [data-dpr="2"] div {
|
75 | 45 | font-size: 24px;
|
76 | 46 | }
|
77 | 47 |
|
78 |
| -## 如何在高清屏上展示1px的边框 |
| 48 | + [data-dpr="3"] div { |
| 49 | + font-size: 36px; |
| 50 | + } |
| 51 | + |
| 52 | +### 手动配置dpr |
| 53 | + |
| 54 | +引入执行js之前,可以通过输出meta标签方式来手动设置dpr。语法如下: |
| 55 | + |
| 56 | + <meta name="flexible" content="initial-dpr=2,maximum-dpr=3" /> |
| 57 | + |
| 58 | +其中`initial-dpr`会把dpr强制设置为给定的值,`maximum-dpr`会比较系统的dpr和给定的dpr,取最小值。**注意:这两个参数只能选其一。** |
| 59 | + |
| 60 | +### 手动设置rem基准值的方法 |
| 61 | + |
| 62 | +输出如下css样式即可: |
| 63 | + |
| 64 | + html {font-size: 60px!important;} |
| 65 | + |
| 66 | +### 一些常用APIs |
| 67 | + |
| 68 | +**[Number] lib.flexible.dpr** |
| 69 | + |
| 70 | +当前页面的dpr值 |
| 71 | + |
| 72 | +**[Number] lib.flexible.rem** |
| 73 | + |
| 74 | +当前页面的rem基准值 |
79 | 75 |
|
80 |
| -一般边框或者分割线需要精确的以1px的视觉展示出来,普通的方案无法满足要求。在高清方案下,所有的1px线都能完美重现视觉稿。 |
| 76 | +**[Number|String] lib.flexible.rem2px([Number|String digital])** |
| 77 | + |
| 78 | +把rem转换为px |
| 79 | + |
| 80 | +**[Number|String] lib.flexible.px2rem([Number|String digital])** |
| 81 | + |
| 82 | +把px转换为rem |
| 83 | + |
| 84 | +**lib.flexible.refreshRem()** |
| 85 | + |
| 86 | +刷新当前页面的rem基准值 |
| 87 | + |
| 88 | +## 栅格系统 |
| 89 | + |
| 90 | +***需引入makegrid.js*** |
| 91 | + |
| 92 | +### 使用方法 |
| 93 | + |
| 94 | + lib.flexible.makeGrid(params) |
| 95 | + |
| 96 | +- [Object params] |
| 97 | + - designWidth - 设计稿宽度 |
| 98 | + - designUnit - 设计稿最小单位a(以px为单位) |
| 99 | + - columnCount - 栅格列数 |
| 100 | + - columnXUnit - 栅格列宽(以a为单位) |
| 101 | + - gutterXUnit - 栅格间距(以a为单位) |
| 102 | + - edgeXUnit - 页面左右边距(以a为单位) |
| 103 | + - className - 栅格样式的名称(可省略,默认为grid) |
| 104 | + |
| 105 | +通过传入视觉的栅格规范定义,可以输出对应的css样式。 |
| 106 | + |
| 107 | + lib.flexible.makeGridMode(modeName) |
| 108 | + |
| 109 | +- [String modeName] |
| 110 | + |
| 111 | +方案还预置了几个默认的栅格规范,分别是`750-12`,`750-6`,`640-12`,`640-6`。 |
| 112 | + |
| 113 | +### 利用meta输出栅格样式 |
| 114 | + |
| 115 | + <meta content="designWidth=750, desginUnit=6, columnCount=12, columnXUnit=7, gutterXUnit=3, edgeXUnit=4" name="grid" /> |
| 116 | + |
| 117 | +或 |
| 118 | + |
| 119 | + <meta content="modeName=750-12" name="grid" /> |
| 120 | + |
| 121 | +### 栅格代码举例 |
| 122 | + |
| 123 | + <div class="grid"> |
| 124 | + <div class="col-4"></div> |
| 125 | + <div class="col-4"></div> |
| 126 | + <div class="col-4"></div> |
| 127 | + </div> |
| 128 | + |
| 129 | + <div class="grid"> |
| 130 | + <div class="col-6"></div> |
| 131 | + <div class="col-6"></div> |
| 132 | + </div> |
| 133 | + |
| 134 | + <div class="grid"> |
| 135 | + <div class="col-3"></div> |
| 136 | + <div class="col-4"></div> |
| 137 | + <div class="col-5"></div> |
| 138 | + </div> |
81 | 139 |
|
82 |
| -div { |
83 |
| - border: 1px solid #ECECEC; |
84 |
| - width: 8rem; |
85 |
| - height: 5rem; |
86 |
| - border-radius: 0.2rem; |
87 |
| -} |
88 | 140 |
|
89 |
| -## 常见问题 |
| 141 | +### 四类栅格在不同手机上的表现 |
90 | 142 |
|
91 |
| -* 目前安卓机器的scale缩放存在兼容性问题,所以安卓机器都以标清的方案输出。 |
92 |
| -* 如遇到加载时页面从大到小等闪烁时,可能需要在页面中内敛代码。 |
| 143 | +; |
0 commit comments