css - flex-basis和width有什么区别?

标签 css css3 flexbox

关于这一点,有很多问题和文章,但据我所知,没有什么结论。我能找到的最好的总结是
flex basis允许您在计算任何其他元素之前指定元素的初始/起始大小。它可以是百分比,也可以是绝对值。
…这本身并没有说明使用flex基集的元素的行为。以我目前对flexbox的了解,我不明白为什么不能同时描述宽度。
我想知道在实践中弹性基础和宽度到底有什么不同:
如果我将宽度替换为弹性基础(反之亦然),视觉上会有什么变化?
如果我将两者设置为不同的值,会发生什么情况?如果它们有相同的价值会发生什么?
在某些特殊情况下,使用宽度或弹性基础与使用其他基础有显著差异吗?
当与其他flexbox样式(如flex wrap、flex grow和flex shrink)结合使用时,宽度和flex basis有何不同?
还有其他显著差异吗?
编辑/澄清:这个问题在What exactly flex-basis property sets?中以不同的格式提出,但我觉得更直接地比较或总结弹性基础和宽度(或高度)的差异会更好。

最佳答案

考虑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项的大小。
flex-basis对绝对定位的弹性项目没有影响。widthheight属性是必需的。Absolutely-positioned flex items do not participate in flex layout
通过使用flex属性,可以将flex-growflex-shrinkflex-basis三个属性巧妙地组合成一个声明。使用width,同一规则将需要多行代码。
浏览器行为
就渲染方式而言,flex-basiswidth之间应该没有区别,除非flex-basisautocontent
从规范:
7.2.3. The flex-basis property
对于除autocontent之外的所有值,flex-basis的解析方式与水平写入模式中的width相同。
但是autocontent的影响可能很小,或者根本没有影响。规范中的更多内容:
auto
在flex项上指定时,auto关键字将检索该值
的主大小属性。如果这个值是
本身flex-basis,则使用的值为auto
content
表示根据flex项的内容自动调整大小。
注意:此值不存在于最初的柔性版本中。
Box布局,因此一些较旧的实现将不支持它。
content
auto的主要大小(widthheight)。
因此,根据规范,autoflex-basis的解析是相同的,除非widthflex-basisauto。在这种情况下,content可能会使用内容宽度(也可能会使用flex-basis属性)。
width因子
记住flex容器的初始设置很重要。其中一些设置包括:
flex-shrink-弹性项将水平对齐
flex-direction: row > Flex项将在主轴上的行开始堆栈。
justify-content: flex-start-柔性项目将扩展以覆盖容器的交叉尺寸
align-items: stretch-弹性项被迫保持在一行中
flex-wrap: nowrap-允许弹性项收缩
注意最后的设置。
由于默认情况下允许flex项收缩(这可以防止它们溢出容器),因此可以覆盖指定的flex-shrink: 1/flex-basis/width
例如,heightflex-basis: 100px加上width: 100px,不一定是100px。
要渲染指定的宽度并保持其固定,需要禁用收缩:

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

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

或者,按照规范的建议:
flex: 0 0 100px;    /* don't grow, don't shrink, stay fixed at 100px */

7.2. Components of Flexibility
鼓励作者使用flex-shrink: 1速记来控制灵活性。
而不是像速记那样直接用它的长笔性质
正确重置任何未指定的组件以适应common uses
浏览器错误
有些浏览器在调整嵌套flex容器中flex项的大小时遇到问题。
flex在嵌套的flex容器中被忽略。flex-basis有效。
使用width时,容器忽略其子级的大小,子级会溢出容器。但使用flex-basis属性时,容器会尊重其子级的大小并相应地扩展。
参考文献:
Chrome does not expand flex parent according to children's content
Flex item overflowing when using flex-basis
Difference between width and flex-basis
Flex-basis is being ignored when sizing nested flex containers.
flex-basis:100px does something different from width:100px+flex-basis:auto
示例:
https://jsfiddle.net/t419zhra/(来源:@Dremora
https://codepen.io/anon/pen/NVxaoy(来源@Daniel
https://jsfiddle.net/voc9grx6/(来源:Chromium Bugs
https://jsfiddle.net/qjpat9zk/(来源:Chromium Bugs
使用widthflex-basis溢出white-space: nowrap容器调整项目。inline-flex有效。
设置为width的flex容器在呈现具有inline-flex的同级对象时似乎无法识别子对象上的flex-basis(尽管它可能只是宽度未定义的项)。容器无法扩展以容纳项目。
但是当使用white-space: nowrap属性而不是width时,容器会尊重其子级的大小并相应地扩展。这在IE11和Edge中不是问题。
参考文献:
inline flex container width not growing
Inline flex container (display: inline-flex) is expanding the full width of parent container
例子:
https://jsfiddle.net/p18h0jxt/1/(从上面第一个帖子开始)
flex-basis(和flex-basis)不处理表元素
参考文献:
Why does flex-box work with a div, but not a table?
Why doesn't flex-grow: 1 work for a table in Safari?(和Edge)
影响IE 10和11的错误:
flex-grow shorthand declarations with unitless flex values are ignored
flex-basis doesn't account for flex-basis
box-sizing: border-box doesn't support flex-basis
Importance is ignored on calc() when using flex-basis shorthand

关于css - flex-basis和width有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39949667/

相关文章:

css - 垂直居中文本并删除文本下方的边距

其他浏览器(IE、Mozilla、Opera)的 CSS -webkit-filter

html - 将 flex 元素定位到最后一行或特定行

css - flex-basis和width有什么区别?

html - 为什么当我向它添加显示 flex 时元素垂直居中?

html - Flexbox 无法移动内容

html - 占位符在 Firefox 中无法正常工作

html - 将 div 缩小到其水平中心

html - CSS-为什么我的内容无法滚动?

css - 如何在 Flutter 行/列中重现 CSS flex-grow 空间分布行为?