iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 13
0
自我挑戰組

前端菜焦阿日記系列 第 13

|D13| CSS - Block fomatting context(BFC)

  • 分享至 

  • xImage
  •  
tags: 2019年鐵人賽css

前言

前一篇提到解決 Margin collapse 的方法除了用 borderpadding 隔開,還有 BFC ,這篇整理了幾個 BFC 觀念。

Block fomatting context

摘自w3.org
In a block formatting context, boxes are laid out one after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse.

Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with 'overflow' other than 'visible' (except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.

Formatting context 我理解為它是一個渲染區域,這區域有自已的渲染規則,決定自己的子元素們要如何佈局。

一個 BFC 是一個渲染區域,通俗定義是

  • 內部的 boxes 在垂直方向,從頂部開始一個接一個排列
  • 兄弟層的兩個 boxes 垂直距離由 margin 決定
  • 相鄰的两个 block-level boxes,垂直 margin 會重疊(collapsed)。

若要建立一个新的 BFC 至少满足下列任一條件:

  • displayinline-block 或 table-cell 或 table-caption
  • float 的值不為 none
  • position 的值不為 staticrelative
  • overflow 的值不為 visible

在這個新的 BFC 內,元素佈局是不受外面影響。

用例子來逐步理解一下
範例

<div class="container">
  <p>兄弟元素1</p>
  <p>兄弟元素2</p>
</div>
.container{
  background-color: green;
}
p{
  color:gray;
  text-align:center;
  background-color: yellow;
}
  1. <div> 裡包含 <p> 元素,可以看到第一個/最後一個 <p>margin 成為父層的 margin

  2. <div> 建立一個 BFC,可以看到 <p>margin 被包含在 <div> 裡了!

.container{
  background-color: green;
  overflow:hidden; /* 建立一個 BFC */
}

  1. 兩個兄弟元素 <p>margin 重疊,可以透過再建立一個新 BFC ,讓兩個 <p> 各自屬於不同的 BFC
<div class="container">
  <p>兄弟元素1</p>
  <div class="newBFC">
    <p>兄弟元素2</p>
  </div>
</div>
.container{
  background-color: green;
  overflow:hidden;
}
p{
  color:gray;
  text-align:center;
  background-color: yellow;
}
.newBFC{
  overflow:hidden;
}

參考文章


上一篇
|D12| CSS - Margin collapse
下一篇
|D14| JS - 變數的scope
系列文
前端菜焦阿日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言