ChatGPT解决这个技术问题 Extra ChatGPT

Flexbox 没有给元素相等的宽度

尝试一个 flexbox nav 最多包含 5 个项目,最少 3 个项目,但它并没有在所有元素之间平均划分宽度。

小提琴

我正在建模的教程是 http://www.sitepoint.com/responsive-fluid-width-variable-item-navigation-css/

SASS

{字体大小:16px; } .tabs { 最大宽度:1010px;宽度:100%;高度:5rem;边框底部:实心 1px 灰色;保证金:0 0 0 6.5rem;显示:表格;表格布局:固定; } .tabs ul { 边距:0;显示:弯曲;弹性方向:行; } .tabs ul li { flex-grow: 1;列表样式:无;文本对齐:居中;字体大小:1.313rem;背景:蓝色;白颜色;身高:继承;左:自动;垂直对齐:顶部;文本对齐:左;填充:20px 20px 20px 70px;边框左上角半径:20px;边框:纯色 1px 蓝色;光标:指针; } .tabs ul li.active { 背景:白色;颜色:蓝色; } .tabs ul li:before { content: ""; }

  • 披萨
  • 鸡汤面
  • < li data-tab="3">花生酱

为您的表格设置最小宽度,并使用 vw 单位设置填充可能会有所帮助:jsfiddle.net/2nY9N/2 放弃 flex-grow 并执行 flex:1;它将使用其他 2 个属性的默认值

J
James Montagne

在您链接的文章中没有提到一个重要的部分,那就是 flex-basis。默认情况下 flex-basisauto

the spec

如果指定的 flex-basis 是 auto,则使用的 flex base 是 flex 项的主要尺寸属性的值。 (这本身可以是关键字 auto,根据内容调整弹性项目的大小。)

每个弹性项目都有一个 flex-basis,它有点像它的初始大小。然后从那里,任何剩余的可用空间在项目之间按比例分配(基于 flex-grow)。对于 auto,该基础是内容大小(或用 width 定义的大小等)。因此,在您的示例中,具有较大文本的项目总体上被赋予了更多空间。

如果希望元素完全均匀,可以设置 flex-basis: 0。这会将弹性基数设置为 0,然后任何剩余空间(将是所有空间,因为所有基数均为 0)将根据 flex-grow 按比例分配。

li {
    flex-grow: 1;
    flex-basis: 0;
    /* ... */
}

This diagram from the spec 很好地说明了这一点。

here is a working example 用你的小提琴。


这在 Safari 上为我包装了废墟。
这个答案最棒的地方在于,你用这个例子解释了 flex-basis 比整个互联网上的任何其他地方都好。我要联系麻省理工学院给你一个名誉教授的职位。
顺便提一下,flex: 1;flex-grow: 1flex-basis: 0 组合的简写。
以防万一有人想深入了解,我在网上看到了这篇很棒的文章:css-tricks.com/flex-grow-is-weird
如果这对您不起作用,请检查一个项目是否具有与另一个项目不同的水平填充,然后此解决方案不会使它们具有相同的宽度。
n
nnn

要使用 Flex 创建等宽的元素,您应该设置为您的子元素(flex 元素):

flex-basis: 25%;
flex-grow: 0;

它将为行中的所有元素提供 25% 的宽度。它们不会一一生长和去。


这很尴尬,因为它完全削弱了 flex 的好处。如果您要对列大小进行硬编码,则有更简单的方法来解决问题。
这一点都没有错..如果你想拥有相同长度的盒子并且在行被完全占用时分解..你可以很容易地做到这一点。如果您需要最小宽度,也可以设置最小宽度
@Kloar您说的是弹性盒的唯一好处......当您需要相等的宽度时,它们当然仍然是有益的,例如响应性。另外,弹性盒不是很容易吗?
Z
Zim

正如@James Montagne 回答 flex-basis: 0 中所解释的那样,将确保 flexbox 列均匀分布,这在这种情况下有效,因为列内容可以换行并且不会强制宽度。但是,在强制列内容宽度的情况下(例如使用图像宽度或空白:nowrap),解决方案是设置 min-width: 0...

li {
  flex-grow: 1;
  flex-basis: 0;
  min-width: 0;
}

https://codeply.com/p/sLZxZRFduI


最小宽度:0;使我的物品宽度相同以实现溢出
R
Rohit Nishad

解决方案:

flex: 1;

或者

.flex-child-items{
   flex-grow: 1;
} 

解释:

如果您只放置 display: flex,它只是水平对齐所有项目,宽度将是孩子宽度的 sum(取决于内容或有时是 width 属性)。

例如:

// 一个普通的 flex

++++++++++   ++++++++++   ++++++++++
+        +   +        +   +        +
+   A    +   +   B    +   +   C    +
+  10px  +   +  10px  +   +  10px  +
+        +   +        +   +        +
++++++++++   ++++++++++   ++++++++++

现在假设您想将空间平均分配给所有这些。为此,请将 flex-grow: 1 添加到 flex 的所有子项中。 (在本例中为 A、B 和 C)

.A, .B, .C {
    flex-grow: 1;
}

在此之后,它看起来像这样:

++++++++++                              ++++++++++                              ++++++++++
+        +                              +        +                              +        +
+   A    +                              +   B    +                              +   C    +
+  10px  +                              +  10px  +                              +  10px  +
+        +                              +        +                              +        +
++++++++++                              ++++++++++                              ++++++++++

*顺便说一句,如果上面的示例框看起来不像中心,很抱歉,但代码工作在项目上尝试一下。


A
Akshay Vijay Jain

Flex 可能不会在所有情况下为子项提供相同的宽度。

对等宽元素使用 css 网格。

.el{
 display: grid;
 grid-auto-flow: column;
 grid-auto-columns: 1fr
}

参考https://css-tricks.com/equal-columns-with-flexbox-its-more-complicated-than-you-might-think/

如果您只想使用 CSS flex,那么选项很少

flex-basis: 100% 给所有孩子,这将是一场势均力敌的比赛。或 flex-basis: 0 这没有第一个选项有用