【问题标题】:CSS flex last incomplete row items take the width of complete row items [duplicate]CSS flex最后一个不完整的行项目采用完整行项目的宽度[重复]
【发布时间】:2016-04-04 22:32:31
【问题描述】:

我正在创建一个弹性盒子;一个容器有一个max-width,比如max-width = 500px,每个子项都有min-width: 130pxflex-grow: 1 来填充整个行空间。

这是小提琴:https://jsfiddle.net/7wroxkhj/6/

我想要实现的是,最后一行项目的宽度与前面的项目相同。即:项目 #7 和项目 #8 具有相同的项目宽度从 1 到 6。

我怎样才能做到这一点?

更新:

欢迎 JS 解决方案!

【问题讨论】:

  • 如果容器有一个固定的宽度,为什么不给这个孩子使用一个固定的宽度呢?
  • 其实容器有max-width而不是width,所以实际上并不是固定宽度。
  • 你为什么要隐藏这个细节?
  • 这是一个错误。同样,它是 max-width 而不是 width,更新了我的问题。

标签: javascript jquery css flexbox


【解决方案1】:

为顶部伪元素赋予与赋予元素相同的属性,但高度非常低。

但如果需要超过 2 个伪元素,则需要另一种技术

.parent {
  background: red;
  max-width: 500px;
  height: 400px;
  display: flex;
  flex-wrap: wrap;
}
.parent::after {
  content: '';
  flex: 130px 1;
  margin: 10px;
  background-color: yellow;
  height: 10px;
}
.child {
  background: blue;
  margin: 10px;
  flex: 130px 1;
  color: #FFFFFF;
  text-align: center;
  line-height: 50px;
  font-size: 60px;
}
<div class="parent">
  <div class="child">1</div>
  <div class="child">2</div>
  <div class="child">3</div>
  <div class="child">4</div>
  <div class="child">5</div>
  <div class="child">6</div>
  <div class="child">7</div>
  <div class="child">8</div>
</div>

请注意,pseudo 的实际高度是 0px,并且背景黄色不会在那里......

这些仅用于演示目的

编辑:FF 处理最小高度来自 min-height 的情况和来自 flex-basis 的情况不同。但是 Chrome 处理这些都是一样的。所以我之前的解决方案只适用于 Chrome。 (不确定哪个是“标准”。

我更改了 .child 的最小高度并将其移至 flex-basis,现在它在 Chrome 和 FF 中都可以正常工作。

【讨论】:

【解决方案2】:

更新

好吧,我终于明白为什么 OP 对所有事情的看法都与我不同。我使用的是 Chrome,而 OP 使用的是 Firefox。以下是应该兼容 Chrome 和 Firefox 的最新演示。

  • 主要变化包括将整个布局包装在一个 flex-column 容器中。
  • 删除了 margins: 10px;,因为带有 box-sizing 的 flexbox 无法按预期处理边距或边框。
  • 使用过多的最小和最大高度和宽度属性。
  • 在列和行方向上使用了justify-content: space-betweenalign-items: space-between,形成了一个紧凑而灵活的网格。

https://jsfiddle.net/zer00ne/fkczpggy/

.case {
  background: red;
  display: flex;
  flex-flow: column wrap;
  justify-content: space-between;
  align-items: space-around;
  margin: auto 0;
  max-width: 500px;
  overflow-y: auto;
}

.parent {
  background: red;
  height: 99vh;
  min-height: 100%;
  max-width: 500px;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: space-between;
  flex: 0 1 auto;
  overflow-y: auto;
}

.child {
  background: blue;
  min-width: 130px;
  min-height: 130px;
  border: 1% solid transparent;
  color: #FFFFFF;
  height: auto;
  text-align: center;
  font-size: 60px;
  flex: 1 0 10%;
  margin: 1%;
}

.child:last-of-type {
  visibility: hidden;
}
 <section class="case">
  <div class="parent">
<div class="child">1</div>
<div class="child">2</div>
<div class="child">3</div>
<div class="child">4</div>
<div class="child">5</div>
<div class="child">6</div>
<div class="child">7</div>
<div class="child">8</div>
<div class="child">9</div>
  </div>
</section>



这是一个懒惰但有效的方法:

已更新以反映 div 的动态可变数量

使用 nth-of-type(n+9) 或者这样会更好: last-of-type

  1. 添加第 9 个 div

  2. 然后将这一行添加到您的 CSS 中:

    .child:nth-of-type(n+9) {
      visibility: hidden;
    }
    

    .child:last-of-type {
      visibility: hidden;
    }
    

https://jsfiddle.net/zer00ne/4fp88arh/

.parent {
  background: red;
  max-width: 500px;
  height: 400px;
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-start;
}
/*.parent:after {
  content: '';
  flex-grow: 1000000000;
}*/

.child {
  background: blue;
  min-width: 130px;
  margin: 10px;
  flex-grow: 1;
  color: #FFFFFF;
  text-align: center;
  line-height: 50px;
  font-size: 60px;
}

/*.child:nth-of-type(n+9) {
  visibility: hidden;
}*/

 .child:last-of-type {
   visibility: hidden;
 }
<div class="parent">
  <div class="child">1</div>
  <div class="child">2</div>
  <div class="child">3</div>
  <div class="child">4</div>
  <div class="child">5</div>
  <div class="child">6</div>
  <div class="child">7</div>
  <div class="child">8</div>
  <div class="child"></div>

</div>

【讨论】:

  • 为什么投反对票?我的回答与 Michael_D 的回答一样有效。
  • 它的有效性如何?结果如下:imgur.com/YyanRML
  • 你有没有看我的演示,因为我看到的是这样的:imgur.com/a/xwps3
  • @user1181378 好的,我知道发生了什么事,我使用的是 Chrome,而您一定使用的是 Firefox。好的,我已经做了一些跨浏览器测试,我相信这会奏效。请查看更新。
【解决方案3】:

您可能需要考虑列表末尾的不可见弹性项目。

HTML

<div class="parent">
    <div class="child">1</div>
    <div class="child">2</div>
    <div class="child">3</div>
    <div class="child">4</div>
    <div class="child">5</div>
    <div class="child">6</div>
    <div class="child">7</div>
    <div class="child">8</div>
    <div class="child hidden">9</div>  /* new */
    <div class="child hidden">10</div> /* new */
</div>

CSS

.hidden {
    visibility: hidden;
    height: 0;
    font-size: 0;
    margin: 0 10px;
}

DEMO

【讨论】:

  • 这仅适用于预期数量的项目。
  • 其实这个方案不依赖于项数。尝试在演示中添加和删除 div(始终将隐藏的 div 保留在最后)。
  • 此解决方案利用容器的max-width 和每个项目的min-width,这会导致每行中的项目数量可预测。
  • 刚刚再次测试了一切。似乎工作得很好(容器高度问题除外,这取决于您的偏好)。如果我误解或遗漏了什么,请告诉我。
  • 没有。使用虚拟子元素解决了它。不过不必使用隐藏类。
猜你喜欢
  • 2017-01-20
  • 2019-03-29
  • 1970-01-01
  • 2020-07-09
  • 2018-10-24
  • 2019-03-04
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
相关资源
最近更新 更多