为啥在 flexbox 中宽度处理方式不同?

Posted

技术标签:

【中文标题】为啥在 flexbox 中宽度处理方式不同?【英文标题】:Why is width handled differently in flexbox?为什么在 flexbox 中宽度处理方式不同? 【发布时间】:2016-04-06 16:04:18 【问题描述】:

我最近一直在玩display:flex,因为我发现它变得越来越流行。在快速测试中,使用 flex 和非 flex CSS 方法,我意识到,在使用 flex 时,我的宽度和边距总是受到尊重。考虑到无论如何我很可能需要元素之间的排水沟,这是一个好方法吗?此外,跨度之间的边距从何而来?这就是我的意思:

HTML

<div class="container">
  <div class="box">
    <span class="inner-box">This gives me a 30px X 60px</span>
    <span class="inner-box">This gives me a 30px X 60px</span>
    <span class="inner-box">This gives me a 30px X 60px</span>
  </div>  
  <div class="box2">
    <span class="inner-box">This gives me a width larger than the specified 30px</span>
    <span class="inner-box">This gives me a width larger than the specified 30px</span>
    <span class="inner-box">This gives me a width larger than the specified 30px</span>
  </div>  
</div>

CSS

.box
  background: orange;
  display:flex;
  flex-direction:row-reverse;
  padding:0 10px;


.box2
  background: green;
  text-align:right;
  padding:0 10px;


.inner-box
  width:30px;
  background:#fff;
  margin:0 0px;

在运行时注意宽度

DEMO

【问题讨论】:

到底是什么问题?如果display:flex 尊敬width,那么display:inline 哪里不行?如果是这样,答案是肯定的,但不是很清楚。 @MrLister,你是对的,我错过了添加我对此的主要问题。当我不得不发布这个时,我很着急。我编辑了 在你的笔中你有.box2 span display: inline-block ,它们之间的空间在How to remove the space between inline-block elements?中解释。在你的问题中你没有那个,所以他们有默认的display: inline,所以他们忽略了width,如Setting the width of inline elements中所述。您的问题是其中之一的欺骗。 没有欺骗。但如果你愿意,你可以欺骗它。没关系 【参考方案1】:

您正在使用&lt;span&gt; 元素。默认情况下它们是内联的。对于内联元素,width 会自动被忽略。

然而,在第一个 div 部分 (.box) 中,span 的内联 display 值被父级的 display: flex 覆盖,从而建立了一个 flex formatting context。因此,所有子项都成为弹性项目,它们尊重 widthheight

Flex Items

弹性项目为其内容建立一个新的格式化上下文。这 此格式化上下文的类型由其display 值确定, 照常。然而,弹性项目本身是 flex-level 盒子,而不是 块级盒子:它们参与容器的弹性 格式化上下文,而不是块格式化上下文。

来源:https://drafts.csswg.org/css-flexbox-1/#flex-items


在第二个 div 部分 (.box2) 中,span 元素仍然是 display: inline,因为它们不会从 block-formatting context 中删除,并且任何 widthheight 分配都将被忽略。

试试display: inline-block:http://codepen.io/anon/pen/yeggOy

参考资料:

Setting the width of inline elements How to set width of a inline element? Does height and width not apply to span? Inline Elements With Width

【讨论】:

这是一个非常详细的答案。我一直在寻找这样的东西来澄清差异,但在这里成为魔鬼的拥护者。我尝试了 display:inline-block 虽然它尊重宽度,但它溢出了文本并仍然添加了边距,不像 display flex 您看到的空白是inline-block 元素的自然特征。这是explanation。使用一种(几种)方法来删除空格,这是您的revised demo 字体大小:0 !!!!!!谁会想到字体与此有关?现在,这是一个非常有趣的概念!【参考方案2】:

你的问题有点不清楚,但如果像 MrLister 评论的那样:

如果display:flex 尊重宽度,那么display:inline 没有?如果是这样,答案是肯定的,

这是因为,根据spec

Flex 项目的绘制与内联块完全相同

因此受到宽度语句的影响。

【讨论】:

你的链接引用很酷的一点(除了inline-block的比较)是它突出了一些可能不为人所知的东西:弹性项目可以使用z-order而不用定位。 这很有趣。考虑到 z-ordering 有时可能是一种拯救,但定位可能会导致更多的调整 我发帖的时候很着急,所以我编辑了这个问题。但主要是我的问题是关于如何处理宽度,更重要的是,边距来自哪里?

以上是关于为啥在 flexbox 中宽度处理方式不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 flexbox 项目图像根据其初始大小调整大小不同?

为啥这个 flexbox 布局在 Safari 中被破坏了?

React Native FlexBox:为啥添加`alignItems`会阻止孩子拥有100%的宽度?

CSS Flexbox 问题:为啥我的 flexchildren 的宽度会受到其内容的影响?

flexbox 可以处理不同大小但行高一致的列吗?

React Native入门 认识Flexbox布局