公式:结果 = 目标/上下文 即 元素大小除以元素所在的容器
自从有了flex,float已经能够说是后娘养的了。css
那么问题来了,如何实现flex布局html
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ display: flex; } </style> </head> <body> <div class="flex"></div> </body> </html>
如上面代码,元素设置了display: flex
时,就是一个弹性盒子了。布局
在弹性盒子里的块级元素,排成了一行,就如同行内元素同样,和使用float没啥区别。flex
但要注意的是父元素设置了flex
后,子元素的float
、clear
、ertical-align
属性将失效。spa
最后行内元素也能够设置flex
,不必定要块级元素。code
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ display: flex; background: pink; } .flex div{ width: 100px; height: 100px; margin: 10px; background: skyblue; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </body> </html>
结下了咱们称定义了display: flex
为flex容器,而其子元素叫作flex项目htm
默认状况下主轴就是横轴,属性是justify-content
,侧轴就是纵轴,属性是align-items
utf-8
看下这两个属性的值it
那么用flex布局来实现水平垂直居中对齐就很简单了io
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; justify-content: center; align-items: center; } .flex div{ width: 100px; height: 100px; margin: 10px; background: skyblue; } </style> </head> <body> <div class="flex"> <div></div> </div> </body> </html>
注意:横轴和纵轴这两个属性是写在flex容器里的,不是写在flex项目的。
能够试着改变横轴和纵轴的属性值,看子元素的位置变化,能够更好的了解flex布局
这个是决定哪一个是主轴,以前默认的主轴就是横轴
试下改变代码中flex-direction
的属性值,看子元素的变化
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; flex-direction: column; } .flex div{ width: 100px; height: 100px; margin: 10px; } .flex div:nth-child(1){ background: green; } .flex div:nth-child(2){ background: skyblue; } .flex div:nth-child(3){ background: brown; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> </div> </body> </html>
注意:若是你将主轴设置为column
或column-reverse
,那么属性align-items
表明的就是水平的,而属性justify-content
是垂直的。其实也就是和默认的主轴反过来了,具体用法和以前主轴为横轴是同样的。
用于设置弹性元素自身在侧轴(纵轴)方向上的对齐方式。(容许单个子元素与其余子元素不同的对齐方式)
以前的例子来看,子元素都是被统一管理,居中就所有都居中,这个属性就是让某些元素,可以和其余元素有不同的对其方式
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; justify-content: center; align-items: center; } .flex div{ width: 100px; height: 100px; margin: 10px; } .flex div:nth-child(1){ background: green; } .flex div:nth-child(2){ background: skyblue; } .flex div:nth-child(3){ background: brown; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> </div> </body> </html>
上面这段代码,子元素都水平垂直居中了,接下来要让第一个子元素,在上方。
改变CSS代码
.flex div:nth-child(1){ background: green; align-self: flex-start; }
项目的排列顺序,越小,排列越靠前
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; justify-content: center; align-items: center; } .flex div{ width: 100px; height: 100px; margin: 10px; } .flex div:nth-child(1){ background: green; order: 2; } .flex div:nth-child(2){ background: skyblue; order: 3; } .flex div:nth-child(3){ background: brown; order: 1; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> </div> </body> </html>
flex:int 数值表明该子元素所占据的比例大小
flex是三个属性的融合
flex-grow
定义弹性盒子元素的扩展比率。flex-shrink
定义弹性盒子元素的收缩比率。空间不足时flex-basis
定义弹性盒子元素的默认基准值。接下来看这段代码
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; } .flex div{ width: 100px; height: 100px; margin: 10px; background: #000; } .flex div:nth-child(1){ background: green; } .flex div:nth-child(2){ background: skyblue; } .flex div:nth-child(3){ background: brown; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> </div> </body> </html>
这时候我想让这三个子元素等比例,占满父容器,只要添加flex: 1
便可,这个样式也能够写成flex-grow: 1
改变关键CSS代码
.flex div{ width: 100px; height: 100px; margin: 10px; flex: 1; background: #000; }
以前关于flex的代码都是写在父元素上的,这个flex
属性要写在子元素里
接下来再看另外一段代码
<!doctype html> <html> <head> <title></title> <meta charset="utf-8" /> <style type="text/css"> .flex{ height: 500px; display: flex; background: pink; } .flex div{ width: 100px; height: 100px; margin: 10px; background: #000; } .flex div:nth-child(1){ background: green; } .flex div:nth-child(2){ background: skyblue; } .flex div:nth-child(3){ background: brown; } </style> </head> <body> <div class="flex"> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </body> </html>
子元素的div变多了,并且宽度被压缩了,如何让宽度保持不变,添加flex-shrink
,让其值为0
改变CSS代码
.flex div{ width: 100px; height: 100px; margin: 10px; flex-shrink: 0; background: #000; }
而后发现一个问题,子元素过多,超过了父级元素,溢出了,这时候就要换行。
用于指定弹性盒子的子元素换行方式
nowrap
默认, 弹性容器为单行。该状况下弹性子项可能会溢出容器。wrap
弹性容器为多行。该状况下弹性子项溢出的部分会被放置到新行,子项内部会发生断行wrap-reverse
反转 wrap 排列。那么这时只要在flex容器设置这个属性就好了
.flex{ height: 500px; display: flex; background: pink; flex-wrap: wrap; }
用于修改 flex-wrap 属性的行为。相似于 align-items, 但它不是设置弹性子元素的对齐,而是设置各个行的对齐。
若是是正常操做,这时候的页面子元素应该排成两行了,这个属性能够将每一行看作一个flex项目
.flex{ height: 500px; display: flex; background: pink; flex-wrap: wrap; align-content: space-around; }
做用在flex容器的属性
flex项目的属性