2020-12-04 CSS 布局:float待诅、flex 和 grid

1. Intro

(1) 兩種分類

  • 固定寬度叹坦,一般為960/1000/1024 px
  • 不固定寬度,靠文檔流原理布局 -> 用于手機
  • 響應(yīng)式:PC上固定卑雁,手機上不固定

(2) 布局思路

  • 從大到小
  • 從小到大


    用CSS布局.png

(3) 前端底線

必須要先有設(shè)計稿才能寫代碼募书,手機版給手機版設(shè)計圖,PC版給PC版設(shè)計圖

(4) 常用草圖工具


2. float布局 - 專為IE布局

(1) 步驟

  • 子元素上加float: left/rightwidth
    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ù)margin margin-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;
主軸對齊.png
  • 控制item次軸對齊方式
    item設(shè)定了高度:align-items: flex-start | center | flex-end | baseline妙同,未設(shè)置高度可用 stretch (默認(rèn))
次軸對齊.png
  • 控制多行item對齊 - align-content
多行對齊.png
  • 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的對齊方式
align-self.png

(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; /*列*/
}
Grid行列分布.png
  • 設(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;

grid-area demo.png

d. span 關(guān)鍵字用于跨越多行/列

span demo1.png

span demo2.png

  • 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ū)域*/
}
......
grid分區(qū)demo.png

(3) grid布局小游戲

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載帅韧,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者里初。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忽舟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淮阐,老刑警劉巖叮阅,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泣特,居然都是意外死亡浩姥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門状您,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勒叠,“玉大人兜挨,你說我怎么就攤上這事∶蟹郑” “怎么了拌汇?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弊决。 經(jīng)常有香客問我噪舀,道長,這世上最難降的妖魔是什么飘诗? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任与倡,我火速辦了婚禮,結(jié)果婚禮上昆稿,老公的妹妹穿的比我還像新娘纺座。我一直安慰自己,他們只是感情好溉潭,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布净响。 她就那樣靜靜地躺著,像睡著了一般岛抄。 火紅的嫁衣襯著肌膚如雪别惦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天夫椭,我揣著相機與錄音掸掸,去河邊找鬼。 笑死蹭秋,一個胖子當(dāng)著我的面吹牛扰付,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仁讨,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼羽莺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洞豁?” 一聲冷哼從身側(cè)響起盐固,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丈挟,沒想到半個月后刁卜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡曙咽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年蛔趴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片例朱。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡孝情,死狀恐怖鱼蝉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情箫荡,我是刑警寧澤魁亦,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站菲茬,受9級特大地震影響吉挣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婉弹,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一睬魂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镀赌,春花似錦氯哮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至良姆,卻和暖如春肠虽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背玛追。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工税课, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痊剖。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓韩玩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陆馁。 傳聞我的和親對象是個殘疾皇子找颓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容