css3彈性盒子display:flex
瀏覽器的支援情況:
Chrome | Safari | Firefox | Opera | IE | Edge | Android | iOS |
---|---|---|---|---|---|---|---|
21+ (new) | 6.1+ (new) | 22+ (new) | 12.1+ (new) | 11+ (new) | 17+ (new) | 4.4+ (new) | 7.1+ (new) |
1. 把大盒子叫“容器”,裡面的小盒子叫“專案”,“容器”設定display:flex時,具有彈性盒子功能。
2. 主軸和交叉軸
預設情況下,主軸和x軸相同,交叉軸和y軸相同。彈性盒子預設會按主軸x軸排列。
3. “容器”內的屬性
(1)盒子內部具有flex特性
.container{
display: flex;
}
(2)排列方向:flex-direction:row;(預設情況)
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
注意:當x軸上排列時,子元素都是inline-block元素;當y軸上排列時,子元素都是block元素。
(3)是否換行:flex-wrap:nowrap;(預設所有子元素在一行排列)
.container{ flex-wrap: nowrap | wrap | wrap-reverse; }
如果可以換行,那麼第一行有幾個子元素?第二行有幾個子元素?
<style> .container{ display: flex; flex-wrap: wrap; width: 400px; height: 400px; border: 1px solid black; } .item{ width: 98px; height: 100px; border: 1px solid black; } .item:nth-of-type(1){ flex-grow: 1; } .item:nth-of-type(2){ flex-grow: 1; } .item:nth-of-type(3){ flex-grow: 1; } .item:nth-of-type(4){ flex-grow: 1; } .item:nth-of-type(5){ flex-grow: 1; } </style> <body> <!-- 容器 --> <div class="container"> <!-- 專案 --> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> <div class="item">4</div> <div class="item">5</div> </div> </body>
上述程式碼:每個子元素的盒子的寬度 98+2 = 100px,而“容器”的content去的寬度:400px,所以第一行可以放置4個子元素;讓後將第五個子元素放置在第二行,同時注意高度
如果:子元素的盒子寬度:100px + 2px = 102px,那麼第一行有三個子元素,第二行有兩個子元素,同時注意高度
如果把子元素的高度設定為:150px,那麼效果:
如果子元素一共有三行,那麼效果:子元素的寬:196px,高100px
結論:(子元素x軸方向排列)設定換行屬性後,子元素先在第一行排列,(子元素的盒模型寬=border+padding+content)與(“容器”的content寬度)能放下的就放在該行,不能放下的放在下一行。
兩行時,將容器分為兩個半區,每一行在自己的半區內居上(父級的align-items屬性,預設是:flex-start);同理:三行時,將容器分為三個半區,每一行也是在自己的半區內居上。
重點是:有幾行,就將容器上下分為幾個半區。(預設情況align-content:stretch)
(4)flex-flow: <‘flex-direction’> || <‘flex-wrap’>,由flex-direction和flex-wrap兩個屬性複合的屬性,預設是row nowrap
。
flex-flow: <‘flex-direction’> || <‘flex-wrap’>
(5)justify-content:預設值:flex-start;
比如:子元素自己的寬高生效,父級:justify-content:center;
<style>
.container{
display: flex;
justify-content: center;
flex-wrap: wrap;
width: 400px;
height: 400px;
border: 1px solid black;
}
.item{
width: 100px;
height: 100px;
border: 1px solid black;
}
</style>
<body>
<!-- 容器 -->
<div class="container">
<!-- 專案 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
</body>
(6)在側軸上如何對齊:align-items:stretch(預設值)
主要看下兩個軸的時,效果:
因為有兩行,第一行佔容器的上半區,第二行佔容器的下半區,每一行都在自己的半區居中。
(7)align-content:stretch(預設值)
注意:當只有一行flex項時,此屬性不起作用。
該屬性在多行下,設定每一行在容器的排列。
比如:align-content:flex-start
4. “專案”中的屬性
注意:子級元素設定的寬是100px,但是盒模型的寬卻是78px,要注意的是,width值的存在意義重大,尤其是計算佈局時。
(1)order:number;該子級的先後順序中排第幾位
預設情況下,每一個子級按照標籤的先後順序在頁面中佈局,但是order可以改變子級在頁面中的先後順序。
比如:
<style>
.container{
display: flex;
width: 400px;
height: 400px;
border: 1px solid black;
}
.item{
width: 100px;
height: 100px;
border: 1px solid black;
}
.item:nth-of-type(1){
order: 5
}
.item:nth-of-type(2){
order: 4
}
.item:nth-of-type(3){
order: 3
}
.item:nth-of-type(4){
order: 2
}
.item:nth-of-type(5){
order: 1
}
</style>
<body>
<!-- 容器 -->
<div class="container">
<!-- 專案 -->
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
</body>
(2)flex-grow:number;子級在該行中所佔的剩餘空間比例。
剩餘空間:就是子級的原始盒模型(設定的border+padding+content值)要是沒有剩餘空間,該值是無效的
比如:.item:nth-of-type(5){ flex-grow: 2; }
但是效果:因為沒有剩餘空間,所以flex-grow是無效的。同時,該例子中,
(3)flex-shrink:number;每一行中,子元素按原始盒模型排列後,超出“容器”的部分,按照比例大小進行收縮(砍掉),每個子元素中該值越大,被砍掉的越多,預設值為1
比如:上面圖片效果中,5個子元素的flex-shrink都是預設值1,所以,都被等比例的砍掉了一部分
無意中,發現一個知識點:
如果子元素中,原始盒模型 > flex盒模型,內容是數字或者英語單詞,且數字或英語單詞過長,超過了flex盒模型的寬度,那麼內容會撐開flex盒模型的寬度,直到原始盒模型的width值,內容如果繼續增長,flex盒模型的寬度,不再增大,內容溢位。同時其他的子元素的flex盒模型重新計算佈局。
如果子元素的原始盒模型 < flex盒模型,那麼無上述效果。
(4)flex-basis