本人能力尚缺,经验稍浅,翻译中存在的不足之处望你们批评指正,以便及时更正。
邮箱:440981b05j0.cdb@sina.cn
Github:Duggudcss
文章描述的是CSS flexbox布局综合指南。该彻底指南解释了有关flexbox的全部内容,重点介绍了父元素(flex容器)和子元素(flex项目)的全部可能的不一样属性。它还包括历史记录,演示,模式和浏览器支持图表。html
Flexbox布局(灵活盒子)模块(截至2017年10月的W3C候选推荐标准)旨在提供一种更有效的方式来布置,对齐和分配容器中项目之间的空间,即便它们的大小未知或是动态变化的( 这也是“flex”这个词的由来)。css3
Flex布局的主要思想是使容器可以改变其项目的宽度、高度以及顺序,以最好地填充可用空间(主要是为了适应全部类型的显示设备和屏幕尺寸)。Flex容器扩展项目以填充可用空间,或缩小它们以防止溢出。git
最重要的是,与常规布局(基于垂直的块和基于水平的内联块)相反,flexbox布局与方向无关。虽然前者适用于页面,但它缺少灵活性来支持大型或复杂的应用程序(特别是在方向更改,调整大小,拉伸,缩小等方面)。github
注意:Flexbox布局最适合应用程序的组件和小规模布局,而Grid布局则适用于更大规模的布局。web
父的属性(弹性容器) 浏览器
这定义了一个flex容器;内联或块取决于给定的值。它为全部直接子项目提供了flex上下文。bash
<!--css-->
.container {
display: flex; /* or inline-flex */
}
复制代码
注意: CSS列对flex容器没有影响。app
<!--css-->
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
复制代码
<!--css-->
.container{
flex-wrap: nowrap | wrap | wrap-reverse;
}
复制代码
更多可视化flex-wrap例程可访问visual demos of flex-wrap hereide
这是一个简写的flex-direction和flex-wrap属性,它们共同定义了flex容器的主轴(main-axis)和交叉轴(across-axis)。默认值为 row nowrap。
<!--css-->
flex-flow: <‘flex-direction’> || <‘flex-wrap’>
复制代码
<!--css-->
.item {
flex-grow: <number>; /* default 0 */
}
复制代码
flex-grow设置为负值时无效。
这定义了flex项在必要时收缩的能力。
<!--css-->
.item {
flex-shrink: <number>; /* default 1 */
}
复制代码
flex-shrink设置为负值时无效。
这定义了剩余空间分布以前元素的默认大小。它能够是长度(例如20%,5rem等)或关键字。auto关键字的意思是“查看个人宽度或高度属性”(这是由main-size关键字临时完成的,直到弃用)。 content关键字的意思是“根据项目的内容调整大小”,这个关键字尚未获得很好的支持,所以很难测试它,也很难知道它的兄弟属性max-content、min-content和fit-content的功能。
<!--css-->
.item {
flex-basis: <length> | auto; /* default auto */
}
复制代码
若是设置为0,则不考虑内容周围的额外空间。若是设置为auto,则根据其弹性增加值分布额外的空间。点击查看示例图表。
这是flex-grow、flex-shrink和flex-basis组合的简写。第二个和第三个参数(flex-shrink和flex-basis)是可选的。默认值是0 1 auto。
<!--css-->
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
复制代码
建议你使用这个简写属性,而不是设置各个独立属性。简写能够智能地设置其余值。
<!--css-->
.container {
justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly;
}
复制代码
这容许为单个flex项目重置默认的对齐方式(或由align-items指定的对齐方式)。
请参阅align-items说明以了解可用的值。
<!--css-->
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
复制代码
注意: float、clear和vertical-align对flex项没有影响。
这定义了flex项在当前行的cross- axis轴(c垂直于main-axis轴)上布局的默认行为。能够将其视为justify-content做用于cross- axis轴的版本。
<!--css-->
.container {
align-items: stretch | flex-start | flex-end | center | baseline;
}
复制代码
当cross-axis轴存在额外空间时,这会对flex项目沿cross-axis轴进行行对齐,相似于justify-content沿main-axis轴对flex项目进行对齐。
注意:当只有flex项目只有一行时,此属性不起做用。
<!--css-->
.container {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
复制代码
让咱们以一个很是简单的例子开始,解决一个几乎天天都会遇到的问题:完美居中。若是您使用flexbox,它将变得不能更简单。
<!--css-->
.parent {
display: flex;
height: 300px; /* Or whatever */
}
.child {
width: 100px; /* Or whatever */
height: 100px; /* Or whatever */
margin: auto; /* Magic! */
}
复制代码
这取决于flex容器中设置为“auto”的margin会吸取额外的空间。所以,设置垂直边距为auto将使项目完美地在两个轴上居中排列。
如今让咱们添加更多的属性。考虑一个包含6个项目的列表,它们的尺寸都是固定的,可是能够自动调整大小。咱们但愿它们均匀地分布在横轴上,以便在调整浏览器大小时一切正常(不使用媒体查询!)。
<!--css-->
.flex-container {
/* We first create a flex layout context */
display: flex;
/* Then we define the flow direction
and if we allow the items to wrap
* Remember this is the same as:
* flex-direction: row;
* flex-wrap: wrap;
*/
flex-flow: row wrap;
/* Then we define how is distributed the remaining space */
justify-content: space-around;
}
复制代码
Done.其余都只是一些样式问题。下面是一个测试例程。请访问CodePen,试着调整窗口大小,看看会发生什么。
咱们试下别的例子。想象一下,咱们的网站顶部有一个靠右对齐的导航,但咱们但愿它中型屏幕上居中,在小型设备上则呈现为单列导航。这也足够简单。
<!--css-->
/* Large */
.navigation {
display: flex;
flex-flow: row wrap;
/* This aligns items to the end line on main-axis */
justify-content: flex-end;
}
/* Medium screens */
@media all and (max-width: 800px) {
.navigation {
/* When on medium sized screens, we center it by evenly distributing empty space around items */
justify-content: space-around;
}
}
/* Small screens */
@media all and (max-width: 500px) {
.navigation {
/* On small screens, we are no longer using row direction but column */
flex-direction: column;
}
}
复制代码
让咱们使用flex项目的灵活性来作更好的实现!好比移动优先的3列布局,具备全宽度的页眉和页脚。与源顺序无关。
<!--css-->
.wrapper {
display: flex;
flex-flow: row wrap;
}
/* We tell all items to be 100% width, via flex-basis */
.wrapper > * {
flex: 1 100%;
}
/* We rely on source order for mobile-first approach
* in this case:
* 1. header
* 2. article
* 3. aside 1
* 4. aside 2
* 5. footer
*/
/* Medium screens */
@media all and (min-width: 600px) {
/* We tell both sidebars to share a row */
.aside { flex: 1 auto; }
}
/* Large screens */
@media all and (min-width: 800px) {
/* We invert order of first sidebar and main
* And tell the main element to take twice as much width as the other two sidebars
*/
.main { flex: 2 0px; }
.aside-1 { order: 1; }
.main { order: 2; }
.aside-2 { order: 3; }
.footer { order: 4; }
}
复制代码
Flexbox须要一些供应商的前缀来支持尽量多的浏览器。它不只包括带有供应商前缀的前置属性,实际上还有彻底不一样的属性和值名称。这是由于随着时间的推移,Flexbox规范已经发生了变化,建立了"old", "tweener", and "new"版本。
或许处理这个问题的最好方法是使用新的(也是最终的)语法,并经过Autoprefixer运行CSS, Autoprefixer能够很好地处理回退。
另外,这里有一个Sass @mixin来帮助添加一些前缀,这也让你知晓须要处理的事情:
<!--scss-->
@mixin flexbox() {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
}
@mixin flex($values) {
-webkit-box-flex: $values;
-moz-box-flex: $values;
-webkit-flex: $values;
-ms-flex: $values;
flex: $values;
}
@mixin order($val) {
-webkit-box-ordinal-group: $val;
-moz-box-ordinal-group: $val;
-ms-flex-order: $val;
-webkit-order: $val;
order: $val;
}
.wrapper {
@include flexbox();
}
.item {
@include flex(1 200px);
@include order(2);
}
复制代码
Flexbox固然也有bugs。我见过的最好bugs收集是Philip Walton和Greg Whitworth的Flexbugs。它是开源的,你能够跟踪全部的数据,因此我认为最好查看一下。
按“版本”划分:
黑莓浏览器10+支持新语法。
更多有关如何混合使用语法以得到最佳浏览器支持的信息,可访问CSS-Tricks和 DevOpera