文章出處

注意:本篇僅供參考,當時寫這篇的時候還存在很多的問題。本文于2016-11-14編寫

7.1 一個冒牌的脫離標準流,浮動

浮動大家都很熟悉了,但我要說的是,它并不是真正的脫離標準流,請允許我慢慢道來。

一個常規的脫離標準流必須滿足以下條件:

  • 不占據任何位置
  • 不屬于任何元素
  • 父元素無法自適應脫離標準流的元素(元素都脫標了,還能自適應那可能嗎,可能的話那就不是真正的脫標)

如果是這樣的話,下面的種種現象足夠證明。另外也可以說明它真的不是用來布局的,而是用來實現文字環繞的。

現象1:浮動蓋不住文字
<style>
 body,div{
 margin:0;
 padding:0;
 }
 div{
 width:100px;
 height:100px;
 background-color:red;
 }
 .item1{
 float:left;
 }
</style>
<div class="item1">item1</div>
<div class="item2">item2</div>

文字被掉下來了,這一點能夠說明浮動和文字有著不可密切的關系,也就是文字環繞。

現象2:浮動并不是真正的不占位置
<style>
 body,div{
 margin:0;
 padding:0;
 }
 div{
 width:100px;
 height:100px;
 }
 .item1{
 float:left;
 background-color:red;
 }
 .item2{
 display:inline-block;
 background-color:pink;
 }
</style>
<div class="item1">item1</div>
<div class="item2">item2</div>

可以看到它其實還是占了位置的,實際上它只對后一個元素是塊級元素的時候才會蓋住它,之所以它會占不是塊級元素的位置是因為不是塊級元素,它是允許并排的,允許并排那么文字正好在它的右邊,另外你會可以發現,如果是用inline-block和inline中間會有幾像素的間距,但是用了浮動以后間距就沒了。這說明了文字和它的親密度。

現象3:浮動不允許我們手動調整層級
<style>
 body,div{
 margin:0;
 padding:0;
 }
 div{
 width:100px;
 height:100px;
 }
 .item1{
 float:left;
 z-index:-999;
 background-color:red;
 }
 .item2{
 background-color:pink;
 }
</style>
<div class="item1">item1</div>
<div class="item2">item2</div>

可以看到我們設置的z-index根本就沒有用,因為它和定位有著天然的區別,一個是用來脫離標準流的,一個是用來實現文字環繞的。

現象4:父元素還是可以自適應浮動的元素的
<style>
 body,div{
 margin:0;
 padding:0;
 }
 .box{
 width:200px;
 overflow:hidden;
 border:1px solid #dedede;
 }
 .item{
 width:100px;
 height:100px;
 float:left;
 background-color:pink;
 }
</style>
<div class="box">
 <div class="item"></div>
</div>

加上一個overflow:hidden;完美自適應浮動元素高度。

為什么它只會蓋住塊級元素,并且不會蓋住文字?如果我們不給塊級元素設置寬度,你就會發現它的秘密。

<style>
 body,div{
 margin:0;
 padding:0;
 }
 .item1{
 width:100px;
 height:100px;
 float:left;
 background-color:red;
 }
 .item2{
 background-color:pink;
 }
</style>
<div class="item1">item1</div>
<div class="item2">item2</div>

可以看到它把文字往左邊移動了,并且移動的距離正是浮動元素的寬度,另外這也可以解釋為什么浮動不能手動創建層級,如果真的允許創建層級那問題就大了,那么沒有浮動的那個元素將在上面,那么文字究竟是放在哪里呢?放在浮動元素的右邊?那就成什么了,請自行腦補一下。

所以這些現象足夠說明浮動并不是一個真正的脫離標準流,要說是那也只是耍了點小把戲,另外一點更加確定的是它和文字環繞是一對的。

7.2 隱藏在body、html后面的神秘人物

你有沒有發現,給body設置背景顏色即使不設置寬高,背景也是占滿全屏的,你肯定會說,body的寬高默認100%,如果你這么覺得就錯了,不多說實戰出真知。

<style>
 body{
 background-color:pink;
 }
</style>

這個你肯定不止一次的使用過,那這個究竟是不是body的背景呢?肯定不是,為什么這么說,如果你看了css單位的第一節100%單位,我想你應該還記得之前說過,body的高度是繼承html的,而html的高度是根據內容來的,如果沒有內容,那么它的高度為0,你說給一個高度為0的元素設置背景色會有用嗎,肯定是沒有用的,另外一點可以證明它絕對不是body的,我想你應該每天在寫這么一句話。

body{
 margin:0;
 padding:0;
}

為什么要這么寫呢,因為它默認有一個margin,既然默認有一個margin,如果說這個背景真的是body的,那么肯定會有8px的間距。但是沒有,所以可以排除這個背景是body的,那么它是html的嗎?肯定也不是,看看這張圖就知道了。

可以看到默認html只有8像素的高度,這個高度是body默認的margin高度。因為父元素會自適應子元素的高度,除了脫離標準流的元素,還可以從另外一方面解釋。

<style>
 html{
 margin-top:50px;
 border:10px solid red;
 }
 body{
 border:10px solid green;
 background-color:pink;
 }
</style>

可以看到我們已經做的很絕了,但依然不影響背景顏色。

那么既然不是body,也不是html的,那么究竟是誰的呢?

我猜測它屬于整個文檔的,而這個文檔是我們是無法操作的,簡單來說,瀏覽器默認是沒有給這個文檔設置背景的,而一旦body或html設置了,它就會去捕獲這個背景,從而給這個文檔運用上去。

如果是這樣的話,那如果給body和html都設置背景,會用誰的呢?你應該猜到了

<style>
 html{
 background-color:red; 
 }
 body{
 background-color:pink;
 }
</style>

正是html的。

以下這個情況,更加確定,在html以及body后面一直隱藏著一個神秘人物。

<style>
 body{
 display:none;
 background-color:pink;
 }
</style>

把body隱藏了居然還可以,但如果把html隱藏了,它的運氣就沒有那么好了。

<style>
 html{
 display:none;
 }
 body{
 display:none;
 background-color:pink;
 }
</style>

白茫茫。或許它離我們并不遠,我想有一天它一定會浮出水面...


文章列表


不含病毒。www.avast.com
文章標籤
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣(0)