1. 程式人生 > >文件流 and 佈局(浮動、流式、定位、相對、絕對、固定)

文件流 and 佈局(浮動、流式、定位、相對、絕對、固定)

目錄

1、概念

1、案例

一、文件流(normal flow)

1、概念

  本質為normal flow(普通流、常規流)將窗體自上而下分成一行一行,塊級元素從上至下、行內元素在每行中從左至右的順序依次排放元素。

注意:本質不存在文件流概念,當一個錯誤的概念被絕大數人認為是對的,那麼它就是對的

2、BFC(Block formatting context 塊格式化上下文)

  塊級格式化上下文:一個獨立的渲染區域,只有Block-level box(塊級盒)參與,它規定了內部的Block-level Box(塊級盒)如何佈局,並且與這個區域外部毫不相干。

 - 2.1一切皆為框

  •   div、h1 或 p 元素常常被稱為塊級元素。這意味著這些元素顯示為一塊內容,即“塊框”。
  •   與之相反,span 和 strong 等元素稱為“行內元素”,這是因為它們的內容顯示在行中,即“行內框”。
  •   可以使用 display屬性改變生成的框的型別,可以應用於所有標籤。   即,通過將 display 屬性設定為 block,可以讓行內元素(比如 <a> 元素)表現得像塊級元素一樣。   還可以通過把 display 設定為 none,讓生成的元素根本沒有框。這樣的話,該框及其所有內容就不再顯示,不佔用文件中的空間。

 - 2.2 無名塊框

  但是在一種情況下,即使沒有進行顯式定義,也會建立塊級元素。   類似於把一些文字新增到一個塊級元素(例div)的開頭,會建立塊級元素。如下,即使沒有把這些文字定義為段落,它也會被當作段落對待:

<div>
    <!--無名塊框 some text  -->
    some text
    <p>Some more text.</p>
</div>

  在這種情況下,這個框稱為無名塊框,因為它不與專門定義的元素相關聯。

  塊級元素的文字行也會發生類似的情況。假設有一個包含三行文字的段落。每行文字形成一個無名框。無法直接對無名塊或行框應用樣式,因為沒有可以應用樣式的地方(注意,行框和行內框是兩個概念)。但是,這有助於理解在螢幕上看到的所有東西都形成某種框。

3、BFC規則

① 內部的Box會在垂直方向,一個接一個地放置;
② Box自身垂直方向的位置由margin-top決定,屬於同一個BFC的兩個相鄰Box的margin會發生重疊;
③ Box自身水平方向的位置由margin左或右決定(具體依據參照BFC方位),屬於同一個BFC的兩個相鄰Box的margin會發生疊加。
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>文件流</title>
	<style type="text/css">
		.box {
			width: 200px;
			height: 200px;
			background-color: orange;

			/*預設BFC水平佈局方向:從左至右*/
			/*margin-left: 50px;*/

			/*更改BFC水平佈局方向:從右至左*/
            /*更改塊為右浮動,即從右往左計算距離,
             若向右移動則 margin-right: -50px;*/
			float: right;
			margin-right: -50px;
		}
		.b1 {
			width: 200px;
			height: 200px;
			background: red;
			margin-left: 10px;
		}
		.bb1, .bb2 {
			width: 50px;
			height: 50px;
			background: cyan;
			float: left;
		}
		.bb1 {
			margin-left: 20px;
			margin-right: 20px;
		}
		.bb2 {
			margin-left: 20px;
		}
	</style>
</head>
<body>
	<!-- b1與b2與box 同在一個區域 | bb1與bb2 同在一個區域 -->
	<div class="b1">
		<div class="bb1"></div>
		<div class="bb2"></div>
	</div>
	<div class="b2"></div>

    /*box用來實現BFC的水平佈局方式*/
	<div class="box"></div>
</body>
</html>

二、浮動佈局

1、浮動佈局概念

