一个完整的Flexbox指南
特别声明:如果您喜欢小站的内容,可以点击申请会员进行全站阅读。如果您对付费阅读有任何建议或想法,欢迎发送邮件至: airenliao@gmail.com!或添加QQ:874472854(^_^)
Flexbox布局(Flexible Box)模块(目前处于W3C工作草案)旨在提供一个更佳有效的布局方式,更好的控制项目的对齐和自由分配容器空间,即使它们的大小是未知的或动态的。因此得其名"flex"。
W3C兴趣小组,翻译了一份中文,感兴趣的可以点击这里。
Flex布局背后的主要思想是给容器控制项目(Flex项目)的宽度、高度的能力,使用Flex项目可以自动填满容器的可用空间(主要是适应所有类型的显示设备和屏幕大小)。Flex容器使用Flex项目可以自动放大与收缩,用来填补可用的空闲空间。
最重要的是Flexbox布局的direction-agnostic与常规则布局(块的vertically-based和内联horizontally-based)不同。而那些好的页面缺乏灵活性,特别是方向的改变,大小的调整,伸展,收缩等等。
注:Flexbox布局比较适合Web应用程序的一些小组件和小规模的布局,而Grid布局更适合用于一些大规模的布局。
有关于Grid布局模块的中文资料可以点击这里查阅。
基础知识和专业术语
因为Flexbox是一个模块,而不是一个单一的属性,他涉及很多东西。其中有一些是容器上的属性(父元素,也被称为“flex容器”),而有一些是容器子元素上的属性(常称为“flex项目”)。
如果常规布局是基于块和内联文本流方向,那么Flex布局就是基于“Flex-flow”方向。请看看下面来自规范中的一张图,其解释了Flex布局的主要思想。
基本上,Flex项目是沿着main axis
(从main-start
向main-end
)或者cross axis
(从cross-start
向cross-end
)排列。
- main axis:Flex容器的主轴主要用来配置Flex项目。注意,它不一定是水平,这主要取决于
flex-direction
属性。 - main-start | main-end:Flex项目的配置从容器的主轴起点边开始,往主轴终点边结束。
- main size:Flex项目的在主轴方向的宽度或高度就是项目的主轴长度,Flex项目的主轴长度属性是
width
或height
属性,由哪一个对着主轴方向决定。 - cross axis:与主轴垂直的轴称作侧轴,是侧轴方向的延伸。
- cross-start | cross-end:伸缩行的配置从容器的侧轴起点边开始,往侧轴终点边结束。
- cross size:Flex项目的在侧轴方向的宽度或高度就是项目的侧轴长度,Flex项目的侧轴长度属性是
width
或height
属性,由哪一个对着侧轴方向决定。
Flex容器属性
display
定义一个Flex容器,根据其取的值来决定是内联还是块。Flex容器会为其内容建立新的伸缩格式化上下文。
.container {
display: flex; /* or inline-flex */
}
Flex容器不是块容器,因此有些设计用来控制块布局的属片在Flexbox布局中不适用。特别是:多列组中所有
column-*
属性、float
、clear
属性和vertical-align
属性在Flex容器上没有作用。
如果元素
display
的值指定为inline-flex
,而且元素是一个浮动元素或绝对定位元素,则display
的计算值是flex
。
开启Flex容器:让一个元素变成伸缩容器
规范版本 | 属性名称 | 块伸缩容器 | 内联伸缩容器 |
---|---|---|---|
标准版本 | display | flex | inline-flex |
混合版本 | display | flexbox | inline-flexbox |
最老版本 | display | box | inline-box |
flex-direction
这是用来创建方轴,从而定义Flex项目在Flex容器中放置的方向。Flexbox是一种单方向的布局概念。认为Flex项目主要排列方式要么是水平排列,要么是垂直列排列。
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
row
(默认值):如果书写方式是ltr
,那么Flex项目从左向右排列;如果书写方式是rtl
,那么Flex项目从右向左排列row-reverse
:如果书写方式是ltr
,那么Flex项目从右向左排列;如果书写方式是rtl
,那么Flex项目从左向右排列column
:和row
类似,只不过方向是从上到下排列column-reverse
:和row-reverse
类似,只不过方向是从下向上排列
伸缩流:指定伸缩容器主轴的伸缩流方向
规范版本 | 属性名称 | 水平方向 | 反向水平 | 垂直方向 | 反向垂直 |
---|---|---|---|---|---|
标准版本 | flex-direction | row | row-reverse | column | column-reverse |
混合版本 | flex-direction | row | row-reverse | column | column-reverse |
最老版本 | box-orient box-direction |
horizontal normal |
horizontal reverse |
vertical normal |
vertical reverse |
flex-wrap
默认情况之下,Flex项目都尽可能在一行显示。你可以根据flex-wrap
的属性值来改变,让Flex项目多行显示。方向在这也扮演了一个重要角度,决定新的一行堆放方向。
.container{
flex-wrap: nowrap | wrap | wrap-reverse;
}
nowrap
(默认值):单行显示,如果书写方式是ltr
,Flex项目从左向右排列,反之rtl
,从右向左排列wrap
:多行显示,如果书写方式是ltr
,Flex项目从左向右排列,反之rtl
,从右向左排列wrap-reverse
:多行显示,如果书写方式是ltr
,Flex项目从右向左排列,反之rtl
,从左向右排列
换行:指定伸缩项目是否沿着侧轴排列
规范版本 | 属性名称 | 不换行 | 换行 |
---|