Flexbox是Flexible box 的简称(灵活的盒子容器),是CSS3引入的新的布局模式。它决定了元素如何在页面上排列,使它们能在不一样的屏幕尺寸和设备下可预测地展示出来。css
它之因此被称为 Flexbox ,是由于它可以扩展和收缩 flex 容器内的元素,以最大限度地填充可用空间。与之前布局方式(如 table 布局和浮动元素内嵌块元素)相比,Flexbox 是一个更强大的方式:html
建立一个flex容器:chrome
在父元素的添加这条属性:浏览器
display: flex;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <style> *{ margin: 0; padding: 0; } .flex-container{ background-color: #131111; display: flex; /*让这个div变成弹性盒子*/ } .flex-container .flex-item{ padding: 20px; background-color: #b1ff84; } .flex-container .flex-item:first-child{ background-color: #f5e25f; } .flex-container .flex-item:last-child{ background-color: #0B5A79; } </style> <body> <div class="flex-container"> <div class="flex-item">1</div> <div class="flex-item">2</div> </div> </body> </html>
运行效果:布局
至关于两个div自动向左浮动,默认状况下,全部的直接子元素都被认为是 flex 项,并从左到右依次排列在一行中。若是 flex 项的宽度总和大于容器,那么 flex 项将按比例缩小,直到它们适应 flex 容器宽度。flex
也能够将这个两个子div排成一列,在.flex-container添加:flex-direction: column;网站
运行效果:ui
若是加的属性是flex-direction: column-reverse;即两个div互换(reverse的意思就是相反的),spa
当在.flex-container添加justify-content: flex-end;里面全部的flex将默认向左对齐变成向右对齐:code
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <style> *{ margin: 0; padding: 0; } .flex-container{ background-color: #131111; display: flex; /*让这个div变成弹性盒子*/ justify-content: flex-end; } .flex-container .flex-item{ padding: 20px; background-color: #b1ff84; } .flex-container .flex-item:first-child{ background-color: #f5e25f; } .flex-container .flex-item:last-child{ background-color: #0B5A79; } </style> <body> <div class="flex-container"> <div class="flex-item">1</div> <div class="flex-item">2</div> </div> </body> </html>
运行效果:
当justify-content值为:center时,flex项居中对齐,其运行效果:
justify-content总共有六个值前三个比较好理解:justify-start(默认,向左对齐),center,justify-end,
space-evenly
: flex 容器起始边缘和第一个 flex 项之间的间距和每一个相邻 flex 项之间的间距是相等。(愚人码头注:该属性之前不多看到,缘由是之前浏览器不支持,chrome 也是 60 版本以后才支持。延伸一下,align-content: space-evenly
也是这个逻辑 )space-between
: 任何两个相邻 flex 项之间的间距是相同的,但不必定等于第一个/最后一个 flex 项与 flex 容器边缘之间的间距;起始边缘和第一个项目之间的间距和末端边缘和最后一个项目之间的间距是相等的。space-around
: flex 容器中的每一个 flex 项的每一侧间距都是相等的。请注意,这意味着两个相邻 flex 项之间的空间将是第一个/最后一个 flex 项与其最近边缘之间的空间的两倍网上流行的一张图,更好的解释了justify-content属性值的表现:
也能够给指定的div让它变成向上或向下对齐:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <style> *{ margin: 0; padding: 0; } .flex-container{ background-color: #131111; display: flex; /*让这个div变成弹性盒子*/ justify-content: center; align-items: center; } .flex-container .flex-item{ padding: 20px; background-color: #b1ff84; } .flex-container .flex-item:first-child{ background-color: #f5e25f; } .flex-container .flex-item:last-child{ background-color: #0B5A79; } .flex-bottom{ /* 让这个div向上 */ align-self: flex-start; } </style> <body> <div class="flex-container"> <!-- 多加个class属性,方便指定 --> <div class="flex-item flex-bottom">1</div> <div class="flex-item">2 <br />2 <br/></div> <div class="flex-item">3 <br />3<br />3</div> </div> </body> </html>
运行效果:
一样的,algin-item也有五个属性值:
flex-start | flex-end | center | baseline | stretch;下图就是对应的效果:
容许 flex 项多行/列排列
.flex-container{ background-color: #131111; display: flex; flex-wrap: wrap; }
默认状况下, flex 项不容许多行/列排列(nowrap),若是 flex 容器尺寸对于全部 flex 项来讲不够大,那么flex 项将被调整大小以适应单行或列排列。
经过添加 flex-wrap: wrap
,能够将溢出容器的 flex 项将被排列到另外一行/列中,它也有三个取值:
nowrap(默认):不换行.
wrap:换行,第一行在上方
wrap-reverse:换行,第一行在下方
插入一段代码,看下效果:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <style> *{ margin: 0; padding: 0; } .flex-container{ background-color: #131111; display: flex; flex-wrap: wrap; justify-content: space-evenly;/**/ align-content: space-evenly; } .flex-container .flex-item{ padding: 20px; background-color: #b1ff84; } .flex-container .flex-item:first-child{ background-color: #f5e25f; } .flex-container .flex-item:last-child{ background-color: #0B5A79; } .flex-bottom{ /* 让这个div向下 */ align-self: stretch; } </style> <body> <div class="flex-container"> <!-- 多加个class属性,方便指定 --> <div class="flex-item">1</div> <div class="flex-item">2</div> <div class="flex-item">3</div> <div class="flex-item">4</div> <div class="flex-item">5</div> <div class="flex-item">6</div> <div class="flex-item">7</div> <div class="flex-item">8</div> <div class="flex-item">9</div> <div class="flex-item">10</div> </div> </body> </html>
运行效果:
当长度不够长时,自动换行:
当长度再短时:
拉伸 flex 项
flex-grow
只有在 flex 容器中有剩余空间时才会生效。flex 项的 flex-grow
属性指定该 flex 项相对于其余 flex 项将拉伸多少,以填充 flex 容器。默认值为1
。当设置为 0
时,该 flex 项将不会被拉伸去填补剩余空间。在这个例子中,两个项的比例是 1:2,意思是在被拉伸时,第一个 flex 项将占用 1/3,而第二个 flex 项将占据余下的空间,flex-grow控制的是flex项的拉伸比例,而不是占据 flex 容器的空间比例。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <style> *{ margin: 0; padding: 0; } .flex-container{ background-color: #131111; display: flex; } .flex-item1{flex-grow: 0;} .flex-item2{flex-grow: 1;} .flex-item3{flex-grow: 2;} .flex-container{ width:400px; padding:10px; background-color: #F0f0f0; } .flex-container .flex-item{ padding:20px 0; text-align: center; width:90px; background-color: #B1FF84; } .flex-container .flex-item:first-child{ background-color: #F5DE25; } .flex-container .flex-item:last-child{ background-color: #90D9F7; } </style> <body> <div class="flex-container"> <div class="flex-item flex-item1">1</div> <div class="flex-item flex-item2">2</div> <div class="flex-item flex-item3">3</div> </div> </body> </html>
我将三个div所有设为width:90px;
运行效果:
将flex-container的width变为600时:
能够看出2 3 以不一样的比例在填充剩余的空间,grow-shrink则是相反的,默认为1,即若是空间不足,该项目将缩小。
看不理解的话,推荐到这俩个网站:网站一