This article is a Chinese translation version of A Complete Guide to Flexbox .
如果翻译中有谬误之处,请不吝指正~
[TOC]
A Complete Guide to Flexbox | Flexbox完全指导手册
原文文章发表于2013年4月8日;更新于2019年11月20日。
本文是对CSS flexbox布局的全面指导手册。此完全手册解释了flexbox相关的所有事项,专注于所有父元素(flex容器)和子元素(flex元素)。也包括了flex的历史、示例、样式、以及浏览器支持。
Background | 背景
Flexbox layout
( 即Flexible Box
)模块(自2017年10起的一个W3C候选推荐)目标是提供一种更加有效的方式对容器中的items进行空间布局、对齐、分布,甚至在他们的尺寸不确定或者动态的情况下(这是选用“flex”这个单词的原因)。
Flex
布局背后的主要思想是使容器能够更改其items
的宽度/高度(和顺序),以最好地填充可用空间(主要是适应各种显示设备和屏幕尺寸)。 Flex
容器会扩展items
尺寸以填充可用的可用空间,或缩短它们尺寸以防止溢出。
最重要的是,与常规布局(基于垂直的block
和基于水平的inline
)相比,flexbox布局与方向无关。尽管这些样式对于页面效果很好,但是它们缺乏灵活性(没有双关语)来支持大型或复杂的应用程序(尤其是在方向更改,调整大小,拉伸,缩小等方面)。
Note:Flexbox layout
最适合应用程序的组件和小规模布局,而Grid layout
则用于更大规模的布局。
Basics & Terminology | 背景&术语
由于Flexbox
是一个完整的模块,而不是单个属性,因此它涉及很多事情,包括其整个属性集。它们中的一些应放置在容器上(父元素,称为Flex container
),而其他一些则应放置在子元素上(称为Felx items
)。
如果regular布局是基于block
和inline
流动方向,则flex
布局是基于flex-flow
方向。请查看规范中的该图,解释flex
布局背后的主要思想。
Items
将沿main axis
(从main-start
到main-end
)或cross axis
(从cross-start
到cross-end
)布置。
Main axis
-Flex container
的main axis
是伸缩项目沿其布置的主轴。当心,它不一定是水平的。它取决于flex-direction
属性(请参见下文)。-
main-start
main-end
-flex items
被放置到容器中,以从main-start到
main-end`的顺序摆放。 Main size
-flex items
的宽度或高度,哪个在main dimension
上,哪个就是items
的main size
。flex items
的main size
属性是“宽度”还是“高度”属性,以哪个尺寸在main dimension
上为准。Cross axis
- 垂直于main axis
的轴称为cross axis
。其方向取决于main axis
方向。-
cross-start
cross-end
- 被items
填满的Flex lines
从flex container
的cross-start
侧开始,朝cross-end
侧放置到容器中。 Cross-size
-flex items
的宽度或高度,哪个在cross dimension
上,哪个就是items
的cross size
。cross size
属性是“宽度”还是“高度”,以哪个尺寸在cross dimension
上为准。
Properties for the Parent(flex container)| 父元素属性
display
这定义了一个flex container
;inline
或block
取决于给定的值。它为其所有直接子元素启用flex
上下文。
.container {
display: flex; /*or inline-flex*/
}
请注意,CSS列对flex容器无效。
flex-direction
这样就建立了main-axis
,从而确定了将flex items
放置在flex container
中的方向。除了可选包装外,Flexbox
是单向布局概念。可以将flex items
想像为主要以水平行或垂直列布置。
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
row
(default):ltr
下从左往右;rtl
下从右往左row-reverse
:ltr
下从右往左;rtl
下从左往右column
:和row
类似,从上往下column-reverse
:和row-reverse
类似,从下往上
flex-wrap
默认情况下,所有flex items
都将尝试放入一行中。您可以对此进行更改,并允许该属性根据需要包裹items
。
.container{
flex-wrap: nowrap | wrap | wrap-reverse;
}
nowrap
(default):所有flex items
将会在一行中。wrap
:flex items将会被包裹在多行中,从顶部到底部。wrap-reverse
:flex items将会包裹在多行中,从底部到顶部。
这李有一些flex-wrap的demo。
flex-flow(Applies to:parent flex container element)
这是flex-direction
和flex-wrap
属性的简写,它们共同定义了flex container
的main axis
和cross axis
。默认值为row nowrap
。
.container{
flex-flow: <‘flex-direction’> || <‘flex-wrap’>;
}
justify-content
这定义了沿主轴的对齐方式。 当一行上的所有flex items
都可伸缩或可伸缩但已达到最大大小时,它可以帮助分配额外的剩余可用空间。 当项目溢出行时,它还对项目的对齐方式施加一些控制。
.container {
justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly | start | end | left | right ... + safe | unsafe;
}
flex-start
(默认值): 从flex-direction的开始方向打包
items`。flex-end
: 从flex-direction的结束方向打包
items`。start
: 从writing-mode
的开始方向打包items
。end
: 从writing-mode
的结束方向打包items
。left
: 从容器左边方向打包items
,除非在flex-direction
上没有意义,那么它的行为就和start
一样。right
: 从容器右边方向打包items
,除非在flex-direction
上没有意义,那么它的行为就和end
一样。center
: 沿线居中items
。space-between
:items
在线上平均分配; 第一项位于开始,最后一项位于结束。space-around
:items
在行中均匀分布,周围具有相等的空间。 请注意,从视觉上看,空间是不相等的,因为所有项目的两侧都具有相等的空间。 第一项相对于容器边缘有一个单位的空间,但是下一项之间有两个单位的空间,因为下一项的两侧具有自己的间距。space-evenly
:items
被分布,以使任意两个项之间的间隔(以及到边缘的间隔)相等。
请注意,浏览器对这些值的支持是细微差别的。 例如, space-between
在某些版本的Edge从未获得支持,而Chrome还没有支持start
、end
、left
、right
。 MDN有详细的图表。 最安全的值是flex-start
,flex-end
和center
。
您还可以将其他两个关键字与这些值配对:safe
和unsafe
。 使用safe
机制可确保无论您执行哪种类型的定位,都不能推送元素以使其呈现屏幕外(例如,超出顶部),这种模式下内容也无法被滚动(称为“数据丢失” )。
align-items
这定义了flex items
如何沿当前行的cross axis
布局的默认行为。 将其视为cross axis
(垂直于main-axis
)的justify-content
版本。
.container {
align-items: stretch | flex-start | flex-end | center | baseline | first baseline | last baseline | start | end | self-start | self-end + ... safe | unsafe;
}
stretch
(默认值): 拉伸以填充容器(仍然遵守最小宽度/最大宽度)。flex-start
/start
/self-start
: items被放置在cross axis
的起点。 它们之间的区别是微妙的,并且涉及关于flex-direction
规则或writing-mode
规则。flex-end
/end
/self-end
: items被放置在cross axis
的终点。 它们之间的区别是微妙的,并且涉及关于flex-direction
规则或writing-mode
规则。center
:items
在cross-axis
上居中。baseline
:items
对齐,例如以它们的基线对齐。
safe
和unsafa
的修饰语关键字可以与所有其他关键字(注意浏览器支持)结合使用,并可以帮助您防止元素对齐导致无法访问内容。
align-content
当cross-axis
上有多余的空间时,决定如何对齐flex contain
的行,类似于justify-content
在main-axis
内对齐单个项目的方式。
注意:只有一行flex items
时,此属性无效。
.container {
align-content: flex-start | flex-end | center | space-between | space-around | space-evenly | stretch | start | end | baseline | first baseline | last baseline + ... safe | unsafe;
}
flex-start
/start
:items
被打包到容器开头处。flex-start
(更多支持)遵循flex-direction
,而start
遵循writing-mode
方向。flex-end
/end
:items
被打包到容器结束处。flex-end
(更多支持)遵循flex-direction
,而end
遵循writing-mode
方向。center
:items
在容器中居中。space-between
: `items均匀分布; 第一行在容器的开头,而最后一行在容器的结尾space-around
:items
均匀分布,且每行周围有相等的间隔。space-evenly
:items
均匀分布, 每行间隔相等。stretch
(default): 行拉伸以占用剩余空间。
safe
和unsafa
的修饰语关键字可以与所有其他关键字(注意浏览器支持)结合使用,并可以帮助您防止元素对齐导致无法访问内容。
Properties for the Children(flex items)| 子元素属性
order
默认情况下,flex items
按源顺序排列。 但是,order
属性控制它们在flex
容器中出现的顺序。
.item {
order: <integer>; */\* default is 0 \*/*
}
flex-grow
这定义了flex items
在必要时增长的能力。 它接受一个无单位值作为一个比例。 它决定了items
应在flex
容器内部占用多少可用空间。
如果所有items
的flex-grow
都设置为1,则容器中的剩余空间将平均分配给所有子项。 如果其中一个孩子的值为2,则剩余空间将占其他子项的两倍(或者至少会尝试)。
.item {
flex-grow: <number>; */\* default 0 \*/*
}
负数无效。
flex-shrink
这定义了flex items
在必要时收缩的能力。
.item {
flex-shrink: <number>; */\* default 1 \*/*
}
负数无效。
flex-basis
这定义了剩余空间分配之前元素的默认大小。 它可以是长度(例如20%,5rem等)或关键字。 auto
关键字的意思是“参考width
或height
属性”(由main-size
关键字临时完成,直到弃用)。 content
关键字的意思是“根据项目的内容调整大小”-此关键字尚未得到很好的支持,因此很难测试,也很难知道其弟兄的max-content,min-content和fit-content的行为。
.item {
flex-basis: <length> | auto; */\* default auto \*/*
}
如果设置为0,则不考虑内容周围的多余空间。如果设置为auto,则多余的空间将根据其flex-grow值进行分配。
看到这个图形。
flex
这是flex-grow
,flex-shrink
和flex-basis
组合的简写。 第二个和第三个参数(flex-shrink
和flex-basis
)是可选的。 默认值为0 1 auto
。
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
建议您使用此简写属性,而不是设置单个属性。 这个简写可以智能地设置其他值。
align-self
允许覆盖单个flex items
默认对齐方式(或由align-items
指定的对齐方式)。
请参阅align-items
的解释以了解可用值。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
请注意,float
、clear
和vertical-align
对flex items
没有影响。
Examples | 示例
Prefixing Flexbox | 前缀
Related Properties | 相关属性
Other Resources | 其他资源
Bugs | Bugs
Browser Support | 浏览器支持
Interpreted by Xie Huating, 2019-12-04