【问题标题】:Difference between ways of participating into BFC/IFCBFC/IFC参与方式的区别
【发布时间】:2017-02-18 16:38:02
【问题描述】:

据我所知,overflow: hidden 和display: inline-block 都在.mid-column 中建立了一个新的BFC。但是,前者会使.mid-column 成为块盒,而后者会使它成为原子内联盒。

使用overflow: hidden

.left-column {
  float: left;
  background-color: grey;
}
.right-column {
  float: right;
  background-color: grey;
}
.mid-column {
  overflow: hidden;
}
<div class="wrapper">
  <div class="left-column">
    <h3>Left Column</h3>
  </div>
  <div class="right-column">
    <h3>Right Column</h3>
  </div>
  <div class="mid-column">
    <h3>Mid Column</h3>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
      dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </p>
    <div class="left-column">
      <h3>Inner Left Column</h3>
    </div>
    <div class="right-column">
      <h3>Inner Right Column</h3>
    </div>
  </div>
</div>

使用display: inline-block

.left-column {
  float: left;
  background-color: grey;
}
.right-column {
  float: right;
  background-color: grey;
}
.mid-column {
  display: inline-block;
}
<div class="wrapper">
  <div class="left-column">
    <h3>Left Column</h3>
  </div>
  <div class="right-column">
    <h3>Right Column</h3>
  </div>
  <div class="mid-column">
    <h3>Mid Column</h3>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
      dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </p>
    <div class="left-column">
      <h3>Inner Left Column</h3>
    </div>
    <div class="right-column">
      <h3>Inner Right Column</h3>
    </div>
  </div>
</div>

我只能解释第一个演示中的布局。根据document(我的粗体):

在块格式化上下文中,每个框的左外边缘接触 包含块的左边缘(对于从右到左的格式,右 边缘接触)。即使有浮点数也是如此(尽管 box 的 line box 可能会因为浮动而缩小),除非 box 建立一个新的块格式化上下文(在这种情况下,盒子 本身 may become narrower 由于浮动)。

overflow: hidden规则建立了一个新的BFC,thus,.mid-column的边框不能与.left-column和right-column的边框重叠。

至于第二个demo,我唯一知道的是.mid-column周围有一个匿名block box,为它建立了一个IFC。不幸的是,我无法进一步解释。

我的问题是:加入 IFC 而不是 BFC 对布局有何影响?如果有人可以对第二个演示提供详细解释,或者至少提供相关文档的链接以便我弄清楚,那就太好了。

【问题讨论】:

  • 他们创建的 BFC 是相同的。他们参与 BFC 的方式以及 - 在后一种情况下是其 IFC - 的方式完全不同。
  • @Alohci 你的意思是display: inline-block创建的BFC是IFC?
  • 没有。 display: inline-block参与的国际金融公司。它可能会或可能不会建立一个国际金融公司,这取决于它的内容是什么。根据您的示例,它不会建立国际金融公司。
  • @Alohci 很抱歉,但我无法理解。请帮我清理一下:在我的第二个演示中,在mid-column 中创建了一个 BFC,而 IFC 在哪里? IFC 是包含在mid-column 中,还是包含在mid-column 中?另外,“参与”是什么意思?
  • IFC 由anonymous block box 建立,在.wrapper div 内部和.mid-column div 外部。我鼓励你仔细阅读section 9.4 of the CSS 2 spec非常。

标签: html css layout overflow


【解决方案1】:

加入 IFC 而不是 BFC 对布局有何影响?

行内级框内嵌在行框上,就像文本一样。这里的所有都是它的。一个盒子参与的格式化上下文对盒子可能为它的内容建立的任何格式化上下文没有影响(如果它建立了一个)。

.mid-column 本身,当显示为内联块时,参与由匿名块框(为此目的创建)建立的 IFC,但就.mid-column 的后代而言,它们正在参与在由.mid-column 建立的 BFC 中。无论发生在此 BFC 之外的任何情况,他们都不会关心,并且 BFC 之外的元素永远不会干扰发生在此 BFC 中的块布局。

在第二个演示中围绕.mid-column 生成的匿名块框参与了根 BFC。 .wrapper 在任一演示中都没有建立 BFC。由于浮动占用了.wrapper 的可用宽度(进而是匿名块框),因此.mid-column 没有足够的空间与浮动垂直对齐,这就是.mid-column 被推下的原因。

相关链接已在cmets中提供; CSS2 的第 9.4 节告诉你你需要知道的一切。

【讨论】:

  • 好的,现在我明白了.mid-column本身是否参与IFC或BFC不影响布局.mid-column的内容,但是为什么.mid-column本身插入在两个浮动块之间在第一个演示中,而在第二个演示中被“推倒”?我认为它应该“像文本一样内联”,因此它的行为与第一个演示中的一样。
  • @sunqingyao:整个盒子被看成一个单一的实体单元,就像一个字母,无法拆开。这就是原子内联的意思。由于盒子不能拆开,唯一的安装方法是把它往下推。
  • 明白了!我还有一个问题:匿名块框真的存在,还是只是一个虚构的假设?根据document:为了更容易定义格式,我们假设“Some text”周围有一个匿名块框。“假设”一词闻起来很腥......
  • 哈哈,你不能用 CSS 选择它们或在浏览器中检查它们,所以你的猜测和我的一样好......
  • @sun qingyao:你看错了。那是在谈论线框,而不是内联块。
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2016-02-26
  • 2020-02-19
  • 2019-11-04
  • 2011-07-14
  • 2013-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多