国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > CSS > 正文

CSS教程:總結清除浮動的方法

2024-07-11 08:21:10
字體:
來源:轉載
供稿:網友

作者:dudo

原文連接:http://www.dudo.org/article.asp?id=239

很多人都有研究閉合浮動元素的問題,但是解決方法卻不一樣,也并不是每一種方法都盡善盡美。閉合浮動元素(或者叫清除浮動)是web標準設計中經常會遇到的一個問題,因此,這里我想總結一下目前經常用到的幾種方法,并比較一下他們的易用性和適用環境。如果你有更好的方法不妨提出來大家一起討論。

問題的提出:

最簡單的一種情形就是我們把一個小的、固定寬度的div元素(比如導航、引用等)和其他元素內容一起包含在一個大的div中。比如下面這段代碼:

<div id="outer">    
  <div id="inner"> <h2>a column</h2> </div>    
  <h1>main content</h1>    
  <p>lorem ipsum</p>    
</div>

我們可以為“#inner”設定一個寬度值(比如說20%),但是由于div是塊級元素,即使我們設定了寬度,其后面的內容也只能在下一行中顯示,除非我們給它設定一個浮動屬性(無論是向左浮動或者向右浮動)。那么此時會產生我們上面提到的問題了。

如果“#inner”的寬度和高度都比“#outer”小,這不會有問題。

但是,如果“#inner”的高度超過了“#outer”,那么的底部就會超出“#outer”的底部。這是因為我們為“#inner”設定了float屬性后,它就會脫離的文本流,無論其寬度和高度怎么變化都不會使“#outer”跟隨變化。

例一:未清除浮動時的布局表現


[ctrl+a 全部選擇 提示:你可先修改部分代碼,再按運行]

在這個例子中,最開始由于“#inner”的高度小于“#outer”所以不會有問題,但是當你點擊“加長”后你會發現“#inner”的底邊已經超出了“#outer”的范圍,而“#outer”沒有發生改變。這就是我們所提到的“清除浮動(閉合浮動元素)”或者是“閉合浮動”問題

解決辦法:

1)額外標簽法

第一個,也是w3c推薦的方法就是使用額外標簽的辦法。這種方法就是在內容的末尾增加一個空的標簽,典型的做法就是使用類似

<br style="clear:both;" />

或者使用

<div style="clear:both;"></div>

這種辦法通過增加一個html元素迫使外部容器撐開。不過這個辦法會增加額外的標簽使html結構看起來不夠簡潔。

例二:使用空div閉合浮動元素


[ctrl+a 全部選擇 提示:你可先修改部分代碼,再按運行]

p.s. 我發現在internet explorer中(無論是6還是7)<br style="clear:both" />可以清除浮動,但是不能閉合浮動元素,在firefox中就沒有這個問題,不知道是什么原因?!

2)使用after偽類

使用after偽類和內容聲明在指定的現在內容末尾添加新的內容。經常的做法就是添加一個“點”,因為它比較小不太引人注意。然后我們再利用它來清除浮動(閉合浮動元素),并隱藏這個內容:

#outer:after{ 
    content:"."; 
    height:0; 
    visibility:hidden; 
    display:block; 
    clear:both;

但奇怪的是windows中的internet explorer 6及以下版本并不支持css 2.1中的after偽類而mac中的internet explorer卻可以正常使用,所以我們還要單獨針對win/ie進行處理。在區分win和mac中internet explorer的諸多方法中,最常用就是holly招數。holly招數的原理是這樣的,css代碼

/* 這段代碼只有ie/win可以看見 /*/
css 規則 
/* 結束hack */

上面的代碼中有兩行注釋,其中第一行結束時出現了反斜杠(/),在mac的internet explorer中會認為注釋并沒有結束,于是繼續向下直到第一個完事的“*/”出現,這中間的所有字符都被當作是注釋,而ie/win卻也只會把第一行和第三行看作是注釋,中間的為有效代碼。所以這樣就區分出來了不同平臺上的ie了。

