Flexbox
::: theorem 本章概要 ❑ 弹性容器和弹性元素
❑ 主轴和副轴
❑ Flexbox 里的元素大小
❑ Flexbox 里的元素对齐
:::
Flexbox 的原则
- 给元素添加
display: flex
,该元素变成了一个弹性容器(flex container) ,它的直接子元素变成了弹性子元素(flex item) - 弹性子元素默认是在同一行按照从左到右的顺序并排排列
- 弹性容器像块元素一样填满可用宽度,但是弹性子元素不一定填满其弹性容器的宽度
- 弹性子元素高度相等,该高度由它们的内容决定
在本例中,弹性容器应该是无序列表 <ul>
。它的子元素,即列表项 <li>
就是弹性子元素。
弹性盒子内的 auto
外边距会填充所有可用空间。
弹性子元素的大小
前面的代码使用外边距给弹性子元素设置了间距。你可以用 width
和 height
属性设置它们大小,但是比起 margin
、width
、height
这些常见属性,Flexbox 提供了更多更强大的选项。
flex
属性控制弹性子元素在主轴方向上的大小(在这里指的元素的宽度)。代码清单 5-6 将给网页的主区域应用弹性布局,并使用 flex
属性控制每一列的大小。
flex
属性是三个不同大小属性的简写:flex-grow
、flex-shrink
和 flex-basis
。在代码清单 5-7 里,只提供了 flex-grow
的值,剩下的两个属性是默认值(分别是 1 和 0%),因此 flex: 2
等价于 flex: 2 1 0%
。通常首选简写属性,但也可以分别声明三个属性。
与大部分简写属性不一样,如果在 flex
中忽略某个子属性,那么子属性的值并不会被置为初始值。相反,如果某个子属性被省略,那么 flex
简写属性会给出有用的默认值:flex-grow
为 1、flex-shrink
为 1、flex-basis
为 0%。这些默认值正是大多数情况下所需要的值。
每个子元素的 flex-shrink
值代表了它是否应该收缩以防止溢出。如果某个子元素为 flex-shrink: 0
,则不会收缩;如果值大于 0,则会收缩至不再溢出。按照 flex-shrink
值的比例,值越大的元素收缩得越多。
弹性方向
对齐、间距等细节
值得注意的地方
总结
- 全局重置盒尺寸
- 全局外边距,通过猫头鹰选择器,只给容器内从第二个开始往后的子元素添加
margin-top
,即容器内第一个子元素不设置margin-top
。这样设置之后,外边距只存在于上下排列的 子元素之间 - 双容器,用于网页内容居中。外层容器是
body
,内层窗口是.container
,并将外边距margin
设置为auto
- 更棒的是,Flexbox 允许使用
margin: auto
来填充弹性子元素之间的可用空间。弹性盒子内的auto
外边距会填充所有可用空间