有关于这方面的问题和文章,但据我所知没有结论。我能找到的最好的总结是
- flex-basis* 允许您在计算任何其他内容之前指定元素的初始/起始大小。它可以是百分比或绝对值。
...它本身并没有说明带有 flex-basis set的元素的行为。以我目前对flexbox的了解,我不明白为什么它不能描述 width。
我想知道 flex-basis 在实践中与 width 有何不同:
- 如果我用 flex-basis 替换 width(反之亦然),视觉上会有什么变化?
- 如果我将两者都设置为不同的值会发生什么?如果它们具有相同的值会发生什么?
- 是否有一些特殊情况,使用 width 或 flex-basis 与使用另一个有显着差异?
- width 和 flex-basis 在与其他flexbox样式(如 flex-wrap、flex-grow 和 flex-shrink)结合使用时有何不同?
- 还有其他显著差异吗?
修改/澄清:这个问题在What exactly flex-basis property sets?中以不同的格式被问到,但我觉得更直接地比较或总结 flex-basis 和 width(或 height)的差异会更好。
6条答案
按热度按时间weylhg0b1#
考虑
flex-direction
在阅读您的问题时,首先想到的是
flex-basis
并不总是适用于width
。当
flex-direction
为row
时,flex-basis
控制宽度。但是当
flex-direction
是column
时,flex-basis
控制高度。关键区别
以下是
flex-basis
和width
/height
之间的一些重要差异:flex-basis
仅适用于flex项目。Flex容器(也不是Flex项)将忽略flex-basis
,但可以使用width
和height
。flex-basis
只在主轴上工作。例如,如果您在flex-direction: column
中,则需要width
属性来水平调整flex项的大小。flex-basis
对绝对定位的flex项没有影响。width
和height
属性是必需的。绝对定位的flex项不参与flex布局。flex
属性,三个属性flex-grow
、flex-shrink
和flex-basis
可以整齐地组合到一个声明中。如果使用width
,同样的规则需要多行代码。浏览器行为
就如何渲染而言,
flex-basis
和width
之间应该没有差异,除非flex-basis
是auto
或content
。7.2.3.
flex-basis
属性对于除
auto
和content
以外的所有值,flex-basis
的解析方式与水平写入模式下的width
相同。但是
auto
或content
的影响可能很小,或者根本没有影响。更多关于spec:auto
当在flex项上指定
auto
关键字时,auto
关键字将检索main size属性的值作为usedflex-basis
。如果该值本身是auto
,则使用的值是content
。content
指示基于Flex项的内容自动调整大小。
auto
与auto
的主尺寸(width
或height
)一起使用,可以实现相同的效果。*因此,根据规范,
flex-basis
和width
的分辨率相同,除非flex-basis
是auto
或content
。在这种情况下,flex-basis
可能会使用内容宽度(width
属性可能也会使用)。flex-shrink
因子记住Flex容器的初始设置是很重要的。其中一些设置包括:
flex-direction: row
- Flex项目将水平对齐justify-content: flex-start
- flex项目将堆叠在主轴上的行的开始处align-items: stretch
- flex项目将扩展以覆盖容器的交叉尺寸flex-wrap: nowrap
- flex项目被强制保持在一行中flex-shrink: 1
-允许伸缩项收缩注意最后一个设置。
因为默认情况下允许收缩flex项(这可以防止它们溢出容器),所以指定的
flex-basis
/width
/height
可能会被覆盖。例如,
flex-basis: 100px
或width: 100px
与flex-shrink: 1
结合,不一定是100 px。要渲染指定的宽度- * 并保持其固定 * -您需要禁用收缩:
或
或者,按照规范的建议:
7.2.灵活性的组成
鼓励作者使用
flex
简写而不是直接使用其手写属性来控制灵活性,因为简写可以正确地重置任何未指定的组件以适应常见用途。浏览器Bug
一些浏览器在调整嵌套的flex容器中的flex项的大小时会遇到问题。
flex-basis
在嵌套的flex容器中被忽略。width
工作。使用
flex-basis
时,容器忽略其子容器的大小调整,子容器溢出容器。但是使用width
属性,容器会考虑其子容器的大小并相应地进行扩展。参考文献:
示例:
使用
flex-basis
和white-space: nowrap
溢出inline-flex
容器的flex项。width
工作。当呈现具有
white-space: nowrap
的同级时,设置为inline-flex
的flex容器似乎无法识别子容器上的flex-basis
(尽管它可能只是一个未定义宽度的项)。容器不会展开以容纳这些项。但是,当使用
width
属性而不是flex-basis
时,容器会考虑其子容器的大小并相应地进行扩展。这在IE11和Edge中不是问题。参考文献:
示例:
flex-basis
(和flex-grow
)无法处理表元素参考文献:
flex-basis
在Chrome和Firefox中当祖父容器是收缩到适合元素时失败。设置在Edge中工作正常。与上面链接中的示例一样,使用
float
和inline-block
也会呈现相同的错误输出(jsfiddle demo)。影响IE 10和11的bug:
flex
无单位值的速记声明flex-basis
不包含box-sizing: border-box
flex-basis
不支持calc()
flex
速记时,忽略flex-basis
上的重要性2guxujil2#
除了Michael_B的精彩总结之外,值得重复的是:
flex-basis允许您在计算任何其他内容之前指定元素的初始/起始大小。它可以是百分比或绝对值。
这里最重要的部分是initial。
就其本身而言,这确实会解析为width/height *,直到 * 其他flex grow/shrink属性开始起作用。
所以...一个有...
最初将是25%宽,但随后立即尽可能多地扩展,直到其他元素被考虑在内。如果没有的话。.它将是100%宽/高。
快速演示:
使用
flex-grow
、flex-shrink
和flex-basis
(或简写为flex :fg fs fb
)进行实验。...会带来一些有趣的结果。m528fe3b3#
flex-basis
和width
(或height
,取决于当前的写入模式)之间有一个关键的区别,除了灵活的大小调整方面(flex-grow: 0; flex-shrink: 0;
)。它源于Flex Layout中的异常,Flex项目的自动最小大小默认为
min-content
,而不是通常的0
。换句话说,默认的min-width: auto
计算为min-content
,而不是0
。结果是
flex-basis
(默认情况下)被min-content
绑定在下面。如果指定一个小于min-content
的值,例如flex-basis: 0
,它将计算为min-content
。这基本上意味着(默认情况下)您不能使框的内容溢出,因为框至少具有内容的大小。这是与
width
的一个关键区别,width
可以将框的大小设置为任意小(默认情况下),因为min-width
默认为0
。如果width
的值小于min-content
,则内容将溢出盒子。规范中提到了这种行为,但只是在7结尾的错误地方的注解中隐式地提到了。1.1.
flex
的基本值。默认情况下,Flex项不会收缩到其最小内容大小(最长单词或固定大小元素的长度)以下。若要更改此属性,请设置min-width或min-height属性。(参见§ 4.5 Flex项目的自动最小大小。)
正如注解中提到的,设置最小大小会降低边界,将其设置为零会有效地禁用它,使
flex-basis
再次按预期运行。但也有缺点。首先,主轴没有最小尺寸属性。您必须为当前
flex-direction
使用正确的min-width
/min-height
或min-block-size
/min-inline-size
属性。如果更改了flex-direction
,则需要再次找到正确的最小大小属性。其次,
flex-basis
不能再用于按比例分配空间,而不是简单地增加其初始大小。有关更多详细信息,请参见规范中的图7。这里有一个最小的例子。设置
min-width: 0
使flex-basis
再次按预期运行。gwbalxhn4#
可能最重要的一点是:
如果浏览器不支持
flex
怎么办?在这种情况下,width/height
接管并应用它们的值。在元素上定义
width/height
是一个非常好的主意--几乎是必不可少的--即使你有一个完全不同的flex-basis
值。请记住,通过禁用display:flex
进行测试,看看您得到了什么。wa7juj8i5#
如果你在 Package 的话就不一样了。
比如说,你把一个子对象设置为
width:0
,并期望它能换行,但这是不可能的。但是对于flex-basis:0
,它会换行。(前提是未隐藏溢出)xfyts7mz6#
如果你设置一个div的
min-width:600px
,如果窗口大小低于600px,你会看到一个水平滚动条,这不是一个好的ux设计。如果你设置它的
flex-basis:600px
,如果窗口大小低于600px,那个盒子会缩小,你不会看到一个水平条。请注意,
flex-basis
仅适用于flex项。