標準盒模型和怪異盒模型

北辰狼月發表於2017-10-23

盒子模型眾所周知,這裡先簡單介紹一下。

可以看到,在標準盒模型下,width和height是內容區域即content的width和height。而盒子總寬度為

在標準模式下,一個塊的總寬度= width + margin(左右) + padding(左右) + border(左右)

而IE盒模型或怪異盒模型顯而易見的區別就是,width和height除了content區域外,還包含padding和border。盒子的總寬度為

一個塊的總寬度= width + margin(左右)(即width已經包含了padding和border值)

 

當然這些大夥應該都知道,關鍵的是如何運用選擇哪種盒模型

首先,如何運用?

只要在文件首部加了doctype申明,即使用了標準盒模型,而不加,則會由瀏覽器自己決定,比如,ie 瀏覽器中顯示“ie盒子模型”,在 ff 瀏覽器中顯示“標準 w3c 盒子模型”。

然後,選擇哪種?

按理說,我們應該遵循w3c標準使用標準盒模型,但我發現很多ui框架使用的都是怪異盒模型,比如ionic,vux,和bootstrap,為什麼呢?我思考了很長時間。

不知道大家有沒有遇到過這種情況,本來我畫了兩個div,他們在flex佈局下分別佔50%的寬度,很簡單,我們width設定為50%即可,當我們畫完了,很滿意的看了看頁。

程式碼:

* {
margin: 0;
padding: 0;
box-sizing: content-box;
}
<div style="display: flex;">
<div style="width: 50%;background-color: blue;color: white;">我是左邊</div>
<div style="width: 50%;background-color: red;color: white">我是右邊</div>
</div>

效果:

 

這時候,一個需求來了,左邊的部分要加上邊框,你一想,這不簡單麼,立馬給左邊加上了一個邊框。但,意外出現了,左邊和右邊的不相等了。因為左邊加上了邊框,所以寬度溢位了,這時候右邊就會壓縮自己,這樣就導致兩邊不一致了

程式碼:

<div style="display: flex;box-sizing: content-box">
<div style="width: 50%;background-color: blue;color: white;border: 5px solid black">我是左邊</div>
<div style="width: 50%;background-color: red;color: white">我是右邊</div>
</div>

效果:

啊,崩潰,又得調半天,關鍵還不好調。因為border必須為數值,而其他的為百分比,這樣就很難知道左右該設多少比例,才能讓左右兩邊完全一致了。

而用怪異盒模型,這樣的問題就迎刃而解。

程式碼:

* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
<div style="display: flex;">
<div style="width: 50%;background-color: blue;color: white;border: 5px solid black">我是左邊</div>
<div style="width: 50%;background-color: red;color: white">我是右邊</div>
</div>

 

 這樣不管你邊框是多寬,左右都是始終相等的。

然後,再請大家想一想,移動端都是需要自適應佈局的,需要用到大量的百分數,這時候再用標準盒模型,邊框進來插一腳無疑會讓情況變得很複雜,對自適應佈局很不友好,這大概就是很多框架都採用怪異盒子模型的原因吧。

 以上純屬個人觀點,不對的地方,請大家指教。

 

相關文章