css 使用间距和边距左对齐flexbox的最后一行[重复]

bihw5rsg  于 2023-10-21  发布在  其他
关注(0)|答案(3)|浏览(115)

此问题已在此处有答案

Sizing flex items on the last row(10个答案)
六年前就关门了。
我在一个容器中有一个未知数量的元素,它们需要 Package ,外部没有边距,但它们之间的边距最小。
我还需要这些都是合理的space-between和最后一行左对齐。
我试着用flexbox这样做:

.outside {
  border: 1px solid black;
}
.container {
  margin: -5px;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}
.container:after {
  content: '';
  flex: auto;
}
.box {
  background: red;
  width: 50px;
  height: 50px;
  margin: 5px;
}
<div class="outside">
  <div class="container">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
  </div>
</div>

View JSFiddle
这是正确的,除了最后一行的间距是关闭的,正如你在屏幕截图中看到的:

如果我们不知道会有多少列,有没有什么方法可以让它工作(使用flexbox或其他东西而不是JavaScript)?

pcrecxhr

pcrecxhr1#

最后一行对齐是flexbox的一个常见问题。
一种可以考虑的方法是在最后一个可见项之后使用不可见的Flex项。简而言之,我称它们为“跟踪幻影项”。

.outside {
  border: 1px solid black;
}
.container {
  margin: -5px;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}
.container:after {
  content: '';
  flex: auto;
}
.box {
  background: red;
  width: 50px;
  height: 50px;
  margin: 5px;
}

.hidden {
  visibility: hidden;
  margin: 0 5px;
  height: 0;
}
<div class="outside">
  <div class="container">
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
    <div class="box hidden"></div>
  </div>
</div>
vfwfrxfs

vfwfrxfs2#

Michael是对的,问题是你不能先做space-between,然后再选择最后一行为flex-start。但对我来说突出的部分是指定的宽度。这很重要吗
如果没有,通常的方法是使用媒体查询来控制每行显示多少项。您可以设置大量的媒体查询步骤,以确保项目不拉伸太多,但这样的空间之间更紧密地排队与您的正常网格排水沟,它使“最后一行问题”消失。你觉得这有用吗?
示例:http://codepen.io/anon/pen/JbpPKa

yduiuuwa

yduiuuwa3#

Stack Overflow不允许我对Michael_B的回答发表评论,但我确实想说明如何使用JavaScript来计算要追加的幻影元素的数量,以供任何试图解决这个问题的人使用。

/**
  * @param {Integer} numElements The number of elements you're displaying.
  * @param {Number} element Width Width, in pixels, of each element.
  * @param {Number} margin Width, in pixels. Your minimum target margin between items. 2x the margin on each individual item.
  * @param {Number} containerWidth Width, in pixels, of the containing element.
*/
  const getNumPhantomElements = ({numElements, elementWidth, margin, containerWidth}) => {
  const elementsPerRow = Math.floor(containerWidth / (elementWidth + margin));
  const elementsInLastRow = numElements % elementsPerRow;
  const numPhantomElements = elementsPerRow - elementsInLastRow;

  return numPhantomElements;
};

在这种情况下:

const containerWidth = document.querySelector('.container').offsetWidth;
  const numPhantomElements = getNumPhantomElements({
   numElements: 21,
   elementWidth: 50,
   margin: 10, // 2x 5px margin on each box
   containerWidth
}); // Append this many elements (output depends on your viewport size)

相关问题