CSS Flexbox 样式根据元素数量变化

Posted

技术标签:

【中文标题】CSS Flexbox 样式根据元素数量变化【英文标题】:CSS Flexbox style changes based on amount of elements 【发布时间】:2020-08-22 02:02:32 【问题描述】:

我正在尝试学习 Flexbox,但在此练习中遇到了问题。任务是有一个 div,里面有 2 到 4 个 div。当有 2 或 3 个 div 时,它们应该被等宽分割,并且都应该是主 div 的高度。但是当主 div 内有 4 个 div 元素时,它们将位于两行中,每行包含两个 div。

我怎样才能做到这一点?我自己尝试了一些,但我无法让它工作:

<div id="wrapper">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>

这是我创建的 CSS:

#wrapper
  width: 100%;
  height: 100%;

  display: flex;
  flex-wrap: wrap;


.item
  min-width: 33%;

包装器 Div 中包含 2 个元素的外观图片

包装器 Div 内的 3 个元素的外观图片

包装器 Div 中包含 4 个元素的外观图片

【问题讨论】:

【参考方案1】:

考虑nth-child 来控制这个:

#wrapper 
  height: 100vh;
  display: flex;
  flex-wrap: wrap;
  border:5px solid white;
  box-sizing:border-box;



.item 
  flex-grow:1;


/* apply when there is 4 items */
#wrapper > :first-child:nth-last-child(4),
#wrapper > :first-child:nth-last-child(4) ~ *
  flex-basis:50%;


body 
  margin:auto;
<div id="wrapper">
  <div class="item" style="background:red;"></div>
  <div class="item" style="background:blue;"></div>
</div>
<div id="wrapper">
  <div class="item" style="background:red;"></div>
  <div class="item" style="background:blue;"></div>
  <div class="item" style="background:green;"></div>
</div>
<div id="wrapper">
  <div class="item" style="background:red;"></div>
  <div class="item" style="background:blue;"></div>
  <div class="item" style="background:green;"></div>
  <div class="item" style="background:yellow;"></div>
</div>

【讨论】:

击败我 :)。我发现这个问题很有帮助:***.com/a/12198561/8031815。此外,2n 比 4 更具有可扩展性。 非常感谢!有没有办法用隐藏元素做到这一点? @Stephen 你是如何隐藏它们的?显示:无?【参考方案2】:

尝试将以下内容更改为您的 CSS

.item
  min-width: 33%;
  flex-grow: 1;


.item:first-child:nth-last-child(4),
.item:first-child:nth-last-child(4) ~ .item 
    min-width: 50%;

这仅适用于 CSS3。您可以想象将其缩放为带有额外条目的更多项目

【讨论】:

谢谢!有没有办法用隐藏元素做到这一点?

以上是关于CSS Flexbox 样式根据元素数量变化的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 flexbox CSS 的水平砌体布局[重复]

根据兄弟元素的数量来设置样式(CSS揭秘学习笔记)

CSS样式如何修改

CSS样式如何修改

怎样能使父元素随子元素的高度变化而变化(css样式

CSS flexbox:使用深度嵌套的图像来摊销不断变化的布局尺寸