为啥 flex-fill 在引导程序中没有创建相等的宽度?

Posted

技术标签:

【中文标题】为啥 flex-fill 在引导程序中没有创建相等的宽度?【英文标题】:Why is flex-fill not creating equal width in bootstrap?为什么 flex-fill 在引导程序中没有创建相等的宽度? 【发布时间】:2019-01-17 10:00:59 【问题描述】:

根据Bootstrap 4.1 documentation关于.flex-fill

在一系列同级元素上使用 .flex-fill 类来强制它们的宽度相等,同时占用所有可用的水平空间。

我在 3 个兄弟姐妹上使用 .flex-fill 做了一个示例,但它们没有被强制等宽。

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>

<div class="d-flex">
  <div class="flex-fill">Item</div>
  <div class="flex-fill">Another</div>
  <div class="flex-fill">Last item</div>
</div>

怎么可能?

【问题讨论】:

【参考方案1】:

不幸的是,Bootstrap 的 flex-fill 是一个非常糟糕的课程。它设置了以下flex CSS 属性:

flex: 1 1 auto;

这相当于:

flex-grow: 1;
flex-shrink: 1;
flex-basis: auto;

增长和收缩值很好。这就是使盒子均匀共享可用空间的原因。 auto flex-basis value 不过不好:

flex-basis 是根据它作为可用空间留下的空间来定义该项目的大小。该属性的初始值为auto——在这种情况下,浏览器会查看项目是否有大小。 […]

如果项目没有大小,那么内容的大小将用作 flex-basis。这就是为什么当我们只在父级上声明display: flex 来创建弹性项目时,所有项目都会移动到一行中,并且只占用显示其内容所需的空间。

所以flex-basis: auto 使框具有内容所需的宽度。只有然后,才会应用增长和收缩来填充容器的剩余大小。

如果您查看示例的输出,您可以看到以下内容:

这些列的宽度显然不一样,但是那些蓝色的盒子,也就是每个弹性项目中的空白,它们的宽度都是一样的。所以平衡的是剩余空间,不考虑内容。

当然,这很少是您想要做的。使用 flex box 最常见的做法是使所有项目具有相同的宽度。如果没有引导程序,您只需为此执行 flex: 1,这是 flex: 1 1 0; 的简写

.flex-even 
  flex: 1;
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>

<div class="d-flex">
  <div class="flex-even">Item</div>
  <div class="flex-even">Another</div>
  <div class="flex-even">Last item</div>
</div>

不幸的是,这不是 Bootstrap 作者将flex-fill 设为的样子。更糟糕的是,the example they are showing 在每个 flex 项目中使用相同的内容,所以你实际上并没有看到这种行为。还有an issue about this,最终可能会澄清文档中的这种误解。

底线:Bootstrap 没有内置的 flex: 1 类(至少据我所知),所以你最好自己创建一个。这绝对是更有用的“flex-fill”。

【讨论】:

有一个小技巧可以避免定义自定义类flex-even。就是使用标准的bs4类media-body。它完全设置flex: 1 ^^ 非常有用的提示。但是如果你需要这个类来响应,你将不得不创建另一个实用程序类... 您可以通过 SASS 合并到引导实用程序文件中,例如 $utilities: map-merge( $utilities, ( "flex-even": ( responsive: true, property: flex, values: (even : 1) ) ) );繁荣现在你有 flex-even 和 flex-xs-even 等等等等。【参考方案2】:

我带着同样的问题来到这里,想利用 Flexbox 而不仅仅是“经典”引导代码(我的想法有时是版本 3,而不是 4)。

似乎 Bootstrap 4 的 .col-* 类在后台使用 flexbox 来做到这一点!他们使用flex-growflex-shrinkflex-basis 的简写来实现50% 的宽度。但是,它确实必须使用 .row 作为每个 .col-* 类的包装器。

(此代码来自浏览器开发工具)

.col-md-6 
    -webkit-box-flex: 0;
    -ms-flex: 0 0 50%;
    flex: 0 0 50%;
    max-width: 50%;

【讨论】:

以上是关于为啥 flex-fill 在引导程序中没有创建相等的宽度?的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap 4 中 .flex-fill 的对立面是啥?

为啥我的模态没有显示?引导程序 4 [关闭]

为啥我在引导程序的轮播组件中看不到上一个和下一个箭头?

为啥我的两个元组包含字符串,以相同的方式创建,不相等?

为啥添加css代码后模态窗口会隐藏? (引导程序)

我在 Angular 8 中安装了引导程序但无法正常工作。为啥?