正是基于以上原理,在windows的ie 6上的清理浮動,可以使用如下代碼:

#outer { 
    display:inline-block; 

/* holly hack begine /*/ 
* html #outer { 
    height:1%; 

#outer { 
    display:block; 

/* end hack */

例三:使用:after偽類清理浮動


[ctrl+a 全部選擇 提示:你可先修改部分代碼,再按運行]

p.s. 如果你不考慮 ie6/mac用戶的話你只需要寫* html #outer {height:1%;}即可。

另外,似乎在internet explorer 7中不高display:inline-block也不好使。因此要使用最完整的hack招數。

如果你對如何使用css 2中的偽類不熟悉的話,推薦你先閱讀一下“細說css樣式選擇符——css 2.1 selectors(1)、(2)、(3)”

3)浮動外部元素,float-in-float

這種方法很簡單,就是把“#outer”元素也進行浮動(向左或者向右)。

例子

但是這種方法帶來的別外一個問題就是和“#outer”相鄰的下一個元素會受到“#outer”的影響位置會產生變化,所以使用這種方法一定要小心。有選擇把頁面中的所有元素都浮動起來,最后使用一個適當的有意義的元素(比如頁腳)進行清理浮動,這有助于減少不必要的標記,但是過多的浮動會增加布局的難度。

例四:float-in-float


[ctrl+a 全部選擇 提示:你可先修改部分代碼,再按運行]

4)設置overflow為hidden或者auto

把“#outer”的屬性overflow值設置為hidden或者auto同樣可以清理浮動

這種方法不需要添加額外的標記。但是使用overflow的時候一定要小心,因為它會瀏覽器的表現。另外,在internet explorer 6中單純地設置overflow為hidden或者auto并不能有效清除浮動(閉合浮動元素),還要指定“#outer”的一個維度,即要么給它指定一個寬度,要么指定一個高度:

#outer {
    overflow:auto;
    width:100%;
}

注意:如果你要在ie5/mac上使用這種方法清除浮動(閉合浮動元素)的話,你就必須設定overflow的屬性為值為hidden。

例五:overflow:hidden


[ctrl+a 全部選擇 提示:你可先修改部分代碼,再按運行]

比較與選擇

四種方法中使用哪種最好呢?首先,不推薦使用after偽類,對比其它三種方法,holly招數有點太煩瑣,不好掌握,我上面講到的holly招數中并不僅僅是ie/win上有問題,當出現:hover時還會有其它問題,所以我們又加上了inline-block等屬性,也就是說這種方法存在更多的不確定性。推薦對代碼有“潔癖”并且技術較高的人使用。
    那么其它三種方法其實都可以考慮。

不過使用overflow的時候,可能會對頁面表現帶來影響,而且這種影響是不確定的,你最好是能在多個瀏覽器上測試你的頁面;

而對于使用額外標簽清除浮動(閉合浮動元素),是w3c推薦的做法。至于使用<br />元素還是空<div></div>可以根據自己的喜好來選(當然你也可以使用其它塊級元素)。不過要注意的是,<br />本身是有表現的,它會多出一個換行出來,所以要設定它的heigh為0,以隱藏它的表現。所以大多數情況下使用空<div>比較合適。

float-in-float,也是一個很好的選擇,把你要進行清理浮動的元素外層再加上一層<div>并設置屬性fload:left即可,不過要注意相鄰元素的變化。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 调兵山市| 景宁| 兴国县| 广宁县| 天全县| 巴林右旗| 大同市| 连江县| 蛟河市| 丽水市| 通辽市| 壤塘县| 江北区| 雷州市| 长武县| 渭南市| 元氏县| 西乌| 庆安县| 昌乐县| 宝山区| 夹江县| 泰州市| 方山县| 伊金霍洛旗| 四子王旗| 石河子市| 自贡市| 科尔| 乌兰县| 鞍山市| 兰考县| 布尔津县| 延津县| 新田县| 沾化县| 哈巴河县| 虹口区| 平湖市| 利辛县| 贞丰县|