一、什麼是彈性盒
- 彈性盒子是
的一種新的布局模式,在移動端布局中應用廣泛。CSS3
-
彈性盒(CSS3
或Flexible Box
),是一種當頁面需要适應不同的螢幕大小以及裝置類型時確定元素擁有恰當的行為的布局方式。flexbox
- 引入彈性盒布局模型的目的是提供一種更加有效的方式來對一個容器中的子元素進行排列、對齊和配置設定空白空間。
二、flex布局
-
容器:采用flex
布局的元素的父元素;flex
-
項目:采用flex
布局的元素的父元素的子元素;flex
- 容器預設存在兩根軸:水準的主軸(
)和垂直的交叉軸(main axis
),主軸的開始位置叫做cross axis
,結束位置叫做main start
;交叉軸的開始位置叫做main end
,結束位置叫做cross start
。項目預設沿主軸排列。cross end
- 作用:控制它的所有兒子輩子元素。(注意隻對兒子輩子元素生效)
- 特點:
- 1、彈性盒子裡面的兒子輩子元素都可以添加大小
- 2、如果想讓彈性盒子裡的一個子元素左右上下居中,隻需要給子元素添加
;margin:auto
- 3、彈性盒裡的子元素都是沿着"主軸"排列的。“主軸”:可以為x軸也可以是y軸,當x為主軸時,y就為側軸(預設x為主軸)
- 4、設為
布局以後,子元素的flex
、float
和clear
屬性将失效。vertical-align
三、觸發彈性盒
- 給父元素添加
display:flex / inline-flex;
-
:獨占一行的彈性盒flex
-
:行内彈性盒inline-flex
-
四、彈性盒容器屬性
【注】彈性盒容器屬性都是給父元素添加的。
1、改變主軸的方向: flex-direction
flex-direction
-
:x軸為主軸(預設值)row
-
:以x軸為主軸,反向排列,以末端為起始點row-reverse
-
:y軸為主軸column
-
:以y軸為主軸,反向排列,以末端為起始點column-reverse
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<style>
section {
width: 600px;
height: 600px;
background: pink;
margin: 100px auto;
/* 觸發彈性盒:給父元素添加 */
display: flex;
/* 控制主軸的方向為y軸 */
flex-direction: column;
}
span {
width: 100px;
height: 100px;
line-height: 100px;
color: #fff;
background: skyblue;
border-radius: 100%;
text-align: center;
}
</style>
</head>
<body>
<section>
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
<span>5</span>
<span>6</span>
</section>
</body>
</html>
↑↑↑左圖為預設主軸x軸,右圖為更改了主軸方向為y軸。
2、改變主軸的對齊方式: justify-content
justify-content
-
:在起始點對齊(預設)flex-start
-
:在末端對齊flex-end
-
:居中center
-
:兩端對齊space-between
-
:自動配置設定間距(等于給子元素兩端加了margin)space-around
section {
width: 600px;
height: 600px;
background: pink;
margin: 100px auto;
/* 觸發彈性盒 */
display: flex;
/* 控制主軸的對齊方式 */
justify-content: flex-start;
}
↑↑↑主軸對齊方式(此例主軸預設為x軸)
3、改變側軸的對齊方式: align-items
align-items
-
:側軸開始的位置對齊flex-start
-
:側軸結束的位置對齊flex-end
-
:側軸居中的位置center
-
:基線對齊(同baseline
)flex-start
-
:預設值。在子元素未設定寬(y軸)或高(x軸)的情況下,是拉伸狀态stretch
section {
width: 600px;
height: 600px;
background: pink;
margin: 100px auto;
/* 觸發彈性盒 */
display: flex;
/* 控制主軸的對齊方式 */
justify-content: space-around;
/* 控制側軸的對齊方式 */
align-items: center;
}
↑↑↑側軸對齊方式(此例主軸預設為x軸)
section {
width: 400px;
height: 200px;
background: pink;
margin: 100px auto;
/* 觸發彈性盒 */
display: flex;
/* 控制主軸的對齊方式 */
justify-content: space-around;
/* 控制側軸的對齊方式 */
align-items: stretch;
}
span {
width: 50px;
/* 不設高 */
/* height: 50px; */
line-height: 50px;
color: #fff;
background: skyblue;
border-radius: 100%;
text-align: center;
}
↑↑↑側軸對齊方式為
stretch
時,不設高,為拉伸狀态(此例主軸預設為x軸)
4、控制子元素是否換行: flex-wrap
flex-wrap
- 預設情況:彈性盒不會讓子元素換行
- 1、當子元素沒有内容隻有寬高時,添加
個子元素都不會溢出,而是重新計算寬高n
- 2、當子元素有内容且内容超出父元素時,子元素溢出
- 1、當子元素沒有内容隻有寬高時,添加
-
:不換行nowrap
-
:換行wrap
-
:反向換行(從主軸開始的地方排列反向)wrap-reverse
section {
width: 400px;
height: 200px;
background: pink;
margin: 100px auto;
/* 觸發彈性盒 */
display: flex;
/* 控制換行 */
flex-wrap: wrap;
}
span {
width: 100px;
height: 100px;
line-height: 50px;
color: #fff;
background: skyblue;
border-radius: 100%;
text-align: center;
}
<body>
<section>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</section>
</body>
↑↑↑左圖未換行,子元素變形;右圖設定了換行
5、控制行與行之間的對齊方式: align-content
align-content
-
:預設狀态:行與行之間不存在預設的行間距flex-start
-
:在末端對齊flex-end
-
:居中center
-
:兩端對齊space-between
-
:自動配置設定間距(等于給子元素兩端加了margin)space-around
section {
width: 400px;
height: 400px;
background: pink;
margin: 100px auto;
/* 觸發彈性盒 */
display: flex;
/* 控制主軸的對齊方式 */
justify-content: space-around;
/* 控制換行 */
flex-wrap: wrap;
/* 控制行與行的對齊方式 */
align-content: flex-start;
}
span {
width: 100px;
height: 100px;
line-height: 50px;
color: #fff;
background: skyblue;
border-radius: 100%;
text-align: center;
}
五、彈性盒項目屬性
【注】彈性盒項目屬性都是給子元素添加的。
1、控制子元素的側軸對齊方式: align-self
align-self
-
:預設值。元素繼承了它的父容器的 align-items 屬性。如果沒有父容器則為stretchauto
-
:元素被拉伸以适應容器。stretch
-
:元素位于容器的中心。center
-
:元素位于容器的開頭。flex-start
-
:元素位于容器的結尾。flex-end
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<style>
section {
width: 600px;
height: 400px;
background: pink;
margin: 100px auto;
/* 觸發彈性盒 */
display: flex;
}
div {
width: 100px;
height: 100px;
}
div:nth-child(1) {
background: skyblue;
/* 控制自身側軸對齊 */
align-self: flex-start;
}
div:nth-child(2) {
background: purple;
align-self: flex-end;
}
div:nth-child(3) {
background: orangered;
align-self: center;
}
</style>
</head>
<body>
<section>
<div>1</div>
<div>2</div>
<div>3</div>
</section>
</body>
</html>
2、控制子元素的排序: order
order
-
排序優先級,數字越大越往後排,預設為0,支援負數。order:number;
<style>
section {
width: 600px;
height: 400px;
background: pink;
margin: 100px auto;
/* 觸發彈性盒 */
display: flex;
}
div {
width: 100px;
height: 100px;
}
div:nth-child(1) {
background: skyblue;
/* 控制自身側軸對齊 */
align-self: flex-start;
/* 控制排序 */
order: 2;
}
div:nth-child(2) {
background: purple;
align-self: flex-end;
/* 控制排序 */
order: 1;
}
div:nth-child(3) {
background: orangered;
align-self: center;
/* 設定寬度 */
/* width: 200px; */
}
</style>
↑↑↑數字越大,排在越後面
3、剩餘空間的配置設定
- 簡寫文法:
flex:1;
- 配置設定主軸剩餘空間
- 1、可以給某個子元素加
- 2、也可以給所有子元素加(意味着所有的子元素平均配置設定)
- 3、假設某個元素設定
意為該元素分到了剩餘空間的2份flex:2;
div {
width: 100px;
height: 100px;
}
div:nth-child(1) {
background: skyblue;
/* 控制自身側軸對齊 */
align-self: flex-start;
/* 配置設定剩餘空間:div1占2份 */
flex: 2;
}
div:nth-child(2) {
background: purple;
align-self: flex-end;
/* 控制排序 */
/* order: 1; */
/* 配置設定剩餘空間:div2占1份 */
flex: 1;
}
div:nth-child(3) {
background: orangered;
align-self: center;
/* 設定寬度 */
/* width: 200px; */
}
↑↑↑div1占剩餘空間(600-300)的2份,div2占剩餘空間的1份