blob: d2054bc7251fde4ef5ad16d6d65dd9fe2f9889d9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
|
---
title: 使用弹性盒子进行高级布局
slug: Web/CSS/CSS_Flexible_Box_Layout/Mixins
tags:
- CSS3布局模型
- Flexible_Box
- Flexible_Box_Layout
- Layout
- 弹性盒子
- 弹性盒子模型
translation_of: Web/CSS/CSS_Flexible_Box_Layout/Mixins
---
<p>使用弹性盒子的意义是在任何尺寸的屏幕上改变其和其子元素的尺寸填充屏幕可用空间。一个弹性框容器将延展它的子元素以填充可用空间,并且缩小它的子元素来避免溢出。</p>
<h3 id="浮动布局的问题">浮动布局的问题</h3>
<ul>
<li><strong>难以控制。</strong>如果站点上存在一些不可预知的内容,那么布局将变的难以维护。</li>
<li><strong>源码顺序依赖</strong>。弹性布局依赖于HTML源码,在做响应式设计时将难以为不同的媒体查询变更布局。</li>
<li><strong>列等高问题</strong>。如果容器中有两到三列不同的内容,并且在任意内容的条件下,都需要设置为相同的高度。浮动布局难以实现这个要求。</li>
<li><strong>内容居中</strong>。使用浮动布局难以将内容水平且垂直居中。</li>
</ul>
<h3 id="弹性盒子如何处理">弹性盒子如何处理</h3>
<ul>
<li>通过将弹性元素拉伸或缩小来充满可用空间和避免溢出。这种方式解决了新内容的溢出问题并且以开发者期望的情况实施布局。</li>
<li>给予弹性元素成比例的尺寸。</li>
<li>弹性容器内的弹性元素可以从任意方向布局。可以解决在不同媒体查询中元素的顺序问题。使得可见内容的顺序独立于HTML渲染顺序,有利于站点的响应式设计。</li>
</ul>
<h3 id="弹性盒子属性">弹性盒子属性</h3>
<p><img alt="placeholder" src="http://saki007ster.github.io/public/images/flex-container.png" title="Flexbox properties"></p>
<ul>
<li><strong>主轴(main axis),主轴区域(main dimension)</strong>。弹性容器的主轴指的是弹性元素主要沿着哪个方向布局。它在主轴区域中延伸。</li>
<li><strong>主轴起点(main-Start),主轴终点(main-end)</strong>。弹性元素被放置于容器中从主轴起点到主轴终点放置。</li>
<li><strong>主轴尺寸(main size),主轴尺寸属性(main size property)</strong>。一个弹性元素的主轴尺寸指的是其在主轴区域内的长度。其主轴尺寸属性指的是其对应的属性。</li>
<li><strong>侧轴(cross axis),侧轴区域(cross dimension)</strong>。侧轴垂直于主轴。它在侧轴区域中延伸。</li>
<li><strong>侧轴起点(cross-Start),侧轴终点(cross-end)</strong>。浮动行被元素填充,并且在容器中沿侧轴方向从起点向终点分布。</li>
<li><strong>侧轴尺寸(cross size),侧轴尺寸属性(cross size property)</strong>。一个弹性元素的侧轴尺寸指的是其在侧轴区域内的长度。其侧轴尺寸属性指的是其对应的属性</li>
</ul>
<h4 id="弹性容器属性">弹性容器属性</h4>
<ul>
<li><a href="http://www.w3.org/TR/css3-flexbox/#propdef-flex-direction">flex-direction</a></li>
<li><a href="http://www.w3.org/TR/css3-flexbox/#propdef-flex-wrap">flex-wrap</a></li>
<li><a href="http://www.w3.org/TR/css3-flexbox/#propdef-flex-flow">flex-flow</a></li>
<li><a href="https://css-tricks.com/almanac/properties/j/justify-content/">justify-content</a></li>
<li><a href="http://www.w3.org/TR/css3-flexbox/#align-items-property">align-items</a></li>
<li><a href="http://www.w3.org/TR/css3-flexbox/#align-content-property">align-content</a></li>
</ul>
<h4 id="弹性元素属性">弹性元素属性</h4>
<ul>
<li><a href="http://www.w3.org/TR/css3-flexbox/#propdef-order">order</a></li>
<li><a href="http://www.w3.org/TR/css3-flexbox/#align-items-property">align-self</a></li>
<li><a href="http://www.w3.org/TR/css3-flexbox/#propdef-flex-grow">flex-grow</a></li>
<li><a href="http://www.w3.org/TR/css3-flexbox/#propdef-flex-shrink">flex-shrink</a></li>
<li><a href="http://www.w3.org/TR/css3-flexbox/#propdef-flex-basis">flex-basis</a></li>
</ul>
<h2 id="弹性盒子混合">弹性盒子混合</h2>
<p>对于希望在现代浏览器原生支持下使用弹性盒子的用户,这里有全部的支撑表格:<a href="http://caniuse.com/flexbox" style="line-height: 1.5;">http://caniuse.com/flexbox</a></p>
<p>将会使用:</p>
<ul>
<li>后备、陈旧的语法(IE10,移动端WebKit内核浏览器-无包裹)</li>
<li>最终标准的语法(FF、Safari、Chrome、IE11、Opera)</li>
</ul>
<p>启发于:</p>
<ul>
<li><a href="http://dev.opera.com/articles/view/advanced-cross-browser-flexbox/">http://dev.opera.com/articles/view/advanced-cross-browser-flexbox/</a></li>
</ul>
<p>可以从这些地方获取帮助:</p>
<ul>
<li><a href="http://w3.org/tr/css3-flexbox/">http://w3.org/tr/css3-flexbox/</a></li>
<li><a href="http://the-echoplex.net/flexyboxes/">http://the-echoplex.net/flexyboxes/</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ie/hh772069(v=vs.85).aspx">http://msdn.microsoft.com/en-us/library/ie/hh772069(v=vs.85).aspx</a></li>
<li><a href="http://css-tricks.com/using-flexbox/">http://css-tricks.com/using-flexbox/</a></li>
<li><a href="http://dev.opera.com/articles/view/advanced-cross-browser-flexbox/">http://dev.opera.com/articles/view/advanced-cross-browser-flexbox/</a></li>
<li><a href="https://developer.mozilla.org/en-us/docs/web/guide/css/flexible_boxes">https://developer.mozilla.org/en-us/docs/web/guide/css/flexible_boxes</a></li>
</ul>
<h3 id="弹性容器">弹性容器</h3>
<p>“flex”值会引起一个元素生成一个盒级的弹性盒子。</p>
<p>“inline-flex”会生成一个行内弹性盒子。</p>
<p>display: flex | inline-flex <a href="http://w3.org/tr/css3-flexbox/#flex-containers">http://w3.org/tr/css3-flexbox/#flex-containers</a></p>
<div>
<pre>@mixin flexbox {
display: -webkit-box;
display: -webkit-flex;
display: -moz-flex;
display: -ms-flexbox;
display: flex;
}
// 使用这样的混合模式
%flexbox { @include flexbox; }</pre>
</div>
<div>
<pre>@mixin inline-flex {
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: -moz-inline-flex;
display: -ms-inline-flexbox;
display: inline-flex;
}
%inline-flex { @include inline-flex; }</pre>
</div>
<h3 id="弹性盒子方向">弹性盒子方向</h3>
<p>“flex-direction”属性通过设置容器主轴来定义弹性元素如何在容器内排列。这个属性确定了弹性元素排列的方向。</p>
<p>值:row | row-reverse | column | column-reverse</p>
<p><a href="http://w3.org/tr/css3-flexbox/#flex-direction-property">http://w3.org/tr/css3-flexbox/#flex-direction-property</a></p>
<div>
<pre>@mixin flex-direction($value: row) {
@if $value == row-reverse {
-webkit-box-direction: reverse;
-webkit-box-orient: horizontal;
} @else if $value == column {
-webkit-box-direction: normal;
-webkit-box-orient: vertical;
} @else if $value == column-reverse {
-webkit-box-direction: reverse;
-webkit-box-orient: vertical;
} @else {
-webkit-box-direction: normal;
-webkit-box-orient: horizontal;
}
-webkit-flex-direction: $value;
-moz-flex-direction: $value;
-ms-flex-direction: $value;
flex-direction: $value;
}
// 简短版本:
@mixin flex-dir($args...) { @include flex-direction($args...); }</pre>
</div>
<h3 id="弹性盒子换行">弹性盒子换行</h3>
<p>“flex-wrap”属性控制了容器为单行还是多行。并且定义了侧轴的方向,新行将沿侧轴方向堆砌。</p>
<p>值:nowrap | wrap | wrap-reverse</p>
<p>默认:nowrap</p>
<p><a href="http://w3.org/tr/css3-flexbox/#flex-wrap-property">http://w3.org/tr/css3-flexbox/#flex-wrap-property</a></p>
<div>
<pre>@mixin flex-wrap($value: nowrap) {
// No Webkit Box fallback.
-webkit-flex-wrap: $value;
-moz-flex-wrap: $value;
@if $value == nowrap {
-ms-flex-wrap: none;
} @else {
-ms-flex-wrap: $value;
}
flex-wrap: $value;
}</pre>
</div>
<h3 id="弹性盒子流(简写)">弹性盒子流(简写)</h3>
<p>“flex-flow”属性是设置“flex-direction”和“flex-wrap”的简写,可以同时定义主轴和侧轴。</p>
<p>默认值:row nowrap</p>
<p><a href="http://w3.org/tr/css3-flexbox/#flex-flow-property">http://w3.org/tr/css3-flexbox/#flex-flow-property</a></p>
<div>
<pre>@mixin flex-flow($values: (row nowrap)) {
// No Webkit Box fallback.
-webkit-flex-flow: $values;
-moz-flex-flow: $values;
-ms-flex-flow: $values;
flex-flow: $values;
}</pre>
</div>
<h3 id="弹性盒子顺序">弹性盒子顺序</h3>
<p>“order”属性通过将这些元素分配到序数分组来控制它们出现的顺序。</p>
<p>默认值:0</p>
<p><a href="http://w3.org/tr/css3-flexbox/#order-property">http://w3.org/tr/css3-flexbox/#order-property</a></p>
<div>
<pre>@mixin order($int: 0) {
-webkit-box-ordinal-group: $int + 1;
-webkit-order: $int;
-moz-order: $int;
-ms-flex-order: $int;
order: $int;
}</pre>
</div>
<h3 id="弹性盒子增长">弹性盒子增长</h3>
<p>“flex-grow”属性设置增长因数,不接受负值。</p>
<p>默认值:0</p>
<p><a href="http://w3.org/tr/css3-flexbox/#flex-grow-property">http://w3.org/tr/css3-flexbox/#flex-grow-property</a></p>
<div>
<pre>@mixin flex-grow($int: 0) {
-webkit-box-flex: $int;
-webkit-flex-grow: $int;
-moz-flex-grow: $int;
-ms-flex-positive: $int;
flex-grow: $int;
}</pre>
</div>
<h3 id="弹性盒子收缩">弹性盒子收缩</h3>
<p>“flex-shrink”属性设置了收缩因数,不接受负值。</p>
<p>默认值:1</p>
<p><a href="http://w3.org/tr/css3-flexbox/#flex-shrink-property">http://w3.org/tr/css3-flexbox/#flex-shrink-property</a></p>
<div>
<pre>@mixin flex-shrink($int: 1) {
-webkit-flex-shrink: $int;
-moz-flex-shrink: $int;
-ms-flex-negative: $int;
flex-shrink: $int;
}</pre>
</div>
<h3 id="弹性盒子伸缩">弹性盒子伸缩</h3>
<p id="“flex-basis”属性设置了弹性框伸缩的基准值,不接受负值。"><span style="font-size: 14px; line-height: 1.5;">“flex-basis”属性设置了弹性框伸缩的基准值,不接受负值。</span></p>
<p>值:类似“width”,默认值:<code>auto</code></p>
<p><a href="http://www.w3.org/TR/css3-flexbox/#flex-basis-property">http://www.w3.org/TR/css3-flexbox/#flex-basis-property</a></p>
<div>
<pre>@mixin flex-basis($value: auto) {
-webkit-flex-basis: $value;
-moz-flex-basis: $value;
-ms-flex-preferred-size: $value;
flex-basis: $value;
}</pre>
</div>
<h3 id="弹性盒子“Flex”属性(简写)">弹性盒子“Flex”属性(简写)</h3>
<p>“<code>flex</code>”属性设置了弹性盒子长度的组成,包括增长因数、收缩因数和伸缩基准值。对于一个弹性元素,“<code>flex</code>”属性会被用来设置元素的尺寸,对于一个非弹性元素,该属性无效。</p>
<p>值:<code>none</code> | ||</p>
<p>默认值:见独立属性(1 1 0)</p>
<p><a href="http://w3.org/tr/css3-flexbox/#flex-property">http://w3.org/tr/css3-flexbox/#flex-property</a></p>
<div>
<pre>@mixin flex($fg: 1, $fs: null, $fb: null) {
// Set a variable to be used by box-flex properties
$fg-boxflex: $fg;
// Box-Flex only supports a flex-grow value so lets grab the
// first item in the list and just return that.
@if type-of($fg) == 'list' {
$fg-boxflex: nth($fg, 1);
}
-webkit-box-flex: $fg-boxflex;
-webkit-flex: $fg $fs $fb;
-moz-box-flex: $fg-boxflex;
-moz-flex: $fg $fs $fb;
-ms-flex: $fg $fs $fb;
flex: $fg $fs $fb;
}</pre>
</div>
<h3 id="弹性盒子对齐方式">弹性盒子对齐方式</h3>
<p>“justify-content”属性将弹性元素沿容器主轴方向对齐。当所有弹性元素的长度和边距都设置好之后,布局完成。一般情况下,当行内所有弹性元素尺寸不可变或可变且达到最大尺寸的情况下,该属性会分配剩余可用空间。同时,当元素溢出行的时候,它也会对其排列做出控制。</p>
<p>提示:以前版本的语法不支持“space-*”值。</p>
<p>值:flex-start | flex-end | center | space-between | space-around 默认值:flex-start</p>
<p><a href="http://w3.org/tr/css3-flexbox/#justify-content-property">http://w3.org/tr/css3-flexbox/#justify-content-property</a></p>
<div>
<pre>@mixin justify-content($value: flex-start) {
@if $value == flex-start {
-webkit-box-pack: start;
-ms-flex-pack: start;
} @else if $value == flex-end {
-webkit-box-pack: end;
-ms-flex-pack: end;
} @else if $value == space-between {
-webkit-box-pack: justify;
-ms-flex-pack: justify;
} @else if $value == space-around {
-ms-flex-pack: distribute;
} @else {
-webkit-box-pack: $value;
-ms-flex-pack: $value;
}
-webkit-justify-content: $value;
-moz-justify-content: $value;
justify-content: $value;
}
// Shorter version:
@mixin flex-just($args...) { @include justify-content($args...); }</pre>
</div>
<h3 id="弹性元素对齐">弹性元素对齐</h3>
<p>可以设置弹性元素在容器侧轴上的对齐方式,与“justify-content”功能相似但是方向垂直。“align-items”设置弹性盒子的所有子元素的对齐方式,包括匿名弹性元素。元素可以通过单独设置“align-self”来覆盖该属性。(对于匿名弹性元素,“align-self'”属性总是与“align-items”相同。)</p>
<p>值:flex-start | flex-end | center | baseline | stretch 默认值:stretch</p>
<p><a href="http://w3.org/tr/css3-flexbox/#align-items-property">http://w3.org/tr/css3-flexbox/#align-items-property</a></p>
<div>
<pre>@mixin align-items($value: stretch) {
@if $value == flex-start {
-webkit-box-align: start;
-ms-flex-align: start;
} @else if $value == flex-end {
-webkit-box-align: end;
-ms-flex-align: end;
} @else {
-webkit-box-align: $value;
-ms-flex-align: $value;
}
-webkit-align-items: $value;
-moz-align-items: $value;
align-items: $value;
}</pre>
</div>
<h3 id="弹性元素自对齐">弹性元素自对齐</h3>
<p>用来单独设置弹性元素在侧轴的对齐方式,功能与“align-items”相同。可以覆盖“align-items”属性。</p>
<p>值:auto | flex-start | flex-end | center | baseline | stretch 默认值:auto</p>
<div>
<pre>@mixin align-self($value: auto) {
// No Webkit Box Fallback.
-webkit-align-self: $value;
-moz-align-self: $value;
@if $value == flex-start {
-ms-flex-item-align: start;
} @else if $value == flex-end {
-ms-flex-item-align: end;
} @else {
-ms-flex-item-align: $value;
}
align-self: $value;
}</pre>
</div>
<h3 id="弹性元素内容对齐">弹性元素内容对齐</h3>
<p>“align-content”属性设置了容器内每行沿侧轴的对齐方式。与“justify-content”属性在主轴方向对齐单独元素的方式相似。如果容器内只有一行,该属性无效。</p>
<p>值:flex-start | flex-end | center | space-between | space-around | stretch 默认值:stretch</p>
<p><a href="http://w3.org/tr/css3-flexbox/#align-content-property">http://w3.org/tr/css3-flexbox/#align-content-property</a></p>
<div>
<pre>@mixin align-content($value: stretch) {
// No Webkit Box Fallback.
-webkit-align-content: $value;
-moz-align-content: $value;
@if $value == flex-start {
-ms-flex-line-pack: start;
} @else if $value == flex-end {
-ms-flex-line-pack: end;
} @else {
-ms-flex-line-pack: $value;
}
align-content: $value;
}</pre>
</div>
|