CSS 布局: Flexible Box(FlexBox)
FlexBox1 是由 W3C 的 弹性盒子工作组(Flexbox Working Group) 提出的,CSS3 新增的布局方式,旨在为Web应用程序提供一种更加灵活的一维布局解决方案。
# FlexBox 的创立者
弹性盒子工作组(Flexbox Working Group) 最初成立于2009年,至2012年成为正式的 W3C 工作组。工作组中的成员包括微软、谷歌、苹果等公司,以及多个 Web 技术方面的专家。他们致力于推动 Flexbox 规范的发展和推广,以便为 Web 开发人员提供更加丰富和灵活的布局方式。
# FlexBox 的特点
FlexBox 的特点是可以轻松对齐和拉伸元素,使元素在相同的空间内自适应排列。
FlexBox 的优点包括:
- 灵活性:可以轻松控制布局方式、对齐方式、间距、顺序等。
- 自适应性:弹性盒子的元素可以自适应其父容器的宽度和高度。
- 容器控制:弹性容器可以设置 flex-wrap、justify-content等属性来控制子元素的布局。
- 容易维护:使用 FlexBox 可以使代码结构更加简洁,易于维护。
# FlexBox 的适用场景
- 动态布局:FlexBox 是一种非常灵活的布局方式,可以根据屏幕尺寸和设备类型自动调整元素的大小和位置。因此,FlexBox 非常适合需要在不同设备上显示不同内容的动态布局。
- 导航栏:FlexBox 可以轻松实现导航栏的排列,同时还能够控制导航栏的各个元素之间的间距和对齐方式。这种布局方式还可以使导航栏在不同设备上保持良好的显示效果,为用户提供更好的导航体验。
- 列表布局:FlexBox 可以帮助我们轻松实现复杂的列表布局,例如网站中的产品展示、新闻列表等。使用 FlexBox 的优势是,我们可以轻松调整列表项之间的间距、对齐方式和排序方式等,从而更好地组织和呈现内容。
- 响应式布局:响应式布局是一种为不同屏幕尺寸和设备类型设计网站的方法。FlexBox 可以帮助我们制作出响应式布局,以便为用户提供更加流畅和符合要求的用户体验。
- 单行布局:FlexBox 也适用于单行的网页布局,例如页头、页脚等。使用FlexBox 可以轻松地将元素按照设计要求排列和对齐。另外,FlexBox 还可以帮助我们轻松地调整元素的大小和位置,以适应不同设备和屏幕尺寸的要求。
# FlexBox 模型介绍
采用 FlexBox 的元素,称为 Flex 容器(Flex Container),简称容器。它的所有子元素自动成为容器成员,称为 Flex 元素(Flex Item),简称元素(网络上很多人翻译成项目,例如阮一峰的《Flex 布局教程》2,我觉得元素更加准确点)。
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做 main start,结束位置叫做 main end;交叉轴的开始位置叫做 cross start,结束位置叫做 cross end。
元素默认沿主轴排列。单个元素占据的主轴空间叫做 main size,占据的交叉轴空间叫做 cross size。
为什么要使用主轴/交叉轴而不是横轴/纵轴?
在二维图形和计算机图形学中,我们经常使用横轴和纵轴(也称为 X 轴和 Y 轴)来描述坐标系,其中横轴是水平方向上的轴线,纵轴是垂直方向上的轴线。
而 FlexBox 的轴线是相对关系,需要定义主轴的方向,而垂直于这个主轴方向就是交叉轴,当主轴的方向方向是水平,那么主轴/交叉轴和横轴/纵轴就重合了,而主轴方向是任意的,概念上避免混淆,所以就独立出来了一个新概念。
# FlexBox 的使用
|  |  | 
# 属性说明
# Flex 容器属性
故名思义,就是接下里的 CSS 属性在容器上使用并起作用,而不是元素中:
|  |  | 
- flex-direction: 定义主轴方向
- flex-wrap: 定义换行方式
- flex-flow:- flex-direction和- flex-wrap组合配置- 格式:<flex-direction> <flex-wrap>
 
- 格式:
定义容器内元素的对齐方式
- justify-content: 定义子元素在主轴上的对齐方式- flex-start:左对齐
- flex-end:右对齐
- center: 居中
- space-between:两端对齐,元素之间的间隔都相等。
- space-around:每个元素两侧的间隔相等,元素之间的间隔比元素与容器边框的间隔大一倍
 
- align-item:定义子元素在交叉轴上的对齐方式- stretch:如果元素未设置高度或设为auto,将占满整个容器的高度;
- flex-start:交叉轴的起点对齐
- flex-end:交叉轴的终点对齐
- center:交叉轴的中点对齐
- baseline: 元素的第一行文字的基线对齐
 
- align-content: 当子元素在多个交叉轴**上的对齐方式- 起效场景:flex-wrap配置成可以换行的,并且子元素确实出现换行情况下;才能生效
- stretch:轴线占满整个交叉轴
- flex-start:与交叉轴的起点对齐
- flex-end:与交叉轴的终点对齐
- center:与交叉轴的中点对齐
- space-between:与交叉轴两端对齐,轴线之间的间隔平均分布
- space-around:每个元素两侧的间隔相等,元素之间的间隔比元素与容器边框的间隔大一倍
 
- 起效场景:
# Flex 元素属性
|  |  | 
- order: 元素的排列顺序(整数)- 数值越小,排列越靠前
 
- flex-grow:元素的放大方式(整数)- 0: 不放大
- 如果所有元素都不是 0, 元素的放大比例按照设定的数值比例来放大
 
- flex-shrink: 元素的缩小方式(整数)- 1: 空间不足的时候,等比例缩小
- 如果一个元素的flex-shrink属性为0,其他元素都为1,则空间不足时,前者不缩小。
 
- flex-basis:元素占据的主轴空间(整数)- 当它可以设为跟 width或height属性一样的值(比如350px),则元素将占据固定空间。
 
- 当它可以设为跟 
- flex:- flex-grow,- flex-shrink和- flex-basis的组合配置- 格式:flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
- 还提供了两个快捷值:- auto:- 1 1 auto)
- none:- 0 0 auto)
 
 
- 格式:
- align-self: 元素定义交叉轴方向对齐方式- 属性参考 align-item
 
- 属性参考 
如果想要具体案例,可以访问(挺完整的):
flex布局与传统布局对比 - 掘金,下面是一个 align-content 生效的场景