flex - 弹性布局
特点:简单 快捷 方便
兼容性: 现代浏览器对其兼容性已经很好,老古董ie 除外
flex相关概念示意图
container父容器里有三个子元素flex-item。当给父容器设置display:flex;直接子元素就有布局模型了,上图中还有主轴和纵轴分别是布局的一个方向,后面的属性会详细说到。
先展示一下具体概念:
容器属性:
属性名 | 属性的含义 | 属性值 | |
---|---|---|---|
容器属性 | flex-direction | 子元素的排列方向 | row,row-reverse,column,column-reverse |
容器属性 | flex-wrap | 容器中子元素排列不下时 采用的换行方式 | nowrap,wrap,wrap-reverse |
容器属性 | flex-flow | flex-direction 及 flex-wrap的属性简写 | 默认值 row nowrap |
容器属性 | justify-content | 子元素在主轴上的排列方式 | flex-start,flex-end,center,space- between,space-around |
容器属性 | align-items | 子元素在另一轴上的排列方式 | flex-start,flex-end,center,baseline,stretch |
容器属性 | align-content | 多跟轴线的对其方式 | flex-start,flex-end,center,space- between,space-around,stretch |
子元素属性 | order | 控制子元素的排列顺序 | 0,1… 数字越小越靠前 |
子元素属性 | flex-grow | 当有多余空间时子,子元素的放大比例,默认0,不放大 | 0,1,2… |
子元素属性 | flex-shrink | 当空间不足时,子元素的缩小比例,默认1,进行缩小 | 1,0 |
子元素属性 | flex-basis | 子元素在容器中占据的空间 | 长度值,默认auto |
子元素属性 | flex | flex-grow,flex-shrink, flex-basis 合并写法 | 默认值 0 1 auto |
子元素属性 | align-self | 单个子元素独特的对齐方式 | 同align-items 会覆盖 align-item |
基本概念结束:
now !!!
code && demo
flex-direction
/*css*/
*{
margin: 0;
padding: 0;
}
.content{
width: 800px;
height: 500px;
border: 1px solid #11caff;
display: flex;
flex-direction: row;
}
.item{
border: 1px solid #000;
}
/*dom*/
<div class="content">
<div class="item">item1</div>
<div class="item">item2</div>
<div class="item">item3</div>
</div>
上述css flex-direction: row; 替换成 flex-direction: row-reverse;
上述css flex-direction: row-reverse; 替换成 flex-direction: column;
上述css flex-direction: column; 替换成 flex-direction: column-reverse;
flex-wrap: nowrap|wrap|wrap-reverse
/*css*/
*{
margin: 0;
padding: 0;
}
.content{
width: 800px;
height: 500px;
border: 1px solid #11caff;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
}
.item{
width: 300px;
border: 1px solid #000;
}
/*dom*/
<div class="content">
<div class="item">item1</div>
<div class="item">item2</div>
<div class="item">item3</div>
</div>
上述代码 flex-wrap: nowrap; 替换为 flex-wrap: wrap;
上述代码 flex-wrap: wrap; 替换成 flex-wrap: wrap-reverse;
flex-flow: flex-direction flex-wrap 的简写;
运行结果图 略
justify-content: flex-start|center|flex-end|space-between|space-around;
/css/
*{
margin: 0;
padding: 0;
}
.content{
width: 800px;
height: 500px;
border: 1px solid #11caff;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: flex-start;
}
.item{
border: 1px solid #000;
}
/dom/
上述代码替换成 justify-content: space-around;
注意: 上述代码替换成 justify-content:space-evenly;
but 在安卓上存在兼容性问题
容我喝口水缓一缓!!!
align-items: flex-start|flex-end|center|baseline|stretch;
/*css*/
*{
margin: 0;
padding: 0;
}
.content{
width: 800px;
height: 500px;
border: 1px solid #11caff;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: space-around;
align-items: flex-start;
}
.item1{
border: 1px solid #000;
height: 100px;
}
.item2{
border: 1px solid #000;
height: 150px;
}
.item3{
border: 1px solid #000;
height: 200px;
}
/*dom*/
<div class="content">
<div class="item1">item1</div>
<div class="item2">item2</div>
<div class="item3">item3</div>
</div>
上述代码 align-items: flex-start; 改为 align-items: flex-end;
上述代码 align-items: flex-end; 改为 align-items: center;
上述代码 align-items: center; 改为 align-items: baseline;
上面代码改为
/*css*/
*{
margin: 0;
padding: 0;
}
.content{
width: 800px;
height: 500px;
border: 1px solid #11caff;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
justify-content: space-around;
align-items: stretch;
}
.item1{
border: 1px solid #000;
}
.item2{
border: 1px solid #000;
font-size: 50px;
}
.item3{
border: 1px solid #000;
}
/*dom*/
<div class="content">
<div class="item1">item1</div>
<div class="item2">item2</div>
<div class="item3">item3</div>
</div>
运行结果:
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
align-content 只对多行有效果 align-items 对多行和单行都有效果
接下来详细看一下 align-content
/**css**/
*{
margin: 0;
padding: 0;
}
.content{
width: 800px;
height: 500px;
border: 1px solid #11caff;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
align-content: center;
}
.item1{
width: 500px;
border: 1px solid #000;
}
.item2{
width: 200px;
border: 1px solid #000;
font-size: 50px;
}
.item3{
width: 200px;
border: 1px solid #000;
}
/*dom*/
<div class="content">
<div class="item1">item1</div>
<div class="item2">item2</div>
<div class="item3">item3</div>
</div>
上述代码 align-content替换为 align-content: flex-end;
上述代码 align-content替换为 align-content: center;
上述代码 align-content替换为 align-content: stretch;
上述代码 align-content替换为 align-content: space-between;
上述代码 align-content替换为 align-content: space-around;
接下来 是子元素属性(简单说一下)很容易理解
order 属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。
flex-grow 属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。
flex-shrink 属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。
flex-basis 属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。
flex 为 flex-grow,flex-shrink,flex-basis 的合并写法。
align-self :属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
align-self属性举个栗子
/*css*/
*{
margin: 0;
padding: 0;
}
.content{
width: 800px;
height: 500px;
border: 1px solid #11caff;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
align-items: flex-start;
}
.item1{
width: 300px;
border: 1px solid #000;
}
.item2{
width: 200px;
border: 1px solid #000;
font-size: 50px;
align-self: center;
}
.item3{
width: 200px;
border: 1px solid #000;
}
/*dom*/
<div class="content">
<div class="item1">item1</div>
<div class="item2">item2</div>
<div class="item3">item3</div>
</div>
以上是flex 布局的基础知识
忠告: 要更快的掌握 请动手实践。。。