如下圖,當把框 1 向右浮動時,它脫離文件流並且向右移動,直到它的右邊緣碰到包含框的右邊緣:

CSS 浮動例項 - 向右浮動的元素

下圖中,當框 1 向左浮動時,它脫離文件流並且向左移動,直到它的左邊緣碰到包含框的左邊緣。因為它不再處於文件流中,所以它不佔據空間,實際上覆蓋住了框 2,使框 2 從檢視中消失

如果把所有三個框都向左移動,那麼框 1 向左浮動直到碰到包含框,另外兩個框向左浮動直到碰到前一個浮動框。

CSS 浮動例項 - 向左浮動的元素

下圖所示,如果包含框太窄,無法容納水平排列的三個浮動元素,那麼其它浮動塊向下移動,直到有足夠的空間。 如果浮動元素的高度不同,那麼當它們向下移動時可能被其它浮動元素“卡住”:

CSS 浮動例項 2 - 向左浮動的元素

2、基本語法

float: left | right

3、實現塊級元素的同行顯示(文字環繞效果)---- float:left

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>浮動佈局</title>
	<style type="text/css">
		.article {
			width: 300px;
			border: 1px solid black;
		}
		/*類eg 後代的img 設定寬度,設定塊級,靠左浮動*/
		.eg img {
			width: 148px;
			/*塊級:獨佔一行*/
			display: block;
			/*浮動後:可以同行顯示(只佔自身顯示區域)*/
			float: left;
		}
	</style>
</head>
<body>
	<!-- 解決的問題:讓block box同行顯示 -->
	<!-- eg:文字環繞 -->
	<div class="eg">
		<div class="article"><img src="w3c/img/icon2.png" alt="">文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字</div>
	</div>
</body>
</html>

4、實現塊級元素的同行顯示(佈局規則)---- left(從左往右),right(從右往左)

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>浮動佈局</title>
	<style type="text/css">

		/*設定父盒,背景橘色*/
		.sup {
			width: 300px;
			height: 300px;
			background-color: orange;
		}
		/*設定子盒樣式,紅色*/
		.sub {
			width: 100px;
			height: 100px;
			background-color: red;
			border-radius: 50%;
			font: 900 40px/100px 'STSong';
			text-align: center;
		}

		/*BFC橫向佈局規則為從左至右,且block box同行顯示(之間沒有間隔)*/
		/*注: 從左至右可以理解橫座標正方向為右*/
		.sub {
			float: left;
		}

		/*BFC橫向佈局規則為從右至左,且block box同行顯示(之間沒有間隔)*/
		/*注: 從右至左可以理解橫座標正方向為左*/
		.sub {
			/*float: right;*/
		}

	</style>
</head>
<body>
	<!-- 基本語法:float: left | right -->
	<div class="p2">
		<div class="sup">
			<div class="sub">1</div>
			<div class="sub">2</div>
		</div>
	</div>
</body>
</html>

5、父子、兄弟浮動陷阱:父盒未固定高度,存在顯示覆蓋問題(在不做清浮動情況下,父級不會獲取子級的高度)

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>浮動佈局</title>
	<style type="text/css">
		/*父盒,背景橘色*/
		.sp {
			width: 300px;
			background-color: orange;
		}
		/*子盒設定,紅色*/
		.sb {
			width: 100px;
			height: 100px;
			background-color: red;
			border-radius: 50%;
			font: 900 40px/100px 'STSong';
			text-align: center;

		/*設定子盒1、2 浮動佈局規則,從右往左*/
			float: left;
		}

		.sb:nth-child(2) {

			/*改變影象原生位置,文字和影象改變*/
			/*文字層次高於背景層次*/
			/*margin-top: -80px;*/
			
			/*2的背景只能遮擋1的背景,但不能遮擋1的文字*/
			/*background-color: pink;*/
			/*父級的高度最終決定於邏輯最後位置上的子級的盒子底端*/
		}

		
		/*當不設定父盒高,則導致顯示區域重疊,文字顯示正常*/
		/*設定文字寬高,黃綠色*/
		.br {
			width: 300px;
			/*height: 100px;*/
			background-color: yellowgreen;
		}
		/*設定父級剛好擁有存放所有子級的高度(合適高度),則顯示正常*/
		.sp {
			height: 100px;
		}
		/*總結(坑):當target標籤的內部有浮動的子級,target的兄弟標籤佈局會出現顯示異常*/
	</style>
