aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/css/flex/index.html
blob: 295d7d9f3493b230cee7d762c96faf521633e6ed (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
---
title: flex
slug: Web/CSS/flex
tags:
  - CSS
  - CSS Flexible Boxes
  - CSS Property
  - CSS 弹性盒子布局
  - Flex
  - Reference
translation_of: Web/CSS/flex
---
<div>{{CSSRef}}</div>

<p><code>flex</code> <a href="/zh-CN/docs/Web/CSS/Shorthand_properties">CSS简写属性</a>设置了弹性项目如何增大或缩小以适应其弹性容器中可用的空间。</p>

<div>{{EmbedInteractiveExample("pages/css/flex.html")}}</div>

<p class="hidden">这个交互案例的源码存储在github仓库。如果你想对此案例做贡献,请克隆项目<a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> 并且给我们推送一个请求(PR)。</p>

<h2 id="成分属性">成分属性</h2>

<p>此属性是以下CSS属性的简写:</p>

<ul>
 <li>{{cssxref("flex-grow")}}</li>
 <li>{{cssxref("flex-shrink")}}</li>
 <li>{{cssxref("flex-basis")}}</li>
</ul>

<div id="flex"></div>

<h2 id="Syntax" name="Syntax">语法</h2>

<pre class="brush:css no-line-numbers notranslate">/* 关键字值 */
flex: auto;
flex: initial;
flex: none;

/* 一个值, 无单位数字: flex-grow */
flex: 2;

/* 一个值, width/height: flex-basis */
flex: 10em;
flex: 30px;
flex: min-content;

/* 两个值: flex-grow | flex-basis */
flex: 1 30px;

/* 两个值: flex-grow | flex-shrink */
flex: 2 2;

/* 三个值: flex-grow | flex-shrink | flex-basis */
flex: 2 2 10%;

/*全局属性值 */
flex: inherit;
flex: initial;
flex: unset;
</pre>

<p>可以使用一个,两个或三个值来指定 <code>flex</code>属性。</p>

<p><strong>单值语法</strong>: 值必须为以下其中之一:</p>

<ul>
 <li>一个无单位<strong>数({{cssxref("&lt;number&gt;")}})</strong>: 它会被当作<code>flex:&lt;number&gt; 1 0;</code> <code><a href="/zh-CN/docs/Web/CSS/flex-shrink">&lt;flex-shrink&gt;</a></code>的值被假定为1,然后<code><a href="/zh-CN/docs/Web/CSS/flex-basis">&lt;flex-basis&gt;</a></code> 的值被假定为<code>0</code></li>
 <li>一个有效的<strong>宽度({{cssxref("width")}})</strong>值: 它会被当作 <code><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-basis">&lt;flex-basis&gt;</a>的值。</code></li>
 <li>关键字<code><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex#none">none</a></code><font face="Open Sans, arial, x-locale-body, sans-serif"></font><code><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex#auto">auto</a></code><code>initial</code>.</li>
</ul>

<p><strong>双值语法</strong>: 第一个值必须为一个无单位数,并且它会被当作 <code><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-grow">&lt;flex-grow&gt;</a></code> 的值。第二个值必须为以下之一:</p>

<ul>
 <li>一个无单位数:它会被当作 <code><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-shrink">&lt;flex-shrink&gt;</a></code> 的值。</li>
 <li>一个有效的宽度值: 它会被当作 <code><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-basis">&lt;flex-basis&gt;</a></code> 的值。</li>
</ul>

<p><strong>三值语法:</strong></p>

<ul>
 <li>第一个值必须为一个无单位数,并且它会被当作 <code><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-grow">&lt;flex-grow&gt;</a></code> 的值。</li>
 <li>第二个值必须为一个无单位数,并且它会被当作  <code><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-shrink">&lt;flex-shrink&gt;</a></code> 的值。</li>
 <li>第三个值必须为一个有效的宽度值, 并且它会被当作 <code><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex-basis">&lt;flex-basis&gt;</a></code> 的值。</li>
</ul>

<h3 id="Values" name="Values">取值</h3>

<dl>
 <dt><code>initial</code></dt>
 <dd>元素会根据自身宽高设置尺寸。它会缩短自身以适应 flex 容器,但不会伸长并吸收 flex 容器中的额外自由空间来适应 flex 容器 。相当于将属性设置为"<code>flex: 0 1 auto</code>"。</dd>
</dl>

<dl>
 <dt id="auto"><code>auto</code></dt>
 <dd>元素会根据自身的宽度与高度来确定尺寸,但是会伸长并吸收 flex 容器中额外的自由空间,也会缩短自身来适应 flex 容器。这相当于将属性设置为 "<code>flex: 1 1 auto</code>".</dd>
 <dt id="none"><code>none</code></dt>
 <dd>元素会根据自身宽高来设置尺寸。它是完全非弹性的:既不会缩短,也不会伸长来适应 flex 容器。相当于将属性设置为"<code>flex: 0 0 auto</code>"。</dd>
 <dt><code>&lt;'flex-grow'&gt;</code></dt>
 <dd>定义 flex 项目的 {{cssxref("flex-grow")}} 。负值无效。省略时默认值为 <font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(220, 220, 220, 0.5);">1</span></font>。 (初始值为 <code>0</code>)</dd>
 <dt><code>&lt;'flex-shrink'&gt;</code></dt>
 <dd>定义 flex 元素的 {{cssxref("flex-shrink")}} 。负值无效。省略时默认值为<code>1</code>。 (初始值为 <code>1</code>)</dd>
 <dt><code>&lt;'flex-basis'&gt;</code></dt>
 <dd>定义 flex 元素的 {{cssxref("flex-basis")}} 属性。若值为<code>0</code>,则必须加上单位,以免被视作伸缩性。省略时默认值为 <font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(220, 220, 220, 0.5);">0</span></font>。(初始值为 <font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(220, 220, 220, 0.5);">auto</span></font>)</dd>
 <dt>
 <h3 id="描述">描述</h3>
 </dt>
