1. Intro
(1) 兩種分類
- 固定寬度叹坦,一般為960/1000/1024 px
- 不固定寬度,靠文檔流原理布局 -> 用于手機
- 響應(yīng)式:PC上固定卑雁,手機上不固定
(2) 布局思路
- 從大到小
-
從小到大
(3) 前端底線
必須要先有設(shè)計稿才能寫代碼募书,手機版給手機版設(shè)計圖,PC版給PC版設(shè)計圖
(4) 常用草圖工具
2. float布局 - 專為IE布局
(1) 步驟
- 子元素上加
float: left/right
和width
ps. 使用float后子元素將脫離文檔流测蹲,所以父元素不會包裹他們 -> 設(shè)定父元素CSS -
父元素上加
.clearfix
父元素加class=clearfix
可以包裹所有float子元素莹捡,CSS設(shè)定為:
.clearfix::after {
content:'';
display: block;
clear: both;
}
(2) 注意
- 最后一個float元素可以不寫width自適應(yīng)寬度
- 使用float布局后不會再響應(yīng)式布局,flex是專為IE做的布局
- IE6扣甲、7存在bug篮赢,margin會變兩倍:可以加上margin數(shù)值減半;或加上
_margin
琉挖;或改成display: inline-block;
- float子元素上下margin不會合并
(3) 實踐運用
- 外邊框
outline: 1px solid green
不占像素启泣,可替代border使用 - 設(shè)定了width的塊級元素左右margin auto可以使其居中,如:
.content {
width: 800px;
margin-left: auto;
margin-right: auto;
}
- 導(dǎo)航欄CSS示例
*{margin: 0; padding: 0; border-sizing: border-box;} /*css reset*/
ul, ol {
lift-style: none; /*去掉列表樣式*/
}
img {max-width: 100%;}
.clearfix::after {
content: '';
display: block;
clear: both;
}
.logo {
background: grey;
display: inline-block; /*使div自動收窄*/
margin-top: 8px;
}
.logo > img {
width: 100px;
vertical-align: middle; /*使圖片溢出div部分消失*/
}
ul > li {
float: left;
padding: 4px 0.5em;
line-height: 32px;
}
ul {
display: inline-block; /*自動收窄div*/
}
header {
background: grey;
color: white;
}
-
平均布局:
公式:N x width + (N-1) x margin = total length
但因為放不下最后一個元素的margin示辈,最后一個元素會被擠到下一行
-> 解決辦法: 為所有子元素增加一個新的clearfix父元素寥茫,里面加上負(fù)marginmargin-right: -margin;
,這樣會為新的父元素向右增加容納的空間
3. flex布局
(1) 容器 container 父元素
- 使container變成flex:
display: flex;
- 控制item的流動方向(主軸) - 彈性流
默認(rèn):從左到右一字排開flex-direction: row
從右往左排:flex-direction: row-reverse
從上到下排列:flex-direction: column
從下到上排列:flex-direction: column-reverse
- 控制item換行
注意:彈性盒不會折斷顽耳,有多少空間就擠多少空間坠敷,會把其中的item寬度設(shè)置成width/N
默認(rèn)不折行flex-wrap: nowrap
折行:flex-wrap: wrap
反向折行:flex-wrap: wrap-reverse
- 控制item主軸對齊方式
默認(rèn)向開始位置擠:justify-content: flex-start;
向結(jié)尾位置擠:justify-content: flex-end;
居中:justify-content: center;
把空間放在間隙中(分散對齊):justify-content: space-between;
(在兩個item時等價于 第二個item使用margin: auto;
)
把空間放在周圍:justify-content: space-around;
空隙大小一致:justify-content: space-evenly;
- 控制item次軸對齊方式
item設(shè)定了高度:align-items: flex-start | center | flex-end | baseline
妙同,未設(shè)置高度可用 stretch (默認(rèn))
- 控制多行item對齊 -
align-content
-
flex-flow: row wrap
<=>flex-direction: row; flex-wrap: wrap;
(2) item 子元素
- 選擇器:
.item:first-child
第一個子元素
.item:nth-child(n)
第n個子元素
.item:last-child
最后一個子元素 - order 排序
默認(rèn)order都是0,如果改變了order會將子元素按order值從小到大排列膝迎,如order: 100;
會在order: 1;
后面 - flex-grow 分配多余空間
默認(rèn)為0粥帚,不分配多余空間
如下:如果有多余的空間,將其分成4分其中兩份給2號限次,1份給1號芒涡,1份給3號
.item:first-child {
flex-grow: 1;
}
.item:nth-child(2) {
flex-grow: 2
}
.item:last-child {
flex-grow: 1
}
常用導(dǎo)航欄設(shè)置flex-grow: 1
,多余空間都給導(dǎo)航欄
- flex-shrink 控制空間不夠時item的縮減比例卖漫,越大縮減越多
默認(rèn)為1:所有item縮減相同幅度
設(shè)為0:該item不能縮減费尽,由其他item貢獻(xiàn)縮減 - flex-basis 控制基準(zhǔn)寬度,默認(rèn)為auto
- flex縮寫:grow shrink basis
flex: 1 0 100px;
<=>flex-grow: 1; flex-shrink: 0; flex-basis: 100px
- align-self 改變個別item的對齊方式
(3) 實踐
- 平均布局時也需要負(fù)margin
- 手機一般不把寬度高度寫死羊始,最好用min-width/max-width或用百分?jǐn)?shù)
(4) flex 布局小游戲
4. Grid 布局
(1) 基本概念
- 適應(yīng)新世代瀏覽器旱幼,布局類似表格,常用于不規(guī)則布局
- 一維布局用flex突委,二維布局用grid
(2) Container & Item
- 成為grid container:
display: grid | inline-grid;
- 設(shè)置行和列寬度
設(shè)置各行列寬度柏卤,用空格分隔,如:
.container {
grid-template-columns: 40px 50px auto 50px 40px; /*行*/
grid-template-rows: 25% 100px auto; /*列*/
}
重復(fù)多次可以用 repeat(N, value), 如grid-template-columns: 40 repeat(3, 50);
grid-template是grid-template-rows和grid-template-columns的縮寫形式
比如說匀油,grid-template: 50% 50% / 200px;將創(chuàng)建一個具有兩行的網(wǎng)格缘缚,每一行占據(jù)50%,以及一個200像素寬的列敌蚜。
- 給行列取名
.container {
grid-template-columns: [col1] 40px [col2] 50px; /*行*/
grid-template-rows: [row1] 25% [row2] auto; /*列*/
}
- 設(shè)置item占位
a. 控制item占行占列桥滨,row/column 從哪行/哪列到哪行/哪列
正數(shù)從左到右從上到下,負(fù)數(shù)則從右到左從下到上
.a {
grid-row-start: 0;
grid-row-end:3;
grid-column-start: 0;
grid-column-end: 3;
}
b. 簡寫為grid-column: n1 / n2;
和grid-row: n1 / n2;
跨越n1列/行至n2列/行
c. 簡寫為grid-area
grid-area屬性接受4個由'/'分開的值:grid-row-start, grid-column-start, grid-row-end, 最后是grid-column-end
如:grid-area: 1 / 1 / 3 / 6;
d. span 關(guān)鍵字用于跨越多行/列
- free space - fr 份 (行列按比例分隔)
.container {
grid-template-columns: 1fr 2fr 1fr; /*行*/
grid-template-rows: 1fr 1fr; /*列*/
}
- grid-gap 設(shè)置每個item的上下左右間隔
- item的order屬性與flex item的order用法一致
- grd分區(qū):grid-template-areas
寫成矩陣的形式弛车,用雙引號表行齐媒,空格分隔表列,不同class自動認(rèn)領(lǐng)所占區(qū)域
-> 小技巧1 表所有item:.container > * {}
-> 小技巧2 占滿整個屏幕:min-height: 100vh;
.container {
min-height: 100vh;
display: grid;
grid-template-rows: 60px auto 60px;
grid-template-areas:
"header header header header"
"aside main . ad" /*"."點表示空置*/
"footer footer footer footer";
}
.container > header{
grid-area: header; /*會自動占滿"header"區(qū)域*/
}
......