防止 flexbox 收缩

Posted

技术标签:

【中文标题】防止 flexbox 收缩【英文标题】:Prevent flexbox shrinking 【发布时间】:2015-05-23 07:13:09 【问题描述】:

我正在使用 flexbox 来布局页面,因为 growth 行为很有用。但我想完全防止 shrinking 行为。

无论如何要管理这个?

示例代码:

<div class="flex-vertical-container">
    <div class="flex-box">
         This one should grow but not shrink
    </div>
    <div></div>
    <div></div>
</div>

CSS

.flex-vertical-container 
    display: flex;
    flex-direction: column;


.flex-box 
    flex: 1;

【问题讨论】:

Flex 不应该用于整个页面布局。改用网格。 【参考方案1】:

尝试在.flex-box 上将flex-shrink 属性设置为0

【讨论】:

由于某种原因设置flex-shrink: 0; 不起作用,但手动设置:flex-shrink: 1 0 auto; 工作正常... 弹性收缩:1 0 自动;似乎不是有效的属性。 他们可能是指flex: 1 0 auto; 在这种特定情况下,将 flex-shrink 属性设置为 0 似乎是不够的。使用flex-direction:column 时,您还需要设置min-width 值来完成此目标。【参考方案2】:

添加一个min-width,无论您希望该框的最小可能值是什么。 Flexbox 不会将宽度缩小到最小宽度以下。

【讨论】:

min-width 确实可以正常工作,但在响应式设计中,如果它小于指定的空间,它不会随空间调整。不过,flex-shrink 根本不适合我。 此外,safari 仍然使用 min-width 属性来进行 flexbox 行为,导致 IE - Safari 和“其他”之间出现奇怪的跨浏览器问题。检查我可以使用的注释:caniuse.com/#search=flexbox【参考方案3】:

你可以尝试申请给孩子:

.flex-box
    width: max-content;

最终结果:

.flex-vertical-container
  display: flex;
  flex-direction: column;

.flex-vertical-container div
  background: gray;

.flex-box
  width: max-content;
<div class="flex-vertical-container">
    <div class="flex-box">
         This one should grow but not shrink
    </div>
    <div>This is shrinking</div>
    <div>This is shrinking</div>
</div>

【讨论】:

除非您的目标是非常特定的浏览器,否则max-content 不会是一个好的通用选择。 IE 和 Edge 不支持。受 Chrome、Safari 和 Firefox 支持。 caniuse.com/#search=max-content【参考方案4】:

如果您的flex-direction 和我一样是row,请尝试将孩子的宽度设置为 100%。这解决了我的缩小问题。

【讨论】:

【参考方案5】:

Flex-shrink 对我不起作用。

我最终对孩子们使用了white-space: nowrap;

这不适用于所有情况,但如果您的 flex 父级的子级是单行文本,则可能。


(如果使用 TailwindCSS:whitespace-nowrap

【讨论】:

【参考方案6】:

有两种变体可以防止收缩flex-child

设置为 flex-child 这个道具:

    显式支持flex-shrink: 0; 或使用简写flex prop flex: 1 0; /* Two values syntax: flex-grow | flex-basis */

在你的情况下 flex-child.flex-box

【讨论】:

【参考方案7】:

flex-wrap: wrap; 有效 https://jsbin.com/zajojanamo/8/edit?html,css,output

main 
  width: 200px;
  height: 200px;
  background: green;
  display: flex;
  flex-wrap: wrap;


div 
  box-sizing: border-box;
  border: 4px solid;
  padding: 16px;
  width: 50%;
  background: lightblue;
<main>
  <div>a</div>
  <div>b</div>
  <div>c</div>
  <div>d</div>
</main>

【讨论】:

以上是关于防止 flexbox 收缩的主要内容,如果未能解决你的问题,请参考以下文章

防止 Bootstrap 按钮填充 flexbox

Flexbox布局(转)

markdown flexbox收缩和包装

css Flexbox:收缩时切换卡文本轴

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

Flex box 防止溢出并保持右侧项目固定宽度和左侧项目收缩