CSS盒模型與BFC

盒模型

如何設置

box-sizing: content-box 標準模型(瀏覽器默認設置) box-sizing: border-box IE模型css

如何獲取盒模型的寬高

BFC(用於解決邊距重疊)

基本概念

BFC(Block Formatting Context)直譯爲「塊級格式化範圍」。是 W3C CSS 2.1 規範中的一個概念,它決定了元素如何對其內容進行定位,以及與其餘元 素的關係和相互做用 當涉及到可視化佈局的時候,Block Formatting Context提供了一個環境,HTML元素在這個環境中按照必定規則進行佈局。一個環境中的元素不會影響到其它環境中的佈局。好比浮動元素會造成BFC,浮動元素內部子元素的主要受該浮動元素影響,兩個浮動元素之間是互不影響的。這裏有點相似一個BFC就是一個獨立的行政單位的意思。 也能夠說BFC就是一個做用範圍。能夠把它理解成是一個獨立的容器,而且這個容器的裏box的佈局,與這個容器外的絕不相干。html

做用

  1. 內部的盒子會在垂直方向,一個個地放置;
  2. BFC是頁面上的一個隔離的獨立容器;
  3. 屬於同一個BFC的 兩個相鄰Box的 上下margin會發生重疊 ;
  4. 計算BFC的高度時,浮動元素也參與計算
  5. 每一個元素的左邊,與包含的盒子的左邊相接觸,即便存在浮動也是如此;
  6. BFC的區域不會與float重疊;

如何建立BFC

  1. float的值不能爲none
  2. overflow的值不能爲visible
  3. display的值爲table-cell, table-caption, inline-block, flex, inline-flex中的任何一個
  4. position的值不爲relative和static

最多見的就是overflow:hidden、float:left/right、position:absolute瀏覽器

BFC使用場景

  1. 不和浮動元素重疊 若是一個浮動元素後面跟着一個非浮動的元素,那麼就會產生一個覆蓋的現象,不少自適應的兩欄佈局就是這麼作的。好比下圖的效果,參考例子
<style> body { width: 300px; position: relative; } .aside { width: 100px; height: 150px; float: left; background: #f66; } .main { height: 200px; background: #fcc; } </style>
<body>
    <div class="aside"></div>
    <div class="main"></div>
</body>
複製代碼

之因此是這樣,是由於上文的 規則5: 每一個元素的左邊,與包含的盒子的左邊相接觸,即便存在浮動也是如此;bash

因此要想改變效果,使其互補干擾,就得利用規則6 :BFC的區域不會與float重疊, 讓 ide

也能觸發BFC的性質,即:

.main {
    overflow: hidden;
}
複製代碼

當觸發main生成BFC後,這個新的BFC不會與浮動的aside重疊。所以會根據包含塊的寬度,和aside的寬度,自動變窄。效果以下: 佈局

  1. 消除margin重疊 Box垂直方向的距離由margin決定。屬於同一個BFC的兩個相鄰Box的margin會發生重疊

根據規範,一個盒子若是沒有上補白(padding-top)和上邊框(border-top),那麼這個盒子的上邊距會和其內部文檔流中的第一個子元素的上邊距重疊。兩個相鄰的margin之間若是沒有明確的界限(padding、border),則會發生重疊,重疊後相應的margin爲較大的那個post

例子:flex

  • 盒子的top margin和它第一個普通流子元素的top margin
  • 盒子的bottom margin和它下一個普通流兄弟的top margin
  • 盒子的bottom margin和它父元素的bottom margin
  • 盒子的top margin和bottom margin,且沒有建立一個新的塊級格式上下文,且有被計算爲0的min-height,被計算爲0或auto的height,且沒有普通流子元素
<style> p { color: #f55; background: #fcc; width: 200px; line-height: 100px; text-align:center; margin: 100px; } </style>
<body>
    <p>Haha</p>
    <p>Hehe</p>
</body>
複製代碼

兩個p之間的margin僅爲100px, 是由於他們 同屬於 body這個根元素,根據規則3,他們會發生margin重疊。因此咱們須要讓它們 不屬於同一個BFC,就能避免外邊距摺疊spa

<style> .wrap { overflow: hidden; } p { color: #f55; background: #fcc; width: 200px; line-height: 100px; text-align:center; margin: 100px; } </style>
<body>
    <p>Haha</p>
    <div class="wrap">
        <p>Hehe</p>
    </div>
</body>
複製代碼
  1. 清除元素內部浮動 當container內部有float元素時,container自己沒有高度,裏面的子元素也會脫離文檔流,爲了不這個狀況,能夠用BFC,根據BFC規範中的第4條:計算BFC的高度時,浮動元素也參與計算,那麼外部div容器就能夠包裹着浮動元素
.container {
  overflow: hidden; /* creates block formatting context */
  background-color: green;
}

.container div {
  float: left;
  background-color: lightgreen;
  margin: 10px;
}
複製代碼

參考3d

  1. https://juejin.im/post/5a4dbe026fb9a0452207ebe6
  2. https://juejin.im/post/59b73d5bf265da064618731d
相關文章
相關標籤/搜索