考虑 flex-direction
阅读问题时首先想到的是,flex-basis
这并不总是适用于width
。
当flex-direction
是row
,flex-basis
控制宽度。
但是,当flex-direction
是column
,flex-basis
控制高度。
关键差异
以下是flex-basis
和width
/ 之间的一些重要区别height
:
flex-basis
仅适用于弹性商品。Flex容器(也不是flex项目)将忽略,flex-basis
但可以使用width
和height
。
flex-basis
仅在主轴上起作用。例如,如果您在中flex-direction: column
,则width
需要该属性以水平调整弹性项目的大小。
flex-basis
对绝对放置的弹性项目没有影响。width
和height
属性将是必要的。绝对定位的弹性项目不参与弹性布局。
通过使用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
可能很小或根本没有影响。规格中的更多内容:
auto
在弹性商品上指定时,auto
关键字将检索main size属性的值作为used flex-basis
。如果该值本身是auto
,则使用的值为content
。
content
指示根据弹性项目的内容自动调整大小。
注意:此值在“ Flexible Box Layout”的初始发行版中不存在,因此某些较早的实现不支持该值。可以通过将auto
主尺寸(width
或height
)与一起使用来达到同等效果auto
。
因此,根据规范,flex-basis
并进行width
相同的解析,除非flex-basis
是auto
或content
。在这种情况下,flex-basis
可以使用内容宽度(大概也可以使用该width
属性的宽度)。
该flex-shrink
因素
记住Flex容器的初始设置很重要。其中一些设置包括:
flex-direction: row
-伸缩项目将水平对齐
justify-content: flex-start
-flex项目将堆叠在主轴线的开始处
align-items: stretch
-伸缩物品将扩展以覆盖容器的横向尺寸
flex-wrap: nowrap
-弹性项目被迫停留在一行
flex-shrink: 1
-伸缩项目允许收缩
注意最后的设置。
因为默认情况下允许弹性项目收缩(这可以防止它们溢出容器),所以指定的flex-basis
/ width
/ height
可能会被覆盖。
例如, flex-basis: 100px
或width: 100px
与结合使用flex-shrink: 1
,不一定是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。灵活性的组成部分
鼓励作者使用flex
速记而不是直接使用其速记属性来控制灵活性,因为速记会正确重置任何未指定的组件以适应常见用途。
浏览器错误
某些浏览器无法在嵌套的flex容器中调整flex项的大小。
flex-basis
在嵌套的flex容器中被忽略。width
作品。
使用时flex-basis
,容器将忽略其子容器的大小,并且子容器会溢出容器。但是在拥有该width
属性的情况下,该容器尊重其子级的大小并相应地扩展。
参考文献:
例子:
使用flex-basis
和white-space: nowrap
溢出inline-flex
容器显示项目。 width
作品。
似乎将设置为的flex容器在与呈现同级时inline-flex
无法flex-basis
在子对象上识别white-space: nowrap
(尽管它可能只是宽度未定义的项目)。容器不会扩展以容纳物品。
但是,当使用该width
属性代替时flex-basis
,容器会尊重其子级的大小并相应地扩展。在IE11和Edge中这不是问题。
参考文献:
例:
flex-basis
(和flex-grow
)不适用于表格元素
参考文献:
flex-basis
当祖父母容器是缩小至适合元素时,在Chrome和Firefox中失败。该设置在Edge中工作正常。
就像在上面的链接中提供的示例一样,包含position: absolute
,使用float
和inline-block
也将呈现相同的有缺陷的输出(jsfiddle demo)。
影响IE 10和11的错误: