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-startmain-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-startcross-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