跳到主要内容

定义伸缩项目

一个伸缩项目就是一个伸缩容器的子元素,伸缩容器内的文本也被当作伸缩项目。伸缩项目中的内容和普通的文本流一样。

伸缩项目都有一个主轴长度( Main Size )和一个侧轴长度( Cross Size )。主轴长度是伸缩项目在主轴上的尺寸,侧轴长度是伸缩项目在侧轴上的尺寸。一个伸缩项目的宽和高取决于伸缩容器的轴,可能就是它的主轴长度和侧轴长度。

显示位置

默认情况下,伸缩项目是按照文档流出现的先后顺序进行排列的。然后, order 属性可以来指定申诉项目在伸缩容器的出现的顺序:

order: <integer>;

扩展空间

扩展空间由 flex-grow 指定,子属性 flex-grow 的值是数字,如果容器中所有子元素的 flex-grow 是 1 ,那么每个子元素将占据相同的空间。

flex-grow: <number>;
  • 默认值为 0 ,负值时也为默认值;
  • 为 1 时,每个伸缩项目大小相等
  • 为 2 时,该伸缩项目是所剩其他伸缩项目的 2 倍
flex-grow: 2; /** 用在第 1 个 */
flex-grow: 2; /** 用在第 1 个 */

收缩空间

收缩空间由 flex-shrink 定义。与 flex-grow 类似。

flex-shrink: <number>;

伸缩比率

伸缩比率由 flex-basis 设置伸缩基准值,剩余空间按比率伸缩。

flex-basis: <length> | auto;

auto 为默认值,负值不合法。

flex 是 flex-grow 、 flex-shrink 、 flex-basis 3 个属性的复合属性,该属性适用于伸缩项目。其中第 2 个和第 3 个参数( flex-shrink 、 flex-basis )是可选参数。默认值为 "0 1 auto"。具体如下:

    flex : none | [<'flex-grow'> <flex-shrink'> ? |
| <'flex-basis'>
]

垂直对齐方式

对齐方式由 align-self 定义,语法如下

align-self: auto | flex-start | flex-end | center | baseline | stretch;
  • flex-start: 伸缩项目在侧轴起点的外侧边距紧靠该行起始边
  • flex-end: 伸缩项目在侧轴起点的外侧边距紧靠该行终止边
  • center: 伸缩项目在侧轴起点的外侧边距紧靠该行居中位置
  • baseline : 基线对齐
  • stretch :默认值,伸缩项目填充整个项目。此值会在项目的外边距盒的尺寸再遵照 min/max-width/height 属性的限制下尽可能的接近行的尺寸

margin : auto 在伸缩盒中具有强大的功能,一个 "auto" 的 margin 会和合并剩余的空间,把伸缩项目挤到其他位置。

旧版本中的属性 box-orient 和 box-direction 分别控制着子元素的排列方式和排列顺序,排列方式可以是从左向右( horizontal )或从上到下( vertical ),排列顺序可以是正序( normal )或反序( reverse ),结合两个属性,就能达到新版本中 flex-direction 属性的效果,例如水平排列加反序,相当于新属性的 row-reverse 。

<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<style type="text/css">
.page-wrap {
display: -webkit-box; /* 2009版 - iOS 6-, Safari 3.1-6*/
display: -moz-box; /* 2009版 - Firefox 19- (存在缺陷)*/
display: -ms-flexbox;
/* 2011版 - IE 10*/
display: -webkit-flex; /* 最新版 - Chrome*/
display: flex; /* 最新版 - Opera 12.1, Firefox 20+*/
}
.main-content {
-webkit-box-ordinal-group: 2; /* 2009版 - iOS 6-, Safari 3.1-6*/
-moz-box-ordinal-group: 2; /* 2009版 - Firefox 19-*/
-ms-flex-order: 2;
/* 2011版 - IE 10*/
-webkit-order: 2; /*
最新版 -
Chrome */
order: 2; /* 最新版 - Opera 12.1, Firefox 20+*/
width: 60%;
/* 不会自动伸缩,其他列将占据空间*/
-moz-box-flex: 1; /*
如果没有该声明,主内容(60%)会伸展到和最宽的段落,就像是段落设置了 white-space:nowrap */
background: white;
}
.main-nav {
-webkit-box-ordinal-group: 1; /*
2009版 - iOS 6-, Safari 3.1-6 */
-moz-box-ordinal-group: 1; /*
2009版 - Firefox 19- */
-ms-flex-order: 1; /* 2011版 - IE 10 */
-webkit-order: 1; /* 最新版 - Chrome*/
order: 1;
/* 最新版 - Opera 12.1, Firefox 20+*/
-webkit-box-flex: 1; /* 2009版 - iOS 6-, Safari 3.1-6*/
-moz-box-flex: 1; /* 2009版 - Firefox 19-*/
width: 20%;
/* 2009版语法, 否则将崩溃*/
-webkit-flex: 1; /*
Chrome
*/
-ms-flex: 1; /* IE 10*/
flex: 1;

/* 最新版 - Opera 12.1, Firefox 20+*/
background: #ccc;
}
.main-sidebar {
-webkit-box-ordinal-group: 3;

/* 2009版 - iOS 6-, Safari 3.1-6*/
-moz-box-ordinal-group: 3;
/* 2009版 - Firefox 19- */
-ms-flex-order: 3; /* 2011版 - IE 10*/
-webkit-order: 3; /* 最新版 - Chrome*/
order: 3;
/* 最新版, Spec - Opera 12.1, Firefox 20+*/
-webkit-box-flex: 1;

/* 2009版 - iOS 6-, Safari 3.1-6 */
-moz-box-flex: 1; /* Firefox 19-*/
width: 20%; /* 2009版,否则将崩溃
*/

-ms-flex: 1; /* 2011版 - IE 10*/
-webkit-flex: 1; /* 最新版 - Chrome*/
flex: 1; /*
最新版 - Opera 12.1, Firefox 20+ */
background: #ccc;
}
.main-content,
.main-sidebar,
.main-nav {
padding: 1em;
}
body {
padding: 2em;
background: #79a693;
}
\* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
h1,
h2 {
font: bold 2em Sans-Serif;
margin: 0 0 1em 0;
}
h2 {
font-size: 1.5em;
}
p {
margin: 0 0 1em 0;
}
</style>
</head>
<body>
<div class="page-wrap">
<section class="main-content">
<h1>主要内容</h1>
<p><strong>强调内容</strong></p>
<p>段落文本</p>
<p>描述文本</p>
</section>
<nav class="main-nav">
<h2>导航</h2>
<ul>
<li><a href="#">主页</a></li>
<li><a href="#">咨询</a></li>
<li><a href="#">产品</a></li>
<li><a href="#">关于</a></li>
</ul>
</nav>
<aside class="main-sidebar">
<h2>侧栏</h2>
<p>侧栏内容</p>
</aside>
</div>
</body>
</html>