在 flexbox 布局中,交叉轴是不是有 `flex-shrink: 0` 声明?

Posted

技术标签:

【中文标题】在 flexbox 布局中,交叉轴是不是有 `flex-shrink: 0` 声明?【英文标题】:In a flexbox layout, is there a `flex-shrink: 0` declaration for the cross axis?在 flexbox 布局中,交叉轴是否有 `flex-shrink: 0` 声明? 【发布时间】:2015-05-21 08:21:21 【问题描述】:

我想防止 flex 容器中的元素在不是 flex-direction 的维度上收缩。以下示例将<article> 元素并排排列成一行。当可用垂直空间减少时,这些元素不会强制它们的 flex 容器显示滚动条;而是内容溢出了元素边界。

屏幕截图 1 - 有足够的水平和垂直空间来显示所有内容:

屏幕截图 2 - 减少的垂直空间将元素边框向上推:

屏幕截图 3 - 垂直空间进一步缩小,容器最终获得滚动条:

屏幕截图 4 - 如果没有 flex-shrink:0,元素宽度(主 flex 轴)也会减小:

flex-shrink:0可以防止水平收缩,但是如何防止元素垂直收缩呢?

<article> 元素overflow: auto 或类似的东西不会给出想要的结果(= 容器上的滚动条)。理想情况下,显示应该是这样的蒙太奇:

如果我事先知道元素的高度,我可以给它们一个min-height,但情况并非总是如此。

FIDDLE: http://jsfiddle.net/twdan8u8/

HTML:

<main>
    <article>article<br>article<br>article</article>
    <article>article<br>article<br>article</article>
</main>

CSS:

* 
    box-sizing: border-box; /* not the culprit */

html 
    height: 100%;

body 
    position: relative;
    height: 100%;
    margin: 0;
    background: #999;

main 
    overflow: auto;
    background: gold;
    display: flex;
    height: 80%;
    padding: 50px 30px;

article 
    flex-shrink: 0;
    font-size: 28px;
    border: 2px solid red;
    margin-right: 30px;
    padding: 10px;

【问题讨论】:

【参考方案1】:

通常情况下,当我写完问题时,我找到了(或者更确切地说是a)解决方案。由于这可能对其他人有所帮助,因此我发现了以下内容:

如果为 flex 容器指定样式 align-items: flex-start,则元素高度不会降低,并且容器会在必要时获得滚动条(假设有合适的 overflow 值)。

此属性的默认值为“拉伸”。也可以使用align-self 在单个弹性元素上设置它。缺点是元素现在不再同样高(即,它们不再拉伸到完整的可用高度)。

【讨论】:

以上是关于在 flexbox 布局中,交叉轴是不是有 `flex-shrink: 0` 声明?的主要内容,如果未能解决你的问题,请参考以下文章

RN布局-Flexbox

彻底搞懂弹性布局flex

flex 布局学习记录

React Native - 2 控件Flexbox

css flexbox wrapping:模拟伪类来选择主轴/交叉轴上的开始/结束项目?

React Native布局