高級布局:文檔流、浮動布局、流式布局、定位布局、flex布局、響應布局
一、文檔流
1、什么是文檔流
將窗體自上而下分成一行一行,塊級元素從上至下、行內元素在每行中從左至右的順序依次排放元素
2、本質
文檔流本質是 nomal flow (普通流、常規流)
3、BFC(Block Formatting Contxt)
塊級格式化上下文,它是一個獨立的渲染區域,只有Block-level box參與,它規定了內部的Block-level Box如何布局,並且與這個區域外部毫不相干
4、BFC的規則
- 內部的Box會在垂直方向,一個接一個地放置;
- Box自身垂直方向的位置由margin-top決定,屬於同一個BFC的兩個相鄰Box的margin會發生重疊(取最大值);
- Box自身水平方向的位置由margin左或右決定(具體已經參照BFC方位),屬於同一個BFC的兩個相鄰Box的margin會發生疊加。
二、浮動布局
float: left | right
1、目的
float的目的是讓block同行顯示(在父級規定的寬度內、不完全脫離文檔流)
2、文檔流、完全脫離文檔流、不完全脫離文檔流
1、文檔流:子標簽在父級標簽沒有設置高度時,會自動撐開父級
2、完全脫離文檔流:子標簽不再為父級撐開高度,子標簽高於文檔流,不占用盒子模型的空間,有一個z-index
3、不完全脫離文檔流:這是浮動后的結果,不清浮動,不會撐開父級高度,清浮動后,會重新撐開父級高度
3、清浮動
(1)原因
在子級中使用浮動布局,若是父級有兄弟標簽,會出現布局問題
(2)解決方法
原理:在浮動布局情況下,讓父級獲得合適的高度
/*方法1. 浮動的父級設置高度*/ super { height: npx;
}
/*方法2. 浮動的父級設置overflow*/ super { overflow: hidden;
}
/*方法3. 浮動的父級兄弟設置clear,一般利用both同時清左右兩邊的浮動*/ brother { clear: left | right | both;
}
/*方法4. 浮動的父級偽類清浮動,一般利用both同時清左右兩邊的浮動*/ super:after { content: ""; display: block; clear: left | right | both;
}
三、流式布局
1、目的
讓布局脫離固定值限制,可以根據頁面情況改變相應發生改變
<style type="text/css"> .wrap { max-width: 1200px; min-width: 800px; width: 90%; height: 600px; margin: 0 auto; background-color: orange;
}
</style>
<div class="wrap"></div>
2、常用操作
- 百分比設置 % 參考最近父級
- 窗口比設置 vw | vh
- 字體控制 em | rem ,em最近設置字體大小的父級規定的字體大小,rem為html字體大小

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>流式布局</title> <style type="text/css"> html, body { width: 100%; margin: 0; } .box { /*百分比流式*/ /*參考最近父級*/ width: 90%; /*max-width: 1000px;*/ /*min-width: 600px;*/ /*窗口比*/ /*width: 90vw;*/ /*max-width: 1000px;*/ /*min-width: 600px;*/ height: 300px; background-color: orange; margin: 0 auto; } .b { width: 100px; height: 100px; background-color: red; border-radius: 50%; float: left; } body { font-size: 30px; } /*.sup { font-size: 20px; }*/ .txt { /*1em = 16px*/ /*font-size: 16px;*/ /*font-size: 0.4em;*/ /*總結:em為最近設置字體大小的父級規定的字體大小*/ font-size: 1rem; /*總結:rem為html字體大小*/ } html { font-size: 50px; } </style> </head> <body> <!-- 流式布局: --> <!-- 目的:讓布局脫離固定值限制,可以根據頁面情況改變相應發生改變 --> <div class="box"> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> <div class="b"></div> </div> <div class="sup"> <div class="txt">文本</div> </div> </body> </html>
四、定位布局
1、目的
讓目標(要被布局的)標簽在指定參考系下任意布局
2、語法
<!-- 基本語法: -->
<!-- 1.通過position設置定位是否開啟 -->
<!-- static:靜態,未定位(默認值) -->
<!-- relative: 相對定位, 未脫離文檔流 -->
<!-- absolute: 絕對定位, 完全脫離文檔流 -->
<!-- fixed: 固定定位, 完全脫離文檔流 -->
<!-- 2.定位開啟后,四個定位方位便會開啟,且四個方位均參與布局 -->
<!-- 如果發生沖突,左右取左,上下取上 -->
position: static | relative | absolute | fixed
布局方位:left | right | top | bottom
3、相對定位(relative)
未脫離文檔流,相對布局方位只改變盒子顯示區域,不改變盒子原有位置,
簡單的說相當於靈魂出竅,在原有位置仍然占一塊區域,margin-top改變會影響兄弟盒子
相對定位主要用於給父級定位,從而輔助子級的絕對定位
(1)開啟定位
position relative;
(2)方位布局,方位改變上盒子不會影響下盒子(靈魂出竅),四個方位如果發生沖突,左右取左,上下取上
left:30px;
top:30px;
(3)參考系
相對定位參考系為自身原有位置
(4)案例

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>相對定位</title> <style type="text/css"> div { width: 200px; height: 200px; background-color: red; } .b2 { background-color: orange; } /*不做定位操作*/ /*b1,b2均在文檔流中,b1的布局會影響到b2*/ /*.b1 { margin-top: 30px; margin-bottom: 30px; }*/ /*固定定位后*/ .b1 { /*1.未脫離文檔流*/ /*BFC規則下margin布局,上盒子依舊會影響下盒子*/ /*margin-top: 30px; margin-bottom: 30px;*/ /*開啟定位*/ position: relative; /*具有定位方位*/ /*2.方位布局下,上盒子不會影響下盒子*/ left: 30px; top: 30px; /*總結:方位布局只改變盒子顯示區域,不改變盒子原有位置*/ /*margin-top: 30px;*/ /*3.參考系:相對定位參考系為自身原有位置*/ /*right: 30px;*/ /*總結:方位布局就是 顯示區域上|下|左|右距離自身原始位置上|下|左|右的間隔*/ /*4.left=-right top=-bottom,同時存在,左右取左,上下取上*/ /*left: -30px; right: -100px;*/ } </style> </head> <body> <div class="b1"></div> <div class="b2"></div> </body> </html>
4、絕對定位(absolute)
完全脫離文檔流,有一個z-index可以控制兩個絕對定位的優先級,不在文檔流中占位,也永遠不會撐開父級高度,永遠不會影響兄弟布局,顯示層高於文檔流層
margin依舊可以影響自身布局,但不會影響兄弟布局,margin改變兄弟標簽布局不會改變
(1)開啟定位
position:absolute;
(2)定位布局
left:30px;
top:30px;
(3)參考系
最近的已定位的父級,sup(未定位) -> body(未定位) -> html(文檔窗口)
(4)案例

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>絕對定位</title> <style type="text/css"> div { width: 200px; height: 200px; background-color: red; } .b2 { background-color: orange; } .b1 { /*1.完全脫離文檔流*/ position: absolute; /*總結:不在文檔流中占位,也永遠不會撐開父級高度,永遠不會影響兄弟布局,顯示層高於文檔流層*/ /*打開定位方位*/ /*margin-left: 100px; margin-top: 100px;*/ /*總結:margin依舊可以影響自身布局,但不會影響父級即兄弟布局*/ /*2.參考系:?*/ left: 100px; right: -100px; /*3.同時存在,左右取左,上下取上*/ } </style> <style type="text/css"> .sup { width: 500px; height: 500px; background-color: orange; } .sub { width: 200px; height: 200px; background-color: red; } .sup { /*采用了盒模型布局*/ margin: 0 auto; /*需求:sub應該參考sup,sup需要定位:相對|絕對|固定*/ /*相對定位好處:父級不會脫離文檔流,滿足所有的盒模型布局*/ /*position: relative;*/ /*絕對定位好處:如果自身已經采用絕對定位布局了,那么子級一定參考自身進行定位*/ position: absolute; margin: 100px 100px; /*注:如果父級只是輔助子級進行絕對定位,那么一定優選相對定位,因為絕對定位會產生新的BFC,導致盒模型布局會受影響*/ /*注:margi-top|left依舊起作用,只是sup已經脫離文檔流,不會獲得到body寬度,所以auto沒有參考值*/ } .sub { /*2.參考坐標系為最近的定位父級*/ position: absolute; left: 0; right: 0; top: 0; /*父級: sup(未定位) -> body(未定位) -> html(文檔窗口)*/ /*3.同時存在,左右取左,上下取上*/ } </style> </head> <body> <!-- <div class="b1"></div> <div class="b2"></div> --> <div class="sup"> <div class="sub"></div> </div> </body> </html>
5、固定定位(fixed)
完全脫離文檔流,有一個z-index可以控制兩個絕對定位的優先級,不在文檔流中占位,也永遠不會撐開父級高度,永遠不會影響兄弟布局,顯示層高於文檔流層
margin依舊可以影響自身布局,但不會影響兄弟布局,margin改變兄弟標簽布局不會改變
(1)開啟定位
position:fixed;
(2)定位布局
left:30px;
top:30px;
(3)參考系
頁面窗口
(4)案例

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>固定定位</title> <style type="text/css"> .sup { width: 500px; height: 500px; background-color: orange; margin: 0 auto; } .sub { width: 200px; height: 200px; background-color: red; } .sup { position: relative; position: absolute; } .sub { position: fixed; left: 0; /*top: 0;*/ bottom: 0; } </style> </head> <body> <!-- 固定定位 --> <!-- 1.完全脫離文檔流 --> <!-- 2.參考系為文檔窗口 --> <!-- 3.左右取左,上下取上 --> <div class="sup"> <div class="sub"></div> </div> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> <br> </body> </html>
五、flex布局
1、目的
Flex是Flexible Box的縮寫,意為”彈性布局”,用來為盒狀模型提供最大的靈活性。設為Flex布局以后,子元素的float、clear和vertical-align屬性將失效。
flex可以很好的解決垂直居中問題
2、名詞概念
-
-
水平為軸(main axis),主軸的開始位置(與邊框的交叉點)叫做main start,結束位置叫做main end。
-
垂直為交叉軸(cross axis),交叉軸的開始位置叫做cross start,結束位置叫做cross end。
-
3、容器屬性
1. flex-direction 屬性 決定主軸的方向(即項目的排列方向)
flex-direction: row | row-reverse | column | column-reverse;
row(默認值):主軸為水平方向,起點在左端。
row-reverse:主軸為水平方向,起點在右端。
column:主軸為垂直方向,起點在上沿。
column-reverse:主軸為垂直方向,起點在下沿。
2. flex-wrap 屬性 定義,如果一條軸線排不下,如何換行。
flex-wrap: nowrap | wrap | wrap-reverse;
nowrap(默認):不換行。
wrap:換行,第一行在上方。
wrap-reverse:換行,第一行在下方。
3. flex-flow 屬性 是flex-direction屬性和flex-wrap屬性的簡寫形式,默認值為row nowrap。
flex-flow: <flex-direction> <flex-wrap>;
4. justify-content 屬性 定義了項目在主軸上的對齊方式。
justify-content: flex-start | flex-end | center | space-between | space-around;
5. align-items 屬性 定義項目在交叉軸上如何對齊。
align-items: flex-start | flex-end | center | baseline | stretch;
6. align-content 屬性 定義了多根軸線的對齊方式。如果項目只有一根軸線,該屬性不起作用。
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
4、項目屬性
1. order 屬性 定義項目的排列順序。數值越小,排列越靠前,默認為0。 order: <integer>; 2. flex-grow 屬性 定義項目的放大比例,默認為0,即如果存在剩余空間,也不放大。 flex-grow: <number>; /* default 0 */ 3. flex-shrink 屬性 定義了項目的縮小比例,默認為1,即如果空間不足,該項目將縮小。 flex-shrink: <number>; /* default 1 */ 4. flex-basis 屬性 定義了在分配多余空間之前,項目占據的主軸空間(main size)。 flex-basis: <length> | auto; /* default auto */ 5. flex 屬性 是flex-grow, flex-shrink 和 flex-basis的簡寫,默認值為0 1 auto。后兩個屬性可選。 flex: <flex-grow> <flex-shrink> <flex-basis> 6. align-self 屬性 允許單個項目有與其他項目不一樣的對齊方式,可覆蓋align-items屬性。默認值為auto,表示繼承父元素的align-items屬性,如果沒有父元素,則等同於stretch。 align-self: auto | flex-start | flex-end | center | baseline | stretch;
5、主要了解
1.將父級display屬性設置為flex,則父級成為container,子級成為item
2.container設置item的排列方向flex-direction
3.item對於container的空間占比flex-grow
6、案例

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>flex布局</title> <style type="text/css"> .container { width: 600px; height: 600px; border: 1px solid black; margin: 0 auto; } .item { /*width: 200px;*/ /*height: 200px;*/ /*border-radius: 50%;*/ background-color: orange; font-size: 80px; } /*容器:規定容器為flex,則容器內的標簽會成為該容器的項目(item)*/ .container { display: flex; } .item { /*默認只能一行排列,所有item總寬不允許超出container寬度*/ /*width: 300px;*/ /*默認情況下item可以不規定高度,高度會自適應父級*/ /*item沒有設置寬度下,可以通過flex-grow決定對於父級的占比*/ } /*.it1, .it3 { flex-grow: 1; } .it2 { flex-grow: 3; background-color: pink }*/ /*container屬性*/ .container { /*flex-direction: row | row-reverse | column | column-reverse; 方向*/ /*flex-direction: column-reverse;*/ /*flex-wrap: nowrap | wrap | wrap-reverse;換行方式*/ /*flex-wrap: wrap;*/ /*justify-content: flex-start | flex-end | center | space-between | space-around;水平對齊方式*/ /*item為沾滿父級區域*/ justify-content: space-around; } /*item屬性*/ .item { /*width: 300px; height: 200px;*/ } .item { width: 100px; } </style> <!-- 總結 --> <!-- 1.將父級display屬性設置為flex,則父級成為container,子級成為item --> <!-- 2.container設置item的排列方向flex-direction --> <!-- 3.item對於container的空間占比flex-grow --> </head> <body> <div class="container"> <div class="item it1">1</div> <div class="item it2">2</div> <div class="item it3">3</div> </div> </body> </html>
六、響應式布局
當響應式布局中樣式塊起作用時,會與正常樣式塊設置協同布局,遵循選擇器的優先級規則
1、目的
設置在不同頁面寬度下的布局,滿足當前屏幕尺寸時,該樣式塊起作用,不滿足時,則樣式塊失效
2、語法
/*當頁面尺寸小於<integer>寬度時的樣式*/ @media only screen and (max-width: <integer>) { selector { } } /*當頁面尺寸大於<integer1>寬度,小於<integer2>寬度時的樣式*/ @media only screen and (min-width: <integer1>) and (max-width: <integer2>) { selector { } } /*當頁面尺寸大於於<integer3>寬度時的樣式*/ @media only screen and (min-width: <integer>) { selector { } }
3、原則
(1)采用響應式布局的頁面,基本樣式塊只做共性樣式設置,需要根據頁面尺寸進行適應變化的樣式均有響應式布局處理
(2)要進行響應式布局的頁面要處理所有屏幕尺寸下的樣式塊
4、案例

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>響應式布局</title> <style type="text/css"> /*基本樣式塊*/ /*.box { max-width: 1200px; width: 95%; margin: 0 auto; background-color: red!important; } .it { width: 300px; height: 300px; font: 900 50px/300px 'STSong'; text-align: center; float: left; border-radius: 50%; background-color: orange; } .box:after { content: ""; display: block; clear: both; }*/ html, body { margin: 0; } .it { height: 300px; background-color: orange; font: 900 50px/300px 'STSong'; text-align: center; border-radius: 50%; float: left; } .box:after { content: ""; display: block; clear: both; } /*屏幕寬度超出1200px*/ @media only screen and (min-width: 1200px) { .box { background-color: pink; } .it { width: 25%; } } /*屏幕寬度間於600至1200px*/ @media only screen and (min-width: 600px) and (max-width: 1200px) { .box { background-color: brown; } .it { width: 30%; margin: 0 calc(10% / 6); } } /*屏幕寬度小於600px*/ @media only screen and (max-width: 600px) { .box { background-color: cyan; } .it { width: 80%; margin-left: 10%; min-width: 300px; } } </style> </head> <body> <div class="box"> <div class="it">1</div> <div class="it">2</div> <div class="it">3</div> <div class="it">4</div> <div class="it">5</div> <div class="it">6</div> <div class="it">7</div> <div class="it">8</div> <div class="it">9</div> <div class="it">10</div> <div class="it">11</div> <div class="it">12</div> </div> </body> </html>