关于flex的基本概念啥的就不介绍了,直接正题。
基本布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>flex box</title>
<style media="screen">
* {-webkit-box-sizing: border-box; box-sizing: border-box;}
.container div { background-color: red; border: 1px solid #333; }
.div1 {width: 70px; height: 70px;}
.div2 {width: 50px; height: 50px;}
.div3 {width: 60px; height: 60px;}
.container {width: 299px; height: 300px; background-color: #f0f0f0;}
</style>
</head>
<body>
<div class="container">
<div class="div1">盒1</div>
<div class="div2">盒2</div>
<div class="div3">盒3</div>
</div>
</body>
</html>
写在父容器上的属性
1、flex-direction(排列)
.container {
flex-direction: row ; /*水平排列(同float:left;)*/
row-reverse ; /*水平排列(同float:right;)*/
column ; /*垂直排列-顶部开始*/
column-reverse; /*垂直排列-底部开始*/
}
2、flex-wrap(换行)
.container{
flex-wrap: nowrap; /*不换行*/
wrap; /*换行,第一行在顶部*/
wrap-reverse; /*换行,第一行在底部*/
}
3、flex-flow
.container{
flex-flow: <flex-direction> <flex-wrap>; /*怎么排列(row/column) 怎么换行(nowrap/wrap)*/
}
4、justify-content
.container{
justify-content: flex-start; /*左对齐(默认值) 类似flex-direction: row;*/
flex-end; /*右对齐 类似flex-direction: row-reverse;*/
center; /*居中*/
space-between; /*两端对齐,项目之间的间隔都相等*/
space-around; /*每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍*/
space-evenly; /*每个项目间隔相等。所以,项目之间的间隔与边框的间隔一样大*/
}
5、align-items
.container{
align-items: flex-start; /*顶对齐*/
flex-end; /*底对齐*/
center; /*居中对齐*/
baseline; /*项目的第一行文字的基线对齐*/
stretch; /*(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。案例中没有给盒1和盒3高度*/
}
6、align-content
这个属性是基于两条轴线的 如果我的元素还是三个 ,没有出现换行的时候,此属性是没有效果的。增加三个盒子,然后给他们增加一个属性 flex-wrap: wrap
就可以了。
.container{
align-content: flex-start; /*与交叉轴的起点对齐*/
flex-end; /*与交叉轴的终点对齐*/
center; /*与交叉轴的中点对齐*/
space-between; /*与交叉轴两端对齐,轴线之间的间隔平均分布*/
space-around; /*每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。*/
stretch; /*((默认值):轴线占满整个交叉轴*/
}
写在子元素上的属性
1、order
默认值是零 ,越小的数字排的学靠前;
.div2{
order: 1; /*在这里给div2的子元素增加了这个属性,它就会比其他的排列都靠后*/
}
在这里给div2的子元素增加了这个属性,它就会比其他的排列都靠后;盒5和盒2是都是 div2;
2、flex-grow
定义子元素的放大比例,默认为0
,意思就是即使存在剩余空间,也不会放大;
.div2{
flex-grow: 1; /*拉伸剩余空间*/
}
如果所有子元素的
flex-grow
属性都为1,则它们将等分剩余空间(如果有的话)。如果一个子元素的
flex-grow
属性为2,其他子元素都为1,则前者占据的剩余空间将比其他子元素多一倍。3、flex-shrink
flex-shrink
属性定义了子元素的缩小比例,默认为1
,即如果空间不足,该子元素将缩小。
.container{
width: 150px; /*设置父元素的宽度为150px;*/
}
.div2{
flex-shinrk: 0; /*默认值为1,这里改成0,表示空间不足也不能压缩div2 ,盒1和盒3将会被压缩*/
}
4、flex-basis
flex-basis
属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto
,即项目的本来大小。
它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。
.div2{
flex-basis: 100px; /*当父元素存在多于空间,div2要占据100px空间;空间不足也按照100px空间来压缩*/
}
5、flex
flex属性是flex-grow
, flex-shrink
和 flex-basis
的简写,默认值为0 1 auto
。后两个属性可选。
.div2{
flex: 0 1 100px; /*即flex-grow: 0; flex-shrink: 1; flex-basis: 100px;*/
}
flex-grow和flex-shrink值为默认值,显示效果等同于basis: 100px;
6、
align-self
属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
。
.div2{
align-self: auto; /*默认值*/
flex-start; /**/
flex-end; /**/
center; /**/
baseline; /*需要两个以上元素有此属性才有用*/
stretch; /*给盒2的去掉*/
}
以上为flex的基础知识,具体应用还要上手练习才能体会。
本文参考 Flex 布局教程:语法篇