【问题标题】:How to change the arrangement of elements depending on the number of elements in CSS?如何根据 CSS 中元素的数量来改变元素的排列方式?
【发布时间】:2020-03-11 07:32:30
【问题描述】:

我有一个这样的 CSS。

我想根据卡片的元素个数动态改变卡片的位置到中心或右对齐:

.section {
  display: flex;
  flex-wrap: wrap;
  background-color: #ffabaf;
  max-width: 80vw;
}

.card {
  width: 90px;
  height: 90px;
  background-color: #afafbb;
  border: 3px solid;
}
<div class="section">
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
</div>

例如,当卡片元素的数量为3或更少时,我想像这样将元素居中:

.section {
  display: flex;
  flex-wrap: wrap;
  background-color: #ffabaf;
  max-width: 80vw;
  justify-content: center;
}

.card {
  width: 90px;
  height: 90px;
  background-color: #afafbb;
  border: 3px solid;
}
<div class="section">
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
</div>

当卡片元素数量为4个或更多时,我想像这样将元素左对齐或右对齐:

.section {
  display: flex;
  flex-wrap: wrap;
  background-color: #ffabaf;
  max-width: 80vw;
  /* justify-content: left; OR*/
  justify-content: right;
}

.card {
  width: 90px;
  height: 90px;
  background-color: #afafbb;
  border: 3px solid;
}
<div class="section">
  <div class="card">1</div>
  <div class="card">2</div>
  <div class="card">3</div>
  <div class="card">4</div>
  <div class="card">5</div>
  <div class="card">6</div>
</div>

我尝试使用 Flex、Grid 来实现这些,但我做不到。是否可以使用 CSS、Flexbox 或 Grid Layout 来实现上述操作?

【问题讨论】:

标签: html css flexbox css-grid


【解决方案1】:

使用额外的包装器,您可以这样做:

.wrapper {
  text-align: center;
  background-color: #ffabaf;
  max-width: 80vw;
  margin:10px;
}

.section {
  display: inline-flex;
  flex-wrap: wrap;
}

.card {
  width: 90px;
  height: 90px;
  background-color: #afafbb;
  border: 3px solid;
}
<div class="wrapper">
  <div class="section">
    <div class="card"></div>
  </div>
</div>


<div class="wrapper">
  <div class="section">
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
  </div>
</div>

<div class="wrapper">
  <div class="section">
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
    <div class="card"></div>
  </div>
</div>

如果你真的想用元素的数量来控制它,你可以考虑nth-child() 和使用边距居中:

.section {
  display: flex;
  flex-wrap: wrap;
  background-color: #ffabaf;
  max-width: 80vw;
  margin: 10px;
}

.card {
  width: 90px;
  height: 90px;
  background-color: #afafbb;
  border: 3px solid;
}
/* 1 */
.card:first-child:nth-last-child(1) {
  margin:auto;
}
/* 2 */
.card:first-child:nth-last-child(2) {
  margin-left:auto;
}
.card:last-child:nth-child(2) {
  margin-right:auto;
}
/* 3 */
.card:first-child:nth-last-child(3) {
  margin-left:auto;
}
.card:last-child:nth-child(3) {
  margin-right:auto;
}
<div class="section">
  <div class="card"></div>
</div>

<div class="section">
  <div class="card"></div>
  <div class="card"></div>
</div>

<div class="section">
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
</div>

<div class="section">
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
</div>

另一种语法如下:

.section {
  display: flex;
  flex-wrap: wrap;
  background-color: #ffabaf;
  max-width: 80vw;
  margin: 10px;
}

.card {
  width: 90px;
  height: 90px;
  background-color: #afafbb;
  border: 3px solid;
}

.card:first-child:nth-last-child(1),
.card:first-child:nth-last-child(2),
.card:first-child:nth-last-child(3){
  margin-left:auto;
}
.card:last-child:nth-child(1),
.card:last-child:nth-child(2),
.card:last-child:nth-child(3){
  margin-right:auto;
}
<div class="section">
  <div class="card"></div>
</div>

<div class="section">
  <div class="card"></div>
  <div class="card"></div>
</div>

<div class="section">
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
</div>

<div class="section">
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
  <div class="card"></div>
</div>

【讨论】:

  • 你可以用:only-child代替:first-child:last-child
  • @OriDrori 是的,但我想保持相同的视觉模式,以便我们可以清楚地看到从 1 到 3 的技巧
  • 我喜欢第二个 sn-p:非常有趣的方法结合了这样的子选择器。 :-)
  • 感谢您的回答。为了更简洁的描述,我首先考虑了 sn-p 方法。但是,当最新版本的 Firefox 中超过四个时(有或没有justify-content 属性),sn-p 不起作用。我需要其他样式吗?
  • 我对这种行为进行了截图:imgur.com/pAUJQtE
【解决方案2】:

您无法确定一个元素在 css 中有多少个子元素,因此您需要一些 javaScript。在以下示例中,justify: center; 样式位于其自己的类 few-items-layout 中。该脚本正在 onLoad 执行,并在 .cards 容器上设置类,只要其子项的数量为 3 或更少:

HTML

<section class="cards">
  <div class="card">1</div>
  <div class="card">2</div>
  <div class="card">3</div>
  <div class="card">4</div>
  <div class="card">5</div>
  <div class="card">6</div>
</section>

CSS

.cards {
  display: flex;
  flex-wrap: wrap;
  background-color: #ffabaf;
  max-width: 80vw;
}

.cards.few-items-layout {
  justify-content: center;
}

.card {
  width: 90px;
  height: 90px;
  background-color: #afafbb;
  border: 3px solid;
}

javaScript

(function setLayoutClass() {
  let fewItemsLayoutClass = 'few-items-layout',
      cardsContainer = document.querySelector('.cards'),
      cardsAmount = document.querySelectorAll('.card').length;

  cardsContainer.classList.remove(fewItemsLayoutClass);

  if(cardsAmount <= 3) {
    cardsContainer.classList.add(fewItemsLayoutClass);
  }
})();

【讨论】:

    猜你喜欢
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2020-11-01
    • 2021-11-01
    • 2014-12-27
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多