【问题标题】:Get the number of elements in the first row of a flex element获取flex元素第一行的元素个数
【发布时间】:2021-10-27 14:12:25
【问题描述】:

正如我在问题标题中所问的那样,有没有一种方法可以获取 flex 元素第一行中元素的数量?

下面是显示我的问题的图片。

我需要第一次换行之前的图片数量(在本例中为 5),因为我想更改整行(这里是 5 个元素,但更大的屏幕可能是 7 个)。我怎样才能得到这个号码?我真的不知道,所以希望你能帮助我。

如果你想看代码,请在 cmets 中告诉我。

谢谢

【问题讨论】:

  • 能否也为 Li 元素添加 CSS,它可能会有所帮助
  • 获取容器的width和一个元素的width,然后将容器的宽度除以元素的宽度,就可以得到每一行的元素个数,不要'不要忘记计算元素和容器的paddingmargin
  • 这似乎是一个“X Y problem”。您可以使用媒体查询为您完成所有这些工作。也许您正在使用媒体查询。很难说什么时候你没有显示代码(除了图片中的代码)。
  • @RobMoll 因为他标记了flexbox,那么他可能正在使用flex-wrap: wrap;,而不是必要的媒体查询。
  • 我发布了你最初问题的答案,但正如@RobMoll 在上面的评论中指出的那样,这可能是一个 XY 问题,所以问题是你为什么需要这个数字,因为这可能意味着你甚至根本不需要做这个计算。

标签: javascript html css layout flexbox


【解决方案1】:

根据@AdilBimzagh 的评论

获取容器的宽度和一个元素的宽度,然后将容器的宽度除以元素的宽度,就可以得到每一行的元素个数,别忘了计算元素和容器。

主函数是computeFirstRowItems。它通过将 flex-container 的宽度除以单个项目的 outerWidth 来工作。见difference between width and outerWidth here

// See also: https://stackoverflow.com/questions/17845027/what-is-difference-between-width-innerwidth-and-outerwidth-height-innerheight#17845094

// from http://youmightnotneedjquery.com/?ref=codebldr#outer_width_with_margin
function outerWidthMargin(el) {
  var width = el.offsetWidth;
  var style = getComputedStyle(el);

  width += parseInt(style.marginLeft) + parseInt(style.marginRight);
  return width;
}

// http://youmightnotneedjquery.com/?ref=codebldr#get_width
function width (el) {
  return parseFloat(getComputedStyle(el, null).width.replace("px", ""))
}

function computeFirstRowItems () {
  const ul = document.querySelector(".entry:first-child ul.img-list")
  const li = document.querySelector(".entry:first-child ul.img-list > li")

  return Math.floor(width(ul) / outerWidthMargin(li));
}

window.addEventListener("load", () => {
  console.log(computeFirstRowItems());
});
.img-list {
  display: flex;
  justify-content: space-around;
  align-items: center;
  flex-wrap: wrap;
}

.img-list > li {
  width: 25vw;
  list-style-type: none;
  background-color: steelblue;
  height: 25vh;
  margin: 0.7em 0;
}
<div class="entry">
  <ul class="img-list">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
  </ul>
 </div>
<div class="entry">
  <ul class="img-list">
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
  </ul> 
</div>

【讨论】:

  • 非常感谢您的解决方案。这对我帮助很大。 =)
猜你喜欢
  • 2010-12-27
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
相关资源
最近更新 更多