首先先聊一聊Flex布局是什么?Flex布局表面上相似于块布局,可是它缺乏许多能够在块布局中使用的更复杂的文本或文档中心属性,如浮动和列,与此同时,它也得到了一些简单而强大的布局工具,它能够自动调整,计算元素在容器空间的大小css
Flex容器:父元素显示地设置display:flex.
Flex项目:Flex容器内的子项目html
Flex容器中默认存在一根水平的主轴(main axis)和竖直的交叉轴(cross axis),主轴开始的位置叫main start,结束位置叫main end,交叉轴开始的位置cross start结束的位置叫cross end,Flex容器中的项目将会沿着主轴或者交叉轴排布。比较重要的几个概念介绍完,下面将会结合代码介绍对应的属性工具
容器属性主要有一下六个:布局
此属性决定了主轴的排布方向,能够取四个值:flex
<div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </div>
.container{ display: flex; flex-direction: row; } .item{ flex: 1; margin: 10px; background-color: #ccc; }
当flex-direction为row(默认值)时:spa
当flex-direction为column(默认值)时:3d
此属性决定了是否换行,可取三个值code
.container{ display: flex; flex-wrap: nowrap; width: 400px; } .item{ width: 200px; margin: 10px; background-color: #ccc; }
当flex-wrap属性值取默认的nowrap时,容器下面元素不会换行,且若是容器项目的宽度和超过容器,则容易项目宽度将会按照比例缩小htm
当flex-wrap属性值取默认的wrap时,容器下面元素超过容器宽度就会换行显示blog
flex-flow属性是flex-direction和flex-wrap属性的简写,默认是 row nowrap
此属性定义了主轴上的项目对齐方式,可取五个值:
.container{ display: flex; justify-content: flex-start; }
当justify-content为flex-start时,主轴上的项目将靠左对齐
当justify-content为flex-end时,主轴上的项目将靠右对齐
当justify-content为flex-end时,主轴上的项目将居中对齐
当justify-content为space-between时,主轴上的项目将两端对齐,且项目之间的间距相等
当justify-content为space-around时,项目两侧间距相等,项目之间的间距是侧边间距两倍
align-items控制项目在竖直交叉轴上的对齐方式,可取五个值
.container{ display: flex; height: 400px; align-items: flex-start; border: 1px solid #000; } .item{ width: 200px; height: 200px; margin: 0 10px; background-color: #ccc; }
align-items取值为flex-start时,靠顶端对齐
align-items取值为flex-end时,靠底端对齐
align-items取值为flex-center时,竖直居中对齐
.container{ display: flex; height: 400px; align-items: flex-start; border: 1px solid #000; } .item{ width: 200px; height: 200px; margin: 0 10px; background-color: #ccc; } .item:nth-child(1) { height: 100px; line-height: 100px; }
align-items取值为baseline时,基线对齐
此属性用于多行排列的Flex容器,对单行容器不起做用,排列效果和align-items同样,可是没有baseline属性,属性取值:
.container{ display: flex; height: 800px; width: 400px; flex-wrap: wrap; align-content: flex-start; border: 1px solid #000; } .item{ width: 200px; height: 200px; margin: 10px; background-color: #ccc; }
这是align-content取值为flex-start时,因为取值和align-item表现一致,所以再也不举例其余属性
此属性能够定义项目的排列顺序,数值越小的项目越靠前,默认值为0
.container{ display: flex; height: 400px; align-content: flex-start; border: 1px solid #000; } .item{ width: 200px; height: 200px; margin: 10px; background-color: #ccc; } .item:nth-child(1) { order: 2; } .item:nth-child(2) { order: 1; } .item:nth-child(3) { order: -1; }
这两个属性体现Flex布局的灵活性,它们定义了容器中项目的放大和缩小,flex-grow的默认值为0,即默认状况即便有剩余空间也不会自动放大,flex-shrink默认值为1,即在空间不足的状况下,容器项目会自动缩小
.container{ display: flex; width: 1000px; border: 1px solid #000; } .item{ width: 200px; height: 200px; margin: 10px; background-color: #ccc; }
默认状况下容器宽度比项目宽度大时,flex-grow默认值为0时,项目不会自动拉伸
当将flex-grow的值设置为1时,项目将会自动拉伸占满剩余空间
.item:nth-child(1) { flex-grow: 2; }
如图所示当将容器的第一个项目flex-grow设为2时,其余项目flex-grow为1时,容器的剩余空间会按照flex-grow的比例将剩余的空间分配给各个项目
.container{ display: flex; width: 500px; border: 1px solid #000; } .item{ width: 200px; height: 200px; margin: 10px; background-color: #ccc; }
当flex-shrink的值为默认1时,能够看到容器的项目宽度和比容器宽度要大时,会自动进行缩小,当手动设置flex-shrink为0时,将不会进行缩小,以下图
此属性设置项目占据主轴的空间,当不设置值时,默认为auto,即项目原本的大小,也能够手动设置占据主轴的空间大小
.container{ display: flex; width: 500px; border: 1px solid #000; } .item{ width: 100px; height: 200px; margin: 10px; background-color: #ccc; } .item:nth-child(1) { flex-basis: 150px; }
flex属性是flex-grow、flex-shrink、flex-basis的简写形式,默认值是0 1 auto,该属性有两个快捷值,auto(1 1 auto),none(0 0 auto)
此属性定义了单个项目的对齐方式,取值和表现和align-items基本一致,多了一个值auto即默认值,表示继承容器的align-items属性,取值auto | flex-start | flex-end | center | baseline | stretch
.container{ display: flex; width: 500px; border: 1px solid #000; } .item{ width: 100px; height: 200px; margin: 10px; background-color: #ccc; } .item:nth-child(1) { height: 100px; align-self: center; }
此处就举了align-self: center时的例子,其他表现和align-items表现一致,只不过align-self做用在单个项目上