FlexBox 对齐(拉伸)最后一个项目

Posted

技术标签:

【中文标题】FlexBox 对齐(拉伸)最后一个项目【英文标题】:FlexBox align (stretch) last Item 【发布时间】:2018-06-21 19:25:54 【问题描述】:

. 大家好,我正在尝试设置 javascript 函数来对齐(拉伸)FlexBox 中的最后一个子元素。 要在我的行中显示最多三列。 article-card-container 设置为flex: 1 1 calc(100 * (1/3));

要拉伸最后一个我需要设置的项目 flex: 1;

<div id="content-container">
<article class="article-card-container"></article>
<article class="article-card-container"></article>
<article class="article-card-container"></article>
<article class="article-card-container"></article>
</div>

这是我的解决方案,但正在运行......

window.onload = function alignLeftovers() 
    // get container with flexboxes
    var container = document.getElementById("content-container");
    // get container children
    var childernCount = container.children.length;
    // get leftover children
    var leftover = container.children.length % 3;

    if (childernCount > 3 && leftover === 1 )  // condition
      // start loop
        for (var i = 0; i < container.children.length; i++) 
            // remove class on last child
            container.lastElementChild.classList.remove('article-card-container');
        
        // add a new class on last child
        container.lastElementChild.classList.add('article-card-container-100');
    
;

我使用leftover === 1 进行测试,因为甚至还有2 项剩余,leftover &gt; 0 导致问题。

这个函数的问题是我必须编写要分配的新类(包括内部元素的所有子类 = 大量代码)。

使用if 语句中的第一个条件,因为即使只有两个元素,modulus 也会返回 1。

在纯 JavaScript 中是否有更好的解决方案(我是 JS 新手)如何在最后一个子类 .article-card-container 选择器上获取“flex”属性并更改(删除和添加)其值并避免编写全新的类?

感谢您提供任何建议或提示以使其变得更好

【问题讨论】:

不清楚你想达到什么,你能说明一下吗? 我正在创建 WP 主题和文章列表不同,并且行上的最大列数为 3。因为所有 flex 元素都将 flex 值设置为 1/3,所以我试图删除这个值并最后拉伸孩子到 100% 所以不需要 JS :) 简单的 CSS 就足够了 这是我第一次尝试提出问题,但我得到了否定点。有人可以解释为什么我的 Q 被否决了吗? 谢谢,但我现在知道要问更多问题,因为我不知道什么是好问题。我试图对 JS 代码进行排序,因为我没有在这里找到正确的答案,而且我被否决了。我知道有 100 种方法可以解决一个问题,但我不明白仅仅因为被问到就判断某人的问题。至少我总是试图帮助别人而不评判他们。所以对谁投反对票。不好意思问 【参考方案1】:

如果leftover===2,则必须将lastElementChildlastElementChild.previousElementSiblingflex 设置为1

window.onload = function alignLeftovers() 
  var container = document.getElementById("content-container");
  var childernCount = container.children.length;
  console.log(childernCount);
  var leftover = container.children.length % 3;
  if (childernCount > 3 && leftover === 1) 
    container.lastElementChild.style.flex = "1"
   else if (childernCount > 3 && leftover === 2) 
    container.lastElementChild.style.flex = "1"
    container.lastElementChild.previousElementSibling.style.flex = "1"
  
;
#content-container 
  display: flex;
  flex-wrap: wrap;


.article-card-container 
  width: 33.3333%;
  padding: 9px;
  background: red;
  border: 2px solid #fff;
  box-sizing: border-box;
<div id="content-container">
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
</div>

【讨论】:

感谢您的回答我尝试了非常相似的 CSS 样式,它可以部分排序问题,我的意思是当剩余为 1 (4,7, 10 ....) 但如何排序情况在哪里剩下 2 篇文章(在 5、11 .. 文章场景中)这就是为什么我尝试将条件设置为 leftover === 1 的函数以 100% 对其进行测试,然后将 2 个剩余元素的规则设置为将弹性设置为 50%。有没有针对它的 CSS 解决方案?很抱歉,最初的问题不是很清楚 剩下2篇文章的时候,你想怎么对齐? 适合最后一行 50/50 这可以单独使用 CSS 来完成...检查我的答案 @LGSon 谢谢【参考方案2】:

这只能通过 CSS 来解决,而且会比使用脚本更有效率。

它是通过组合nth-child/nth-last-childlast-child 选择器来完成的,并且可以处理任意数量的项目,从 1 个项目开始。

就像这样,当nth-*last-child 选择器同时匹配一个元素时,规则就会生效。

例如,:nth-child(3n+1):last-child 规则将针对每个第 3 个元素,从第 1 个开始,然后是第 4 个、第 7 个等等,如果它也是最后一个,则选择最后一行上的任何单个元素。

:nth-child(3n+1):nth-last-child(2) 也会这样做,但如果它是第二个元素,则选择它,这意味着最后一行有 2。

如果有 2 个,最后的兄弟选择器 + 将定位直接的兄弟,它也总是最后一个。

堆栈sn-p

.content-container 
  display: flex;
  flex-wrap: wrap;


.article-card-container 
  width: 33.3333%;
  padding: 9px;
  background: red;
  border: 2px solid #fff;
  box-sizing: border-box;


/*  if every 3rd, start from 1st, also being 2nd last + last */
.article-card-container:nth-child(3n+1):nth-last-child(2),
.article-card-container:nth-child(3n+1):nth-last-child(2) + article 
  width: 50%;


/*  if every 3rd, start from 1st, also being last  */
.article-card-container:nth-child(3n+1):last-child           
  width: 100%;


/*  for demo styling  */
.content-container + .content-container 
  margin-top: 20px;
<div class="content-container">
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
</div>

<div class="content-container">
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
</div>

<div class="content-container">
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
  <article class="article-card-container"></article>
</div>

【讨论】:

以上是关于FlexBox 对齐(拉伸)最后一个项目的主要内容,如果未能解决你的问题,请参考以下文章

Flexbox 网格 - 对齐:围绕空格并对齐最后一个项目

Flexbox - 如何左对齐最后一个弹性项目? [复制]

CSS Flexbox:将最后第n个项目对齐到末尾[重复]

如何在多行flexbox中对齐左最后一行/行[重复]

如何在多行flexbox中对齐左最后一行/行[重复]

将一个项目居中对齐,其他项目与 Flexbox 对齐 [重复]