關於清除浮動

上篇博客列舉了浮動的幾個栗子,並且說明了浮動佈局帶來的問題,那麼如何解決呢,關於清除浮動,

解決思路有兩種:

1.利用clear屬性,清除浮動

2.使父元素容器形成BFC

先來看看如何利用clear屬性清除浮動:

語法:

clear:both | left | right 

具體方法:通過在浮動元素末尾添加一個空的標籤例如:

<div class="parent">
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <div class="child"></div>
  <br class="cb">
</div>

.child {
  width: 25%;
  height: 50px;
  float: left;
  _display: inline;
}
.cb {
  clear: both;
}

<div style=”clear:both”></div>,其他標籤br等亦可。

加上_display: inline是爲了兼容IE6。

再看一個栗子這裏有兩個div均設置了左浮動:


 對於CSS的清除浮動(clear),一定要牢記:這個規則只能影響使用清除的元素本身,不能影響其他元素。

就拿上邊的例子來說,我們想讓div2移動,但卻是在div1元素的CSS樣式中使用了清除浮動,試圖通過清除div1右邊的浮動元素(clear:right;)來強迫div2下移,這是不可行的,因爲這個清除浮動是在div1中調用的,它只能影響div1,不能影響div2。

因此,要想讓div2下移,就必須在div2的CSS樣式中使用浮動。本例中div2的左邊有浮動元素div1,因此只要在div2的CSS樣式中使用clear:left;來指定div2元素左邊不允許出現浮動元素,這樣div2就被迫下移一行。

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>float</title>
	<style>
		.div1{
			width: 100px;
			height: 100px;
			background-color: red;
			float: left;
		}
		.div2{
			width: 100px;
			height: 100px;
			background-color: green;
			float: left;
			clear:left;
		}
	</style>
</head>
<body>
	<div>
		<div class="div1">div1</div>
		<div class="div2">div2</div>
	</div>
</body>
</html>


那麼假如頁面中只有兩個元素div1、div2,它們都是右浮動呢?


推測一下如果要讓div2在div1下方顯示,是不是應該誒div2設置清理右浮動屬性呢?

binggo~~~

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>float</title>
	<style>
		.div1{
			width: 100px;
			height: 100px;
			background-color: red;
			float: right;
		}
		.div2{
			width: 100px;
			height: 100px;
			background-color: green;
			float: right;
			clear: right;
		}
	</style>
</head>
<body>
	<div>
		<div class="div1">div1</div>
		<div class="div2">div2</div>
	</div>
</body>
</html>
就是這樣的:

接下來說說清除浮動的第二種方法:


利用overflow:hidden;

我們都知道overflow:hidden;的意思是隱藏溢出元素內容的,它是怎麼可以實現清除浮動的呢?


知乎上有個作者如是說:

overflow:hidden 的意思是超出的部分要裁切隱藏掉
那麼如果 float 的元素不佔普通流位置
普通流的包含塊要根據內容高度裁切隱藏
如果高度是默認值auto
那麼不計算其內浮動元素高度就裁切
就有可能會裁掉float
這是反佈局常識的

所以如果沒有明確設定容器高情況下
它要計算內容全部高度才能確定在什麼位置hidden
浮動的高度就要被計算進去
順帶達成了清理浮動的目標
同理
overflow 非默認值
position 非默認值
float 非默認值
等都是遵循這個佈局計算思路
在此附上鍊接:點擊打開鏈接

總之呢,意思就是:要hidden必須得有個高度,但是你float之後元素脫離文檔流,不計算它的高度就裁掉了float,所以浮動的高度要被計算進去


恩,就這樣,overflow:hidden;在父元素上使用overflow: hidden達到清除浮動的效果,也可以是overflow: auto。可是通過overflow實現的清除浮動都有一個缺點,當子元素超出了父元素,父元素使用overflow: hidden的話,子元素超出的部分會被隱藏;使用overflow: auto的話,父元素上會出現滾動條,最後也別忘加上zoom: 1觸發IE的hasLayout。這樣就輕鬆實現了清除浮動



方法三:

:after僞類元素的實現方式:

先說原理:利用:after和:before來在元素內部插入兩個元素塊,從面達到清除浮動的效果。其實現原理類似於clear:both方法,只是區別在於:clear在html插入一個div.clear標籤,而outer利用其僞類clear:after在元素內部增加一個類似於div.clear的效果。下面來看看其具體的使用方法:

<pre name="code" class="javascript"> .outer {zoom:1;}    /*==for IE6/7 Maxthon2==*/
 .outer :after {
         clear:both;
         content:'.';
         display:block;
         width: 0;height: 0;
         visibility:hidden;
}/*==for FF/chrome/opera/IE8==*/



其中clear:both;指清除所有浮動;

content: '.';
display:block;對於FF/chrome/opera/IE8不能缺少,

其中content()可以取值也可以爲空。

visibility:hidden;的作用是允許瀏覽器渲染它,但是不顯示出來,這樣才能實現清除浮動。


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