</head>
<body>
	<!--浮動產生的問題:
		  父級未設定固定高度,不再撐開父級高度 -->
	<div class="sp">
		<div class="sb">1</div>
		<div class="sb">2</div>
	</div>
	<div class="br">1234512345123451234512345</div>
</body>
</html>

未設定父盒高度:,兄弟相容覆蓋

設定父盒高度,保證父級擁有存放子級的高度:兄弟正常顯示

6、清浮動(常見四種方法)

  • 目的:對父級所在容器中的Block-level Box佈局不產生影響

  • 原理(本質):在浮動佈局情況下,讓父級獲得合適的高度

① 浮動的父級設定高度
super {
    height: npx;
}
② 浮動的父級設定overflow
super {
    overflow: hidden;
}
③ 浮動的父級兄弟設定clear
brother {
    clear: left | right | both;
}
④ 浮動的父級偽類清浮動(最推薦)
super:after {
    content: "";
    display: block;
    clear: left | right | both;
}

注意:

  • 未脫離文件流:子標籤在父標籤未設定高度的情況下,會撐開父標籤高度
  • 脫離文件流:不對父級的高度進行改動
  • 不完全脫離文件流(浮動後):不清浮動,不撐開父高度;清浮動後,撐開父高度
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>清浮動</title>
	<style type="text/css">
		/*父盒,橘色*/
		.sup {
			width: 300px;
			background-color: orange;
		}
		/*子盒,紅色*/
		.sub {
			width: 100px;
			height: 100px;
			background-color: red;
			border-radius: 50%;
			font: 900 40px/100px 'STSong';
			text-align: center;
		}
		/*兄弟盒,粉色*/
		.br {
			width: 200px;
			height: 200px;
			background-color: pink;
		}
		/*子盒設定左浮動*/
		.sub {
			float: left;
		}

		/*清浮動的物件:用於浮動子級的父級 sup*/
		/*① 設定自身高度*/
		.sup {
			/*height: 100px;*/
		}

		/*② 設定自身overflow: hidden*/
		.sup {
			/*overflow: hidden;*/
		}

		/*③ 設定兄弟標籤的clear: left | right | both*/
		.s2 {
			/*設定s2的高度和浮動方式*/
			/*float: right;*/
			/*height: 50px;*/
		}
		.br {
			/*若清除了右浮動,則兄弟接在被清除的s2高度後*/
			/*clear: right;*/

			/*若清除了左浮動,則兄弟接在被清除的s1高度後*/
			/*clear:left;*/

			/*清楚了左右,則接在大的後面*/
			/*clear: both;*/
		}

		.br{
			/*display: block;*/
			/*clear: both;*/
		}

		/*④ 設定自身:after偽類*/
		/*設定父級後方偽類,相當於設定一個父類後的兄弟塊進行清除操作*/
		.sup:after {
			content: "";
			display: block;
			clear: both;
		}
	</style>
</head>
<body>
	<div class="sup">
		<div class="sub s1">1</div>
		<div class="sub s2">2</div>
	</div>
	<div class="br"></div>
</body>
</html>

----->>清浮動後---->>

三、流式佈局(大小跟隨變化而變化)

1、案例

<!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>

2、流式佈局相關操作

① 百分比設定(基於父級的長寬) %
② 視窗比設定(基於視窗的長寬) vw | vh
③ 字型控制 em | rem

