高度塌陷和BFC

有的時候,某一個塊裏的內容很少,但是我們有將該塊寫死了,從而導致空了很大區域;亦或者一個塊的內容比較多,多到溢出。這些情況都是不美觀的。

我們設置border,這樣可以看到outer塊的區域,其高度隨着內容變化而變化:

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		<style>
			.outer{
				border:10px red solid;
			}
			.inner{
				background-color: green;
				width: 100px;
				height: 100px;
			}
		</style>
	</head>
	<body>
		<div class="outer">
			<div class="inner">
			</div> 
		</div>
	</body>
</html>

 

 

但是,有的時候outer裏不只是放一個塊,要排列好幾個水平塊,這就要用到子元素浮動了。浮動真的可以解決我們的需求嗎?

下面對inner設置浮動。

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		<style>
			.outer{
				border:10px red solid;
			}
			.inner{
				background-color: green;
				width: 100px;
				height: 100px;
				float: left;
			}
		</style>
	</head>
	<body>
		<div class="outer">
			<div class="inner">
			</div> 
		</div>
	</body>
</html>

由於浮動是不佔位置的,故outer的內容就沒有,無法被撐開。拋開這個弊端,我們來看其是否對網頁的其他排版造成影響呢?

 

我們加一個outer2塊:

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		<style>
			.outer{
				border:10px red solid;
			}
			.inner{
				background-color: green;
				width: 100px;
				height: 100px;
				float: left;
			}
			.outer2{
				background-color: pink;
				width: 100px;
				height: 100px;
			}
		</style>
	</head>
	<body>
		<div class="outer">
			<div class="inner">
			</div> 
		</div>
		<div class="outer2">
		</div>
	</body>
</html>

加了outer2塊後,我們可以看到outer2塊的位置移動了,說明父元素高度丟失以後,其下的元素會自動上移,這就是高度塌陷,導致頁面的混亂。因此此方式要摒棄。

 

如果將outer的display設置爲inline-block,雖然解決了高度的問題,但是border的寬度也會隨內容改變。

 

爲解決這個問題,我們要提到BFC(Block Formatting Context),塊級格式化環境。

-BFC 是css一個隱含的屬性,可以爲一個元素開啓BFC。開啓BFC該元素會變成一個獨立的佈局區域。

-元素開啓BFC後的特點:

        1.開啓BFC 的元素不會被浮動元素所覆蓋。

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		<style>
			.box1{
				width: 100px;
				height: 100px;
				background-color: #bfa;
				float: left;
			}
			.box2{
				width: 100px;
				height: 100px;
				background-color: pink;
				/*開啓了box2的BFC,box2不會被box1覆蓋。*/
				overflow: hidden;
			}
		</style>
	</head>
	<body>
		<div class="box1"></div>
		<div class="box2"></div>
	</body>
</html>

 

        2.開啓BFC的元素子元素和父元素外邊距不會重疊。

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		<style>
			.box1{
				width: 200px;
				height: 200px;
				background-color: #bfa;
				overflow: hidden;
			}
			.box3{
				width: 100px;
				height: 100px;
				background-color: pink;
				margin-top: 100px;
			}
		</style>
	</head>
	<body>
		<div class="box1">
			<div class="box3"></div>
		</div>
	</body>
</html>

 如果不開啓BFC的話,調整子元素,會導致父元素位置隨着變化,如下:

        3.開啓BFC的元素可以包含浮動的子元素。

-可以通過一些特殊方式來開啓元素的BFC:

        1.設置元素的浮動。(不推薦)

        2.將元素設置爲行內塊元素。

        3.將元素的overflow設置爲非visible的值。scroll帶滾動條,auto或者hidden不帶滾動條,可以將overflow設置爲auto或者hidden來開啓其BFC,這樣就可以包含浮動元素了。

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		<style>
			.outer{
				border:10px red solid;
				overflow: hidden;
			}
			.inner{
				background-color: green;
				width: 100px;
				height: 100px;
				float: left;
			}
			.outer2{
				background-color: pink;
				width: 100px;
				height: 100px;
			}
		</style>
	</head>
	<body>
		<div class="outer">
			<div class="inner">
			</div> 
		</div>
		<div class="outer2">
		</div>
	</body>
</html>

其實開啓BFC的方式非常多,overflow:hidden是其中副作用較小的一個。

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章