伸縮布局
傳統布局和伸縮布局
- 布局的傳統解決方案,基於盒裝模型,依賴display屬性+position屬性+float屬性
- 對於特殊布局非常不便
- CSS3在布局方面做了非常大的改進
- 使得我們對塊級元素的布局排列變得十分靈活,適宜性非常強
- 其強大的伸縮性,在響應式開發中發揮極大的作用
重要屬性
display: flex;
- 給父元素設置了這個屬性,其子元素都會自動的變成伸縮項(flex item)
justify-content
-
justify-content
-
設置或檢索彈性盒子元素在主軸(默認橫軸)方向上的對其方式
-
語法:
flex-start
彈性盒子元素向行起始位置對齊flex-end
彈性盒子元素向行結束位置對齊center
彈性盒子元素向行中間位置對齊space-between
左右對其父容器的開始和結束,中間平均分頁,產生相同的間距space-around
將多余的空間平均的分頁在每一個子元素的兩邊- 類似於magin: 0 auto;
- 造成中間盒子的間距時左右兩邊盒子間距的兩倍
-
代碼演示
- 首先創建一個父容器包裹四個子容器
<div class="father"> <div class="one"></div> <div class="two"></div> <div class="three"></div> <div class="four"></div> </div>
- 父元素設置
.father { width: 900px; height: 200px; border: 1px solid red; box-sizing: border-box; }
- 子元素寬高200px,顏色各不相同
- 然后給父元素添加屬性
display: flex;
- 下面是各種情況下的盒子排列
-
當子元素寬度和大於父容器寬度的時候,子元素會自動的平均收縮
- 將父元素高度設置為600px
- 在添加第五個盒子
- 第五個盒子並沒有擠下來,每個盒子都一樣大
- (900-2) / 5 = 179.6px
- 每個元素都在平均收縮,但可能並不是我們想要的結果
flex-flow
-
flex-flow:
=flex-wrap:
+flex-direction:
- 簡寫屬性
-
flex-wrap:
控制子元素是否換行顯示,默認不換行nowrap
不換行,仍然收縮顯示wrap
換行
wrap-reverse
翻轉(不常用)
-
flex-direction:
設置子元素的排列方向- 就是用來設置主軸(默認橫軸)方向
- 默認主軸方向是row
- 我們來試一下
- 默認主軸方向是row
- 值
row
水平方向排列,從左至右row-reverse
水平方向排列,從右至左column
垂直方向排列,從上至下column-reverse
垂直方向排列,從下至上
- 就是用來設置主軸(默認橫軸)方向
-
flex-grow:
可以來擴展子元素的寬度- 對子元素進行設置
flex-grow:
的默認值為0:說明子元素不會去占據剩余的空間- 具體是用來設置當前元素占據剩余空間的比例值
- 比例值計算 : (當前空間的
flex-grow
)/(所有兄弟元素的flex-grow
的和)
-
代碼演示
- 去掉4,5兩個盒子
- 給盒子1添加屬性
flex-grow:1
- 盒子1吸收掉了所有的剩余空間
- 給盒子1,2,3都添加屬性
flex-grow:1
- 三個盒子均等分了剩余空間
- 去掉4,5兩個盒子
flex-shrink
-
flex-shrink
定於收縮比例,通過設置的值來計算收縮空間- 默認值為1
- 值為1時,將不去承擔收縮比例
- 具體是用來設置當前元素收縮的比例值
- 比例值計算:(當前元素的
flex-shrink
)/(所有兄弟元素的flex-shrink
的和)
-
代碼演示
- 我們將父元素寬度改為500px
- 現在每個盒子都只有166px大小了
- 我們將盒子1設置屬性
flex-shrink:1
- 盒子並無變化,因為其默認值本來就是1
- 現在我們將盒子1設置屬性
flex-shrink:2
- 盒子1變成了149px大小
- 盒子2,3變成了174.5px
- 盒子1收縮程度占據了兩份,盒子2,3收縮程度占據了一份
- 現在我們將3個盒子屬性都設置為
flex-shrink:0
- 頁面發生了偽溢出(謹慎設置)
- 我們將父元素寬度改為500px
flex
flex
=flex-grow
+flex-shrink
+flex-basis
- 簡寫屬性
- 默認值為 0 1 auto
- 后兩個屬性為可選屬性
- flex一般是用來設置伸縮子項占據剩余空間的比例值(常用)
align-items
-
align-items
是設置子元素(伸縮項)在側軸方向上的對齊方式- 父元素設置的屬性
center
設置在側軸方向上居中對齊flex-start
設置在側軸方向上頂對齊flex-end
設置在側軸方向上底對齊stretch
拉伸- 讓子元素在側軸方向上進行拉伸,填充滿整個側軸方向,
- 注意盒子不要有高度值
baseline
文本基線
-
align-self
設置單個元素在側軸上的對齊方式 -
代碼演示
- 我們還是保留三個盒子,並將父元素寬度改為900px
- 父元素設置屬性
align-items:center
- 父元素設置屬性
align-items:flex-start
- 父元素設置屬性
align-items:flex-end
- 父元素設置屬性
align-items:stretch
,注意這里要把子元素的高度屬性移除掉
- 這里給三個盒子添加文字大小不一的文本
- 父元素設置屬性
align-items:baseline
- 接下來給單個元素設置屬性
- 給盒子1設置屬性
align-self:center
- 我們還是保留三個盒子,並將父元素寬度改為900px
-
最后獻上我用伸縮盒子做的新語義化元素的結構圖
-
改變big盒子大小里面的子元素會等比例縮小和變大
<div class="big">
<header>header</header>
<nav>nav</nav>
<div class="small">
<article>article
<section>section</section>
</article>
<aside>aside</aside>
</div>
<footer>footer</footer>
</div>
.big {
margin-left: 300px;
width: 500px;
height: 500px;
display: flex;
flex-direction: column;
border: 1px solid black;
text-align: center;
font-size: 2em;
}
header {
background-color: red;
width: 100%;
flex: 1;
}
nav{
background-color: yellow;
width: 100%;
flex: 1;
}
.small {
flex: 2;
display: flex;
}
article {
background-color: blue;
height: 100%;
flex: 3;
display: flex;
align-items: center;
justify-content: center;
}
section {
background-color: pink;
width: 50%;
height: 50%;
}
aside{
background-color: green;
height: 100%;
flex: 2;
}
footer{
width: 100%;
background-color: #008484;
flex: 1;
}
- 本人新學菜鳥一名,以上純屬我學習成果,不足之處請大家多多指教!