关于这一点,已经有过一些问题和文章,但据我所知,没有任何定论.我能找到的最好的总结是

flex-basis允许您在计算任何其他内容之前指定元素的初始/起始大小.它可以是百分比,也可以是绝对值.

.它本身并没有太多地说明flex-basis组元素的行为.以我目前对Flexbox的了解,我不明白为什么它不能同样描述width.

我想知道flex-basiswidth在实践中到底有什么不同:

  • 如果我用flex-basis替换width(反之亦然),视觉上会发生什么变化?
  • 如果我将两者都设置为不同的值,会发生什么?如果它们具有相同的值,会发生什么?
  • 在某些特殊情况下,使用widthflex-basis会与使用另一个有显著差异吗?
  • widthflex-basis与其他弹性框样式(例如flex-wrapflex-growflex-shrink)一起使用时,它们有何不同?
  • 还有其他显著的不同之处吗?

Edit/clarification:这个问题在What exactly flex-basis property sets?年以不同的形式被问到,但我觉得更直接地比较或总结一下flex-basiswidth(或height)的区别会更好.

推荐答案

Consider flex-direction

当读到你的问题时,你首先想到的是flex-basis并不总是适用于width.

flex-directionrow时,flex-basis控制宽度.

但是当flex-directioncolumn时,flex-basis控制高度.


关键区别

以下是flex-basiswidth/height之间的一些重要区别:

  • flex-basis仅适用于弹性项.Flex容器(也不是Flex项)将忽略flex-basis,但可以使用widthheight.

  • flex-basis仅在主轴上工作.例如,如果您在flex-direction: column中,则需要width属性来水平调整弹性项的大小.

  • flex-basis对绝对定位的弹性物品没有影响.需要widthheight处房产.Absolutely-positioned flex items do not participate in flex layout

  • By using the flex property, three properties – flex-grow, flex-shrink and flex-basis – can be neatly combined into one declaration. Using width, the same rule would require multiple lines of code.


浏览器行为

就它们的渲染方式而言,应该有no difference,介于flex-basiswidth之间,除非flex-basisautocontent.

From the spec:

7.2.3. The flex-basis property

对于除autocontent之外的所有值,flex-basis的解析方式与水平写入模式中的width相同.

autocontent的影响可能微乎其微,或者根本没有影响.规格中的更多信息:

auto

在弹性项上指定时,关键字auto将检索值 作为已用flex-basis的Main Size属性的.如果该值为 本身为auto,则使用的值为content.

content

指示根据弹性项的内容自动调整大小.

Note: This value was not present in the initial release of Flexible Box Layout, and thus some older implementations will not support it. The equivalent effect can be achieved by using 100 together with a main size (101 or 102) of 100.

因此,根据规范,flex-basiswidth解析相同,除非flex-basisautocontent.在这种情况下,flex-basis可以使用内容宽度(想必width属性也会使用).


The flex-shrink factor

记住Flex容器的初始设置很重要.其中一些设置包括:

  • flex-direction: row-flex项目将水平对齐
  • justify-content: flex-start-弹性物品将堆叠在主轴上的线条起点
  • align-items: stretch-flex项目将扩展到覆盖容器的横向大小
  • flex-wrap: nowrap个弹性项目被迫排成一条线
  • flex-shrink: 1-弹性物品允许收缩

注意最后一个设置.

因为默认情况下允许收缩弹性项(这可以防止它们溢出容器),所以指定的flex-basis/width/height可能会被覆盖.

例如,flex-basis: 100pxwidth: 100px加上flex-shrink: 1不一定是flex-basis: 100pxpx.

To render the specified width – and keep it fixed – you will need to disable shrinking:

div {
   width: 100px;
   flex-shrink: 0;
}  

div {
  flex-basis: 100px;
  flex-shrink: 0;
}

或, as recommended by the spec:

flex: 0 0 100px;    /* don't grow, don't shrink, stay fixed at 100px */

7.2. Components of Flexibility

鼓励作者使用flex速记来控制灵活性 而不是直接使用其手写属性,如速记 正确重置所有未指定的组件以容纳common uses个.


浏览器漏洞

一些浏览器在调整嵌套FLEX容器中的FLEX项的大小时遇到问题.

flex-basis ignored in a nested flex container. width works.

使用flex-basis时,容器会忽略其子项的大小,并且子项会溢出容器.但使用width属性时,容器会尊重其子对象的大小,并相应地进行扩展.

参考文献:

示例:


flex items using flex-basis and white-space: nowrap overflow inline-flex container. width works.

在渲染具有white-space: nowrap的同级项时,设置为inline-flex的Flex容器似乎无法识别子项上的flex-basis(尽管它可能只是一个宽度未定义的项).容器不会扩展以容纳物品.

但是当使用width属性而不是flex-basis属性时,容器会考虑其子容器的大小,并相应地进行扩展.这在IE11和Edge中不是问题.

参考文献:

示例:


flex-basis (and flex-grow) not working on table element

参考文献:


flex-basis fails in Chrome and Firefox when the grandparent container is a shrink-to-fit element. The set-up works fine in Edge.

与上面链接中的示例一样,涉及position: absolute,使用floatinline-block也会呈现相同的有缺陷的输出(jsfiddle demo).


影响IE 10和11的错误:

Css相关问答推荐

使用location:stickly将元素固定到其父容器的顶部

视频嵌入在Bootstrap 5轮播中没有响应扩展

主dart 文件未加载Flutter Web

如何将bslib::card()中的扩展按钮移到右上方,其中full_screen = TRUE?

通过使溢出的子元素具有其宽度的100%来防止Flex元素溢出

如何将CSS Paint API与Reaction一起使用

如何将表格单元格的最后一个子级与单元格底部对齐?

如何将下拉面板放置在MAT-SELECT文本框的正下方

用于替代渲染的 CSS 嵌套

使用 display:inline-block 渲染多行文本组件,行间有白色间隙

为什么我的 CSS 需要一个它似乎不需要的大括号?

CSS 使文本扩展并保持居中与圆形扩展 div 的问题

您如何设置 Google Places Autocomplete API 的下拉菜单样式?

CSS类和id同名

如何定位 CSS 网格布局中的特定列或行?

svg 背景图像位置始终在 Internet Explorer 中居中,尽管 background-position: left center;

如何使内容出现在固定的 DIV 元素下方?

如何在 iOS 上获取带有 CSS 溢出的滚动条

为什么在 CSS3 中启用硬件加速会降低性能?

Select 标签的占位符