【简介】主要讲解了flex属性(包括flex-grow、flex-shrink、flex-basis),order属性的排序作用,以及两个综合性案例。
flex属性具有定义宽度的功能。
.FlexInner {
flex:1;
}
这里的 flex 实际上是三个属性合体的简写:flex-grow、flex-shrink、flex-basic。因此,详细的写法应为:
.FlexInner {
flex:1 1 100px;
}
其中三个值从左到右依次为:flex-grow(伸展)、flex-shrink(收缩)、flex-basis(基准)。
其中三个值代表的含义为:
下面我们来看这三个值的作用,首先看flex-basis,表示元素的宽度(相当于width):
HTML 部分:
<div class="FlexWrapper">
<div class="FlexItems FlexOne">div>
<div class="FlexItems FlexTwo">div>
<div class="FlexItems FlexThree">div>
<div class="FlexItems FlexFour">div>
div>
CSS 部分:
.FlexWrapper {
height: 100px;
width: 400px;
border: 1px solid #c3c3c3;
display: flex;
}
.FlexOne {
background-color: lightblue;
flex-basis: 100px;
}
.FlexTwo {
background-color: red;
}
.FlexThree {
background-color: lightgreen;
flex-basis: 100px;
}
.FlexFour {
background-color: yellow;
}
其中,对第一个和第三个 div 元素设置 flex-basis 为 100px,相当于设置这两个元素的 width 为 100px 的宽度,其余两个(第二个和第四个)未设置,所以宽度为 0。
第二个我们来看 flex-grow,这个元素在宽度有剩余的情况下,按比例分配给各个元素:
HTML 部分保持不变;
CSS 部分给第一个、第三个和第四个元素设置 flex-grow 为 1;给第二个元素设置 flex-grow 为 2;
.FlexOne {
background-color: lightblue;
flex-grow: 1;
flex-basis: 100px;
}
.FlexTwo {
background-color: red;
flex-grow: 2;
}
.FlexThree {
background-color: lightgreen;
flex-grow: 1;
flex-basis: 100px;
}
.FlexFour {
background-color: yellow;
flex-grow: 1;
}
这种情况下,子元素的基础宽度依次为 100px,0,100px,0,总共 200px,而父元素为 400px,则剩余 200px 的宽度空余。这 200px 的宽度按照 1:2:1:1 的比例分配给四个元素,即:
剩下一个 flex-shrink 的作用域 flex-grow 相反,指在空间不足的情况下,对于不够的空间,由元素按比例减去:
HTML 部分保持不变;
CSS 部分改为:
.FlexOne {
background-color: lightblue;
flex-shrink: 1;
flex-basis: 100px;
}
.FlexTwo {
background-color: red;
flex-shrink: 2;
flex-basis: 200px;
}
.FlexThree {
background-color: lightgreen;
flex-shrink: 1;
flex-basis: 100px;
}
.FlexFour {
background-color: yellow;
flex-shrink: 1;
flex-basis: 100px;
}
此时,四个子元素宽度依次为 100px、200px、100px、100px,总共 500px,父元素为 400px,则有 100px 的宽度不足,需要从四个子元素中消去,比例为 1:2:1:1,消去的方法为 flex-shrink 和flex-basis 的乘积所占的比例:
总量 = 100 * 1 + 200 * 2 + 100 * 1 + 100 * 1 = 700;
则每个元素需要消去:
则每个元素实际宽度:
这部分还有一个需要注意的点:
如果父级空间足够:flex-grow 有效, flex-shrink 无效。
如果父级空间不够:flex-grow 无效, flex-shrink 有效。
HTML 部分:
<body>
<div class="MainContent">主要内容div>
<div class="Footer">底部内容div>
body>
CSS 部分:
body {
font-family: 'Oswald', sans-serif;
color: #ebebeb;
display: flex;
flex-direction: column;
min-height: 100%;
}
.MainContent {
flex: 1;
color: #333;
padding: .5rem;
height: 300px;
background-color: #eee;
}
.Footer {
background-color: violet;
}
因为对 MainContent 元素设置了 flex:1,则在空间足够的情况下,flex-grow 生效,MainContent 元素填充剩余所有空间(这里父元素为 body,有最小高度为整个页面高度),则 Footer 元素就被放在了底部。
Flexbox 流式布局具有重新排列的能力。例如原始次序为:
HTML 部分:
<div class="FlexWrapper">
<div class="FlexItems FlexHeader">Headerdiv>
<div class="FlexItems FlexSideOne">SideOnediv>
<div class="FlexItems FlexContent">Contentdiv>
<div class="FlexItems FlexSideTwo">SideTwodiv>
<div class="FlexItems FlexFooter">Footerdiv>
div>
CSS 部分:
.FlexWrapper {
background-color: indigo;
display: flex;
flex-direction: column;
}
.FlexItems {
display: flex;
align-items: center;
min-height: 6.25rem;
padding: 1rem;
justify-content: center;
}
.FlexHeader {
background-color: #105b63;
}
.FlexSideOne {
background-color: #ffd34e;
}
.FlexContent {
background-color: #fffad5;
}
.FlexSideTwo {
background-color: #db9e36;
}
.FlexFooter {
background-color: #bd4932;
}
通过 order 属性可以在 Flexbox 中修改元素的次序:
修改 CSS 样式:
.FlexContent {
background-color: #fffad5;
order:-1;
}
则排列顺序为:
通过媒体查询和改变次序的方式,可以让不同的屏幕不仅得到不同的布局,而且次序也会改变。
HTML 部分把主内容 Content 放在页面开头,可以方便我们编程:
<div class="FlexWrapper">
<div class="FlexItems FlexContent">Contentdiv>
<div class="FlexItems FlexSideOne">SideOnediv>
<div class="FlexItems FlexSideTwo">SideTwodiv>
<div class="FlexItems FlexHeader">Headerdiv>
<div class="FlexItems FlexFooter">Footerdiv>
div>
对最小屏幕的排序的 CSS 样式:
.FlexHeader {
background-color: #105b63;
order: 1;
}
.FlexContent {
background-color: #fffad5;
order: 2;
}
.FlexSideOne {
background-color: #ffd34e;
order: 3;
}
.FlexSideTwo {
background-color: #db9e36;
order: 4;
}
.FlexFooter {
background-color: #bd4932;
order: 5;
}
效果如图:
在某一个宽度处设置断点:
@media (min-width: 30rem) {
.FlexWrapper {
flex-flow: row wrap;
}
.FlexHeader {
width: 100%;
}
.FlexContent {
flex:1;
order: 3;
}
.FlexSideOne {
width: 150px;
order: 2;
}
.FlexSideTwo {
width: 150px;
order: 4;
}
.FlexFooter {
width: 100%;
}
}
则显示效果:
使用 Flexbox 可以实现无数种可能的布局,而且得益于其「伸缩性」,这种布局机制非常适合响应式设计。
欢迎大家关注我的新浪微博 - 一点编程,了解最新动态 。