前端面試之盒模型

什麼是盒子模型

當你對一個文檔進行佈局(laying out)時候, 瀏覽器引擎會根據CSS-Box模型將全部元素描述爲一個盒子, CSS會決定這些盒子的大小, 位置, 屬性(顏色, 邊框...)。瀏覽器

盒模型分類

盒模型分爲兩類: IE盒模型和標準盒模型。 二者的區別在於:bash

IE盒模型的width/height = content + border + padding
標準盒模型的width/height = content
複製代碼

IE盒模型

IE盒模型

標準盒模型

標準盒模型

普通文檔流塊元素的CSS外邊距合併問題

<style>
    * {
        margin: 0;
        padding: 0;
    }
    .demo1 {
        width: 40px;
        height: 40px;
        background: pink;
        padding: 10px;
        margin: 10px 0;
        border: 2px solid pink;
    }
    .demo2 {
        width: 40px;
        height: 40px;
        padding: 10px;
        background: blue;
        margin: 20px 0;
        border: 2px solid blue;
    }
</style>
<div class="demo1"></div>
<div class="demo2"></div>
複製代碼

外邊距合併

可見demo1與demo2的外邊距爲20px。而不是30px。佈局

須要注意的是:只有普通文檔流中塊框的垂直外邊距纔會發生外邊距合併。行內框、浮動框或絕對定位之間的外邊距不會合並。ui

改變盒子模型

CSS3支持改變盒子模型。spa

box-sizing

box-sizing用來改變計算盒子高度/寬度的默認盒子模型。可使用此屬性來模擬不正確支持CSS盒子模型規範的瀏覽器的行爲。3d

/* 關鍵字 值 */
box-sizing: content-box;
box-sizing: border-box;

/* 全局 值 */
box-sizing: inherit;
box-sizing: initial;
box-sizing: unset;
複製代碼

content-box(默認值): 標準盒模型

寬度 = 內容的寬度
高度 = 內容的高度
不會包含border, padding。
複製代碼

demo演示:code

.demo1 {
    box-sizing: content-box;
    width: 40px;
    height: 40px;
    background: pink;
    padding: 10px;
    margin: 10px 0;
    border: 2px solid pink;
}

<div class="demo1"></div>
複製代碼

盒子內容寬度就是40px; cdn

content-box

border-box: 怪異模式

width = border + padding + 內容的width,
height = border + padding + 內容的height。
複製代碼

demo演示:blog

.demo {
    box-sizing: border-box;
    width: 40px;
    height: 40px;
    background: pink;
    padding: 10px;
    margin: 10px 0;
    border: 2px solid pink;
}

<div class="demo"></div>
複製代碼

盒子的內容寬度爲16px; 繼承

border-box

padding-box: 已經棄用

inherit: 規定應從父元素繼承 box-sizing 屬性的值

爲何要使用border-box

content-box缺點

當你想讓兩個子容器float:left,寬度各50%,而後給一點padding,最後讓子容器並排充滿父容器,一切想的挺美好,然而你發現結果並非這麼美好,由於子容器的盒子寬度已經超出了父容器的一半,致使了折行,因而,width就不能50%了,只能是50%再減去padding的像素值
複製代碼
<style>
    * {
        margin: 0;
        padding: 0;
    }
    .demo div {
        float: left;
        width: 50%;
        height: 100px;
        padding: 0 10px;
    }
    .demo1 {
        background: pink;
    }
    .demo2 {
        background: blue;
    }
</style>

<div class="demo">
    <div class="demo1"></div>
    <div class="demo2"></div>
</div>
複製代碼

content-box

border-box的優點:

border-box的誕生,主要就是解決content-box的最大缺點。border-box意味着子容器的padding和border的厚度都算在50%以內,這樣,你能夠隨意的修改padding和border的厚度值,根本不用擔憂父容器被撐爆。
複製代碼

簡單修改下上述代碼。

.demo div {
    box-sizing: border-box;
    float: left;
    width: 50%;
    height: 100px;
    padding: 0 10px;
}
複製代碼

border-box

所以border-box使用場景以下:

子元素有padding和border,或者至少有其一,而且須要給子元素設定100%寬度(或者50%寬度等等),這時候顯然須要border-box。設爲border-box以後,padding和border的厚度能夠隨意調,並不會溢出父元素。若是是content-box,那麼,寬度必然會溢出,並且,爲了避免溢出,你設定子元素的寬度就只能是一個定值,或者是一個計算值(好比calc(100% - 20px)。

相關文章
相關標籤/搜索