考虑flex-direction
读到你的问题时,我首先想到的是,弹性基准并不总是适用于宽度。
当弯曲方向为行时,弯曲基控制宽度。
但当弯曲方向为圆柱时,弯曲基控制高度。
关键的不同点
下面是弹性基准和宽度/高度之间的一些重要区别:
flex-basis applies only to flex items. Flex containers (that aren't also flex items) will ignore flex-basis but can use width and height.
flex-basis works only on the main axis. For example, if you're in flex-direction: column, the width property would be needed for sizing flex items horizontally.
flex-basis has no effect on absolutely-positioned flex items. width and height properties would be necessary. 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.
浏览器的行为
就它们的呈现方式而言,flex- base和width之间应该没有区别,除非flex- base是auto或content。
来自规范:
7.2.3. 弹性基的性质
对于auto和content以外的所有值,flex-basis的解析方式与水平书写模式中的width相同。
但auto或content的影响可能很小,甚至根本没有影响。更多来自规范:
auto
When specified on a flex item, the auto keyword retrieves the value
of the main size property as the used flex-basis. If that value is
itself auto, then the used value is content.
content
Indicates automatic sizing, based on the flex item’s 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 auto together with a
main size (width or height) of auto.
因此,根据规范,flex- base和width的解析是相同的,除非flex- base是auto或content。在这种情况下,flex- base可以使用内容宽度(想必width属性也会使用)。
伸缩系数
记住flex容器的初始设置非常重要。这些设置包括:
弯曲方向:行-弯曲项目将水平对齐
调整-内容:flex-start - flex项目将堆叠在主线上的行开始处
对齐项目:拉伸-伸缩项目将展开以覆盖容器的交叉尺寸
弹性包裹:nowrap -弹性物品被强制保持在一条直线上
弹性收缩:1 -一个弹性项目被允许收缩
注意最后一个设置。
因为默认情况下允许收缩flex项(这可以防止它们溢出容器),所以指定的flex- base / width / height可能会被覆盖。
例如,flex- base: 100px或width: 100px,加上flex-shrink: 1,不一定是100px。
要渲染指定的宽度-并保持它固定-你需要禁用收缩:
div {
width: 100px;
flex-shrink: 0;
}
OR
div {
flex-basis: 100px;
flex-shrink: 0;
}
或,如规范所推荐的:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
7.2. 的组件
灵活性
鼓励作者使用伸缩简写来控制灵活性
而不是直接用它的速记属性
正确地重置任何未指定的组件以适应公共
用途。
浏览器的bug
有些浏览器在调整嵌套伸缩容器中的伸缩项大小时遇到问题。
在嵌套的flex容器中忽略flex基础。宽度的作品。
使用弹性基准时,容器会忽略子容器的大小,子容器会溢出容器。但是使用width属性,容器会尊重子容器的大小并相应地进行扩展。
引用:
Chrome不会根据孩子的内容扩展伸缩父母
使用Flex -basis时,Flex项溢出
宽度和弹性基之间的区别
在调整嵌套伸缩容器的大小时,会忽略flex - base。
flex- base:100px与width:100px+flex- base: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)
使用Flex -basis和white-space的伸缩项:nowrap overflow内联伸缩容器。宽度的作品。
当呈现带有white-space: nowrap的兄弟容器时,设置为inline-flex的伸缩容器似乎不能识别子容器上的flex- base(尽管它可能只是一个宽度未定义的项)。容器不会扩展以容纳这些物品。
但是当使用width属性而不是基于flex时,容器会尊重其子容器的大小并相应地进行扩展。这在IE11和Edge中不是问题。
引用:
内联伸缩容器宽度不增长
内联伸缩容器(display: Inline -flex)正在展开父容器的全宽度
例子:
https://jsfiddle.net/p18h0jxt/1/(来自上面的第一篇文章)
flex- base(和flex-grow)不适用于表元素
引用:
为什么flex-box可以使用div,而不能使用表?
为什么flex-grow: 1不能在Safari中为表工作?(边缘)
在Chrome和Firefox中,当祖父容器是收缩到适合的元素时,flex-basis会失败。这种设置在Edge中运行良好。
绝对定位的容器没有扩大宽度以适应flexbox内容
就像上面链接中给出的例子一样,涉及position: absolute,使用float和inline-block,也会呈现同样有缺陷的输出(jsfiddle演示)。
影响ie10和ie11的bug:
具有无单位Flex基值的Flex简写声明将被忽略
弹性基准没有考虑box-sizing: border-box
flex基础不支持calc()
在使用伸缩简写时,在伸缩基础上忽略了重要性