1. 程式人生 > >CSS3——垂直定位的小bug(margin塌陷)

CSS3——垂直定位的小bug(margin塌陷)

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<style type="text/css">
			*{
				margin: 0;
				width: 0;
			}
			.demo1{
				/* margin-left: 100px;
				margin-top: 100px; */
				height: 100px;
				width: 100px;
				background-color: black;
			}
			.demo2{
				height: 50px;
				width: 50px;
				/* margin-left: 50px;
				margin-top: 50px; */
				background-color: green;
			}
		</style>
		<title></title>
	</head>
	<body>
		<div class="demo1">
			<div class="demo2"></div>
		</div>
		
	</body>
</html>

 

現在給得demo2的父級demo1設定margin-left: 100px;margin-top: 100px;demo1就會帶著他的兒子demo2移動成下面這樣:

下面再給demo2設定margin-left: 50px;demo1就會相對他的父親向右移動成下面這樣:

當你在設定demo2的margin-top: 50px;時候,你會驚奇的發現沒有什麼變化,就算我改成margin-top: 100px;他還是沒有變化!

你只有加到比他父親demo1的margin還大的時候,他才會帶著他的父親一起向下移動。比如demo2的margin-top: 150px;

這樣的現象叫作margin塌陷

垂直方向的margin,父子元素是結合到一起的,會取最大的margin移動。

 

怎樣解決呢?

首先很low的方法:

給demo2的父親demo1加個邊線,border-top: 1px solid red;

這種手法肯定不行,不專業吧,雖然是1培訓你看不出來,就是改成0.5px也不行。

 

 

專業的方法:——bfc

專業名詞:block format content(塊級格式化上下文)

CSS會把HTML的每一個元素都當成一個盒子,而且他進一步認為每一個盒子裡面都有一套渲染規則,就是你寫完這個程式碼,他會按照你寫得程式碼把這個東西繪製出來,bfc就是通過一些方法讓一個盒子或幾個盒子裡面的渲染規則發生改變(他只會改變一丁點,比如有1000條規則,bfc只會改變0.1條都不到,就是改變這一丁點,bfc就把margin塌陷給解決了)。

 

如何觸發一個盒子的bfc:

一:給盒子設定position: absolute;設定定位之後這個盒子就自然成了bfc元素了。

二:display: inline-block;

三:float: left/right;浮動

四:overflow: hidden;溢位部分隱藏

 

咱們先從第四個方法講起:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<style type="text/css">
			*{
				margin: 0;
				width: 0;
			}
			.demo1{
				margin-left: 100px;
				margin-top: 100px;
				height: 100px;
				width: 100px;
				background-color: black;
				/* overflow: hidden; */
			}
			.demo2{
				height: 50px;
				width: 50px;
				margin-left: 75px;
				/* margin-top: 150px; */
				background-color: green;
			}
		</style>
		<title></title>
	</head>
	<body>
		<div class="demo1">
			<div class="demo2"></div>
		</div>
		
	</body>
</html>

現在我把demo2的margin-top: 150px;註釋掉,再把demo2的margin-left改成75畫素,demo2就會出來,如下圖

我在給demo1加一個overflow: hidden;demo2在demo1外面的部分就會隱藏,如下:

overflow: hidden;叫做溢位盒子的部分隱藏。

現在我把demo2的margin-left改成50px;再加上margin-top: 150px;

你會發現demo2全部出了demo1,所以demo2就會被全部隱藏。現在我再把demo2的margin-top設定成50px;如下:

說明margin塌陷的問題已經解決了吧。

 

你把demo1的overflow: hidden;註釋掉,改成display: inline-block;也好使,改成position: absolute;也好使,都能觸發bfc,解決margin塌陷問題。

但是這個bug沒有完美的辦法解決,咱只能用一些方法來彌補,你會發現這些方法都能解決margin塌陷問題,到那時解決問題的同時他們也帶來的新的問題,比如overflow: hidden;,我裡面的內容就是想溢位盒子的,你加overflow: hidden;還合適嗎?不合適!還比如:我這個盒子就像好好的擺在那裡,後面的元素羅列在他的下面,到那時這個時候你為了解決margin塌陷你就加了一個position: absolute;,就不合適。有時候咱不想讓他變成inline-block,咱想讓他獨佔一行,也不行。這時候那個方法對你的需求沒影響,你就選擇使用那個方法。