四、定位佈局(position)

1、position屬性

  • static(靜態,預設值) 元素框正常生成。塊級元素生成一個矩形框,作為文件流的一部分,行內元素則會建立一個或多個行框,置於其父元素中。
  • relative(相對) 元素框偏移某個距離。元素仍保持其未定位前的形狀,它原本所佔的空間仍保留。
  • absolute(絕對) 元素框從文件流完全刪除,並相對於其包含塊定位。包含塊可能是文件中的另一個元素或者是初始包含塊。元素原先在正常文件流中所佔的空間會關閉,就好像元素原來不存在一樣。元素定位後生成一個塊級框,而不論原來它在正常流中生成何種型別的框。
  • fixed(固定) 元素框的表現類似於將 position 設定為 absolute,不過其包含塊是視窗本身。

提示:相對定位實際上被看作普通流定位模型的一部分,因為元素的位置相對於它在普通流中的位置。

注意:若發生定位衝突,則左右取左,上下取上

2、定位的語法

position: static | relative | absolute | fixed; 佈局方位:left | right | top | bottom

屬性 描述
position 把元素放置到一個靜態的、相對的、絕對的、或固定的位置中。
top 定義了一個定位元素的上外邊距邊界與其包含塊上邊界之間的偏移。
right 定義了定位元素右外邊距邊界與其包含塊右邊界之間的偏移。
bottom 定義了定位元素下外邊距邊界與其包含塊下邊界之間的偏移。
left 定義了定位元素左外邊距邊界與其包含塊左邊界之間的偏移。
overflow 設定當元素的內容溢位其區域時發生的事情。
clip 設定元素的形狀。元素被剪入這個形狀之中,然後顯示出來。
vertical-align 設定元素的垂直對齊方式。
z-index 設定元素的堆疊順序。

3、相對定位(relative)

  • ① 未脫離文件流:元素仍保持其未定位前的形狀,它原本所佔的空間仍保留。
  • ② 以自身原有位置作為參考座標系
<!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 {
			
			/*開啟定位*/
			position: relative;

			/*1.未脫離文件流*/
			/*BFC規則下margin佈局,上盒子依舊會影響下盒子*/
			/*改變盒子的原有位置*/
			/*margin-top: 30px;
			margin-bottom: 30px;*/

			/*2.方位佈局下,上盒子不會影響下盒子*/
			/*3.參考自身原有位置進行移動*/
			/*4.left=-right、top=-bottom,同時存在,左右取左,上下取上*/
			left: 30px;
			top: 30px;
			/*right: 30px;*/
			bottom: 30px;


			/*總結:
			1、方位佈局只改變盒子顯示區域,不改變盒子原有位置
			2、方位佈局就是、顯示區域上|下|左|右距離自身原始位置上|下|左|右的間隔*/

		}
	</style>
</head>
<body>
	<div class="b1"></div>
	<div class="b2"></div>
</body>
</html>

4、絕對定位(absolute)

  • ① 脫離文件流:元素框從文件流完全刪除,並相對於其包含塊定位。
  • ② 以最近定位父級作為參考座標系
<!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: 300px;*/
			/*top: 90px;*/
			/*bottom:100px;*/

			/*3.同時存在,左右取左,上下取上*/
		}


	</style>
</head>
<body>
	<div class="b1"></div>
	<div class="b2"></div>
</body>
</html>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>絕對定位</title>
	<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: 100;
			right: 0;
			top: 0;
			/*父級: sup(未定位) -> body(未定位) -> html(文件視窗)*/

			/*3.同時存在,左右取左,上下取上*/
		}
	</style>
</head>
<body>
	<div class="sup">
		<div class="sub"></div>
	</div>
</body>
</html>

5、固定定位(fixed) --小廣告

  • ① 脫離文件流
  • ② 以文件視窗作為參考座標系
<!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*100+tab
</body>
</html>

6、z-index