【问题标题】:CSS Flexbox - spacing between elements when using flex wrap and flex grow properties [duplicate]CSS Flexbox - 使用flex wrap和flex grow属性时元素之间的间距[重复]
【发布时间】:2023-03-28 08:34:02
【问题描述】:

我正在使用 CSS flexbox 进行基于网格的导航,它在行中有 3 列,在网格中没有“n”行。根据父容器宽度计算的grid-child的宽度(即100%)。

我为每个第三个网格子设置了margin-right:10px;margin-bottom:10px;,我为margin-right 设置了0px,以强制网格子位于父容器的右边缘。

如果列均除以 3(即每行 3 列),则一切正常。

这里的问题是,如果最后一行只有 2 列,那么我们在 grid 和 grid-child 之间有10px 空间。

是否有任何可能的解决方案来摆脱剩余空间。

请找到以下 codepen 链接以更好地理解: https://codepen.io/yesvin/pen/xXwBqa

HTML 代码块:

<div class="menu-wrapper">  
    <div class="menu">
      <div class="menu-icon">
        <img src="http://via.placeholder.com/80x80"/>
      </div>
      <div class="menu-name">
        <p>Txt</p>
      </div>
    </div>
    <div class="menu">
      <div class="menu-icon">
        <img src="http://via.placeholder.com/80x80"/>
      </div>
      <div class="menu-name">
        <p>Txt</p>
      </div>
    </div>
    <div class="menu">
      <div class="menu-icon">
        <img src="http://via.placeholder.com/80x80"/>
      </div>
      <div class="menu-name">
        <p>Txt</p>
      </div>
    </div>
    <div class="menu">
      <div class="menu-icon">
        <img src="http://via.placeholder.com/80x80"/>
      </div>
      <div class="menu-name">
        <p>Txt</p>
      </div>
    </div>
    <div class="menu">
      <div class="menu-icon">
        <img src="http://via.placeholder.com/80x80"/>
      </div>
      <div class="menu-name">
        <p>Txt</p>
      </div>
    </div>
    <div class="menu">
      <div class="menu-icon">
        <img src="http://via.placeholder.com/80x80"/>
      </div>
      <div class="menu-name">
       <p>Txt</p>
      </div>
    </div>
    <div class="menu">
      <div class="menu-icon">
        <img src="http://via.placeholder.com/80x80"/>
      </div>
      <div class="menu-name">
        <p>Txt</p>
      </div>
    </div>
    <div class="menu">
      <div class="menu-icon">
        <img src="http://via.placeholder.com/80x80"/>
      </div>
      <div class="menu-name">
        <p>Txt</p>
      </div>
    </div>  
</div>

CSS 代码块:

.menu-wrapper {
  width:100%;
  height:100%;
  display: flex;    
  flex-wrap:wrap;
  margin:0px; 

  .menu {
    display: inline-block;
    border:solid 1px #ccc;
    margin:0 10px 10px 0;    
    flex-grow: 1;      
    width: calc(33% - 10px);
  }
  .menu:nth-child(3n) {
    margin-right:0;
  }
  .menu-icon {
    text-align:center;
  }
  .menu-name {
    width:80%;
    margin:0 auto;
    text-align:center;
  }
}

问题:

必填结果

提前致谢。

注意: 通过将每一行拆分为单独的 flexbox 样式,可以实现类似的效果。但是,我不想要那个,因为'n'不。的菜单动态附加到菜单包装内。

【问题讨论】:

    标签: html css flexbox


    【解决方案1】:

    只需将margin-right:0 添加到最后一个孩子即可删除此空间:

    .menu-wrapper .menu:last-child {
        margin-right: 0;
    }
    

    这在任何情况下都有效:

    • 如果你已经有 3 它已经是 0
    • 如果您有一个或两个,它将删除不需要的空间。

    最后一行包含 1 个项目的完整代码:

    .menu-wrapper {
      width: 100%;
      height: 100%;
      display: flex;
      flex-wrap: wrap;
      margin: 0px;
    }
    
    .menu-wrapper .menu {
      display: inline-block;
      border: solid 1px #ccc;
      margin: 0 10px 10px 0;
      flex-grow: 1;
      width: calc(33% - 10px);
    }
    
    .menu-wrapper .menu:nth-child(3n),
    .menu-wrapper .menu:last-child {
      margin-right: 0;
    }
    
    .menu-wrapper .menu-icon {
      text-align: center;
    }
    
    .menu-wrapper .menu-name {
      width: 80%;
      margin: 0 auto;
      text-align: center;
    }
    <div class="menu-wrapper">
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
    
    
    </div>

    最后一行包含 2 个项目的完整代码:

    .menu-wrapper {
      width: 100%;
      height: 100%;
      display: flex;
      flex-wrap: wrap;
      margin: 0px;
    }
    
    .menu-wrapper .menu {
      display: inline-block;
      border: solid 1px #ccc;
      margin: 0 10px 10px 0;
      flex-grow: 1;
      width: calc(33% - 10px);
    }
    
    .menu-wrapper .menu:nth-child(3n),
    .menu-wrapper .menu:last-child {
      margin-right: 0;
    }
    
    .menu-wrapper .menu-icon {
      text-align: center;
    }
    
    .menu-wrapper .menu-name {
      width: 80%;
      margin: 0 auto;
      text-align: center;
    }
    <div class="menu-wrapper">
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
       <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
    
    </div>

    最后一行包含 3 个项目的完整代码:

    .menu-wrapper {
      width: 100%;
      height: 100%;
      display: flex;
      flex-wrap: wrap;
      margin: 0px;
    }
    
    .menu-wrapper .menu {
      display: inline-block;
      border: solid 1px #ccc;
      margin: 0 10px 10px 0;
      flex-grow: 1;
      width: calc(33% - 10px);
    }
    
    .menu-wrapper .menu:nth-child(3n),
    .menu-wrapper .menu:last-child {
      margin-right: 0;
    }
    
    .menu-wrapper .menu-icon {
      text-align: center;
    }
    
    .menu-wrapper .menu-name {
      width: 80%;
      margin: 0 auto;
      text-align: center;
    }
    <div class="menu-wrapper">
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
       <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
      <div class="menu">
        <div class="menu-icon">
          <img src="http://via.placeholder.com/80x80" />
        </div>
        <div class="menu-name">
          <p>Txt</p>
        </div>
      </div>
    
    </div>

    【讨论】:

    • 非常感谢。 +1 解决方案
    • 是否有可能为上述代码实现动画/过渡..(即)如果我点击任何一个孩子..剩下的孩子需要隐藏..点击的那个是动画以填充整个父网格的宽度和高度.. 具有精确的变换原点。 (如果我们点击第三个,它应该按从右到左的动画宽度和高度)。我尝试了以下...codepen.io/yesvin/pen/NwVJYo,但它与 android 移动应用程序抽屉图标不相似..(在 Android 移动设备中,如果您单击应用程序抽屉图标,它将显示子项目)..
    • 没有 flex codepen 链接codepen.io/yesvin/pen/oorgwM
    • @Yesvinkumar 您正在尝试使用不适合动画的显示属性。我建议您考虑使用绝对位置并使用上/左/右/下拉伸元素以使其全宽并使用高 z-index 您将隐藏另一个,因此无需隐藏它们
    猜你喜欢
    • 2018-09-16
    • 2016-05-25
    • 2018-04-17
    • 2020-07-11
    • 2020-07-20
    • 2016-12-23
    • 1970-01-01
    • 2023-01-11
    • 2017-08-30
    相关资源
    最近更新 更多