A block formatting context (BFC) is a part of a visual CSS rendering of a web page. It's the region in which the layout of block boxes occurs and in which floats interact with other elements.
A block formatting context is created by at least one of the following:
- The root element of the document (
<html>). - Floats (elements where
floatisn'tnone). - Absolutely positioned elements (elements where
positionisabsoluteorfixed). - Inline-blocks (elements with
display: inline-block). - Table cells (elements with
display: table-cell, which is the default for HTML table cells). - Table captions (elements with
display: table-caption, which is the default for HTML table captions). - Anonymous table cells implicitly created by the elements with
display: table,table-row,table-row-group,table-header-group,table-footer-group(which is the default for HTML tables, table rows, table bodies, table headers, and table footers, respectively), orinline-table. - Block elements where
overflowhas a value other thanvisibleandclip. - Elements with
display: flow-root. -
<button>elements and button<input>types defaulting todisplay: flow-root. - Elements with
contain: layout,content, orpaint. - Flex items (direct children of the element with
display: flexorinline-flex) if they are neither flex nor grid nor table containers themselves. - Grid items (direct children of the element with
display: gridorinline-grid) if they are neither flex nor grid nor table containers themselves. - Multicol containers (elements where
column-countorcolumn-widthisn'tauto, including elements withcolumn-count: 1). -
column-span: all, even when thecolumn-span: allelement isn't contained by a multicol container.
Formatting contexts affect layout because an element that establishes a new block formatting context will:
- contain internal floats.
- exclude external floats.
- suppress margin collapsing.
Flex and grid containers, defined by setting an element's (display to flex, grid, inline-flex, or inline-grid, establishes a new flex or grid formatting context. These are similar to block formatting context except there are no floating children available inside a flex or grid container, but these formatting contexts do exclude external floats and suppress margin collapsing.