</dl>

<p>大多数情况下,开发者需要将 <code>flex</code> 设置为以下值之一: <code>auto</code><code>initial</code><code>none</code>,或一个无单位正数。要查看这些值的效果,请尝试调整以下 flex容器的大小:</p>

<div id="flex">
<pre class="hidden brush: html notranslate">&lt;div class="flex-container"&gt;
  &lt;div class="item auto"&gt;auto&lt;/div&gt;
  &lt;div class="item auto"&gt;auto&lt;/div&gt;
  &lt;div class="item auto"&gt;auto&lt;/div&gt;
&lt;/div&gt;

&lt;div class="flex-container"&gt;
  &lt;div class="item auto"&gt;auto&lt;/div&gt;
  &lt;div class="item initial"&gt;initial&lt;/div&gt;
  &lt;div class="item initial"&gt;initial&lt;/div&gt;
&lt;/div&gt;

&lt;div class="flex-container"&gt;
  &lt;div class="item auto"&gt;auto&lt;/div&gt;
  &lt;div class="item auto"&gt;auto&lt;/div&gt;
  &lt;div class="item none"&gt;none&lt;/div&gt;
&lt;/div&gt;

&lt;div class="flex-container"&gt;
  &lt;div class="item initial"&gt;initial&lt;/div&gt;
  &lt;div class="item none"&gt;none&lt;/div&gt;
  &lt;div class="item none"&gt;none&lt;/div&gt;
&lt;/div&gt;

&lt;div class="flex-container"&gt;
  &lt;div class="item four"&gt;4&lt;/div&gt;
  &lt;div class="item two"&gt;2&lt;/div&gt;
  &lt;div class="item one"&gt;1&lt;/div&gt;
&lt;/div&gt;
</pre>

<pre class="hidden brush: css notranslate">* {
  box-sizing: border-box;
}

.flex-container {
  background-color: #F4F7F8;
  resize: horizontal;
  overflow: hidden;
  display: flex;
  margin: 1em;
}

.item {
  margin: 1em;
  padding: 0.5em;
  width: 110px;
  min-width: 0;
  background-color: #1B5385;
  color: white;
  font-family: monospace;
  font-size: 13px;
}

.initial {
  flex: initial;
}

.auto {
  flex: auto;
}

.none {
  flex: none;
}

.four {
  flex: 4;
}

.two {
  flex: 2;
}

.one {
  flex: 1;
}
</pre>

<p>{{EmbedLiveSample("flex", 1200, 370, "", "", "example-outcome-frame")}}</p>

<p>默认情况下,元素不会缩短至小于内容框尺寸,若想改变这一状况,请设置元素的{{cssxref("min-width")}} 与 {{cssxref("min-height")}}属性。</p>
</div>

<h2 id="正式定义">正式定义</h2>

<p>{{cssinfo}}</p>

<h2 id="正式语法">正式语法</h2>

<pre class="notranslate">{{csssyntax}}</pre>

<h2 id="示例">示例</h2>

<h3 id="设置_flex_auto">设置 flex: auto</h3>

<h4 id="HTML">HTML</h4>

<pre class="brush: html notranslate">&lt;div id="flex-container"&gt;
  &lt;div class="flex-item" id="flex"&gt;Flex box (click to toggle raw box)&lt;/div&gt;
  &lt;div class="raw-item" id="raw"&gt;Raw box&lt;/div&gt;
&lt;/div&gt;
</pre>

<h4 id="CSS">CSS</h4>

<pre class="brush: css notranslate">#flex-container {
  display: flex;
  flex-direction: row;
}

#flex-container &gt; .flex-item {
  flex: auto;
}

#flex-container &gt; .raw-item {
  width: 5rem;
}

</pre>

<div class="hidden">
<h4 id="JS">JS</h4>

<pre class="brush: js notranslate">var flex = document.getElementById("flex");
var raw = document.getElementById("raw");
flex.addEventListener("click", function() {
  raw.style.display = raw.style.display == "none" ? "block" : "none";
});
</pre>

<h4 id="CSS_2">CSS</h4>

<pre class="brush: css notranslate">#flex-container {
  width: 100%;
  font-family: Consolas, Arial, sans-serif;
}

#flex-container &gt; div {
  border: 1px solid #f00;
  padding: 1rem;
}

#flex-container &gt; .raw-item {
  border: 1px solid #000;
}
</pre>
</div>

<h3 id="Result">Result</h3>

<p>{{EmbedLiveSample('示例','100%','60')}}</p>

<h2 id="Specifications" name="Specifications">规范</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th>规范</th>
   <th>状态</th>
   <th>备注</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>{{SpecName('CSS3 Flexbox', '#flex-property', 'flex')}}</td>
   <td>{{Spec2('CSS3 Flexbox')}}</td>
   <td>Initial definition</td>
  </tr>
 </tbody>
</table>

<p>{{cssinfo}}</p>

<h2 id="浏览器兼容性">浏览器兼容性</h2>

<div class="hidden">The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a class="external external-icon" href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</div>

<p>{{Compat("css.properties.flex")}}</p>

<h2 id="See_also" name="See_also">参见</h2>

<ul>
 <li>CSS Flexbox 指南: <em><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox">Flexbox 基本概念</a></em></li>
 <li>CSS Flexbox 指南: <em><a href="/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout/Controlling_Ratios_of_Flex_Items_Along_the_Main_Ax">控制 Flex 子元素在主轴上的比例</a></em></li>
</ul>