弹性基础和宽度之间有什么区别?

有很多关于这方面的问题和文章,但据我所知,没有任何结论。我能找到的最好的总结是

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

…这本身并不能说明flex basis集合中元素的行为。以我目前对flexbox的了解,我不明白为什么它不能描述宽度

我想知道弹性基础宽度在实践中的具体区别:

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

编辑/澄清:这个问题以不同的格式提出,具体是什么样的flex basis属性集?但我觉得更直接地比较或总结弹性基础和宽度(或高度)的差异会更好

考虑弯曲方向

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

弹性方向时,弹性基准控制宽度

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


关键区别

以下是弹性基础宽度/高度之间的一些重要区别:

  • 弹性基础仅适用于弹性项目。弹性容器(不属于弹性项目)将忽略Flex-basis,但可以使用widthheight

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

  • flex-basis对绝对定位的flex项目没有影响宽度和高度属性是必需的。绝对定位的flex项目不参与flex布局

  • 通过使用flex属性,有三个属性&ndash弹性增长,弹性收缩弹性基础–可以整齐地组合成一个声明。使用宽度,相同的规则将需要多行代码


浏览器行为

就呈现方式而言,flex-basiswidth之间应该没有差异,除非flex-basisautocontent

来自规范:

7.2.3。弹性基础属性

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

但是autocontent的影响可能很小,或者根本没有影响。规范中的更多内容:

自动

在弹性项上指定时,auto关键字检索值
作为所使用的弹性基础的主尺寸属性的。如果该值为
本身auto,则使用的值为content

内容

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

注意:此值在Flexible的初始版本中不存在
框布局,因此一些旧的实现将不支持它。
使用auto
auto的主要尺寸(widthheight

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


弹性收缩系数

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

  • 弹性方向:行-弹性项目将水平对齐
  • justify content:flex start-flex项将堆叠在主轴上的行的开始处
  • 对齐项目:拉伸-弹性项目将扩展以覆盖容器的交叉尺寸
  • flex wrap:nowrap-flex项目被强制保留在一行中
  • 弹性收缩:1-弹性项目允许收缩

注意最后一个设置

由于默认情况下允许弹性项目收缩(防止其溢出容器),因此可以覆盖指定的弹性基准/宽度/高度

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

渲染指定宽度的步骤&ndash并将其固定–您需要禁用收缩功能:

div{
宽度:100px;
弹性收缩:0;
}  

div{
弹性基准:100px;
弹性收缩:0;
}

或者,按照规范的建议:

flex:0 100px;/*不要增长,不要收缩,保持固定在100像素*/

7.2。组成部分
灵活性

鼓励作者使用flex速记控制灵活性
而不是直接用它的速记属性,如速记
正确重置任何未指定的组件,以适应常见的
使用


浏览器错误

某些浏览器无法在嵌套的flex容器中调整flex项的大小

flex-basis在嵌套flex容器中被忽略宽度有效

使用flex basis时,容器忽略其子容器的大小,子容器溢出容器。但是使用width属性,容器会考虑其子容器的大小,并相应地进行扩展

参考资料:

  • Chrome不会根据子项扩展flex父项'内容
  • 使用弹性基准时弹性项目溢出
  • 宽度和弹性基础之间的差异
  • 调整嵌套Flex容器大小时忽略Flex basis
  • 弹性基准:100px与宽度:100px+弹性基准:自动不同

示例:

  • https://jsfiddle.net/t419zhra/ (来源:@Dremora)
  • https://codepen.io/anon/pen/NVxaoy (来源:丹尼尔)
  • https://jsfiddle.net/voc9grx6/ (来源:Chromium Bugs)
  • https://jsfiddle.net/qjpat9zk/ (来源:Chromium Bugs)

使用flex-basiswhite-space:nowrapoverflowinline-flexcontainer来调整项目宽度有效

当使用空白:nowrap呈现兄弟姐妹时,设置为内联flex的flex容器似乎无法识别子级上的flex basis(尽管它可能只是一个宽度未定义的项)。容器不会展开以容纳项目

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

参考资料:

  • 内联flex容器宽度未增长
  • 内联flex容器(显示:内联flex)正在扩展父容器的全宽

例如:

  • https://jsfiddle.net/p18h0jxt/1/ (从上面的第一个帖子)

flex-basis(和flex-grow)不处理表元素

参考资料:

  • 为什么flex box与div一起工作,而不是与表一起工作
  • 为什么't flex grow:1在Safari中为桌子工作?(和边缘)

flex basis在Chrome和Firefox中失败,因为祖父母容器是一个收缩到适合的元素。这个装置在边缘处工作得很好

  • 绝对定位的容器未扩展宽度以适应flexbox内容

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


影响IE 10和11的bug:

  • flex忽略带有无单位flex基值的速记声明
  • flex basis不考虑框大小:边框框
  • flex basis不支持calc()
  • 使用flex速记时,在flex基础上忽略重要性

发表评论