BFCとは何ですか? BFC の簡単な理解

零下一度
リリース: 2017-07-02 09:38:13
オリジナル
12071 人が閲覧しました

はじめに

BFCについて話す前に、例を見てみましょう

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     
 <meta charset="UTF-8"> 5     <title>BFC</title> 6     
 <style type="text/css"> 7         
 .div1 {background-color: #FCE38A; width: 200px; height: 100px;} 8         
 .div2 {background-color: #EAFFD0; width: 200px; height: 100px;} 9         
 .div3 {background-color: #95E1D3; width: 200px; height: 100px;}10     
 </style>11 </head>12 13 <body>14     <div class="div1">div1</div>15     
 <div class="div2">div2</div>16     <div class="div3">div3</div>17 </body>18 
 </html>
ログイン後にコピー

行の幅が制限されていても、ブロックレベルの要素の順序は上から下であることがわかります。複数の要素を収容するには、div1 と div2 に同時にマージンを追加します

本来、div1 の下マージンは 50px、div2 の上マージンは 50px です。論理的には、それらの間の距離は次のようになります。 100pxですが、ここでは50pxのみです。これは、ブロックレベルのレイアウトコンテキストで隣接する2つのブロックレベルのボックス間の垂直マージンが折りたたまれているためです。これは、CSS学習ノート07ボックスモデルで導入されたマージンマージです。このマージンのマージ現象を解決するにはどうすればよいでしょうか。これには、以下で紹介する BFC が関係します。

BFCとは

ブロックレベルのフォーマットコンテキストです。ブロックレベルのボックスのみが参加します(表示属性はblock 、 list-item 、 table 要素など)、この領域の外側とは何の関係もありません。このうち、フォーマット コンテキストは、ドキュメントのレンダリング方法を決定するコンテナです。W3C CSS2.1 仕様の概念です。これはページ上のレンダリング領域であり、そのサブ要素がどのように配置されるか、および他の要素との関係や相互作用を決定する一連のレンダリング ルールがあります。最も一般的な書式設定コンテキストは、ブロック書式設定コンテキスト (BFC) とインライン書式設定コンテキスト (IFC) です。 CSS2.1ではBFCとIFCのみでしたが、CSS3ではGFCとFFCも追加されました。

平たく言えば、BFC は独立したボックスであり、この独立したボックス内のレイアウトは外部の要素には影響されません。 ドキュメントのプレゼンテーションが開始されると、BFC が自動的に作成され、ページ全体がレイアウトされます。新しい BFC が作成されない場合、ドキュメント全体がこの BFC になります。

BFC ルール

    内部ボックスは上から順に垂直方向に配置されます (上記の例からわかるように)
  • 同じ BFC 内の 2 つの隣接するブロックにレベル要素では、垂直方向のマージンが折りたたまれます
  • は float です
  • BFC 領域は float ボックスと重なりません
  • BFC はページ上で分離された独立したコンテナであり、コンテナ内のサブ要素は外部の要素に影響を与えません
  • BFC を計算する
  • 高さの場合、浮動要素も計算に参加します

BFC をトリガーします
  • ルート要素
  • float 属性は none ではありません (例: left | right)
  • overflow 値はありません表示 (例: hidden | auto | スクロール)
  • 表示属性値は inline-block または inline-flex です
  • |マージンオーバーレイを解決するための BFC
問題

は依然として上記の例です。この時点ではページの要素は標準フロー内にあるため、ルールに従って、この時点では body 要素は BFC です

同一个BFC中,在两个相邻的块级元素中,垂直margin会发生折叠
ログイン後にコピー

ここで、display:inline-block 属性を div1 に設定します

このとき、div1 要素は、display:inline-block を通じて BFC をトリガーするため、この時点の div1 は独立した BFC です。ルール

BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然
ログイン後にコピー

に準拠しているため、現時点ではマージンの重複はありません。
内部フロートをクリアする

標準フローのボックス内のすべての子要素がフローティングで、ボックスの高さが設定されていない場合、ボックス全体の高さが折りたたまれます。これは何を意味しますか? 以下の例を参照してください。

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>BFC清除内部浮动</title> 6     <style type="text/css"> 7         .child {background-color: #95E1D3; border: 1px solid #FCE38A; width: 100px; height: 100px;} 8         .parent {width: 300px; border: 1px solid #95E1D3;} 9     </style>10 </head>11 <body>12     <div class="parent">13         <div class="child"></div>14         <div class="child"></div>15     </div>16 </body>17 </html>
ログイン後にコピー

親コンテナは2つの子divでサポートされています。今度は子にfloatを追加します

このとき、親コンテナは2本の重なった線となり、その高さになります。 0、いわゆる高さ崩壊です。ルールに従って

りー

这时候可以触发parent生成BFC,那么parent在计算高度时,parent内部的浮动元素child也会参与计算

布局

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>BFC布局</title> 6     <style type="text/css"> 7         .left {width: 100px; height: 100px; background-color: #FCE38A; float: left;} 8         .right {width: 300px; height: 150px; background-color: #95E1D3;} 9 10     </style>11 </head>12 <body>13     <div class="left"></div>14     <div class="right"></div>15 </body>16 </html>
ログイン後にコピー

根据规则

每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反),即使存在浮动也是如此
ログイン後にコピー

所以即使left设置了左浮动,right的的左边依然会与包含块的左边(即body)相接触。接着我们可以根据规则

BFC的区域不会与float box重叠
ログイン後にコピー

让right触发产生BFC,这样right就不会与left重叠了

这样就形成了常见的两列布局。

总之记住一点BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,同样的,外面的元素也不会影响到容器里面的子元素。

以上がBFCとは何ですか? BFC の簡単な理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート