【问题标题】:flexbox wrap ignoring max-widthflexbox wrap忽略最大宽度
【发布时间】:2018-09-24 17:03:58
【问题描述】:

我的弹性容器奇怪地(在我看来)忽略了max-widthwrap

目的是在左边有一个(始终如一)大的项目,在那个项目的旁边或下方有零个、一个、两个或三个较小的项目。如果只有一个,它应该显示在右边,如果有两个或三个,它们应该都到下一行(等距)。

0) -------------------------------
   |         large item          |
   -------------------------------
1) -------------------------------
   |     large item      | small |
   -------------------------------
2) -------------------------------
   |         large item          |
   -------------------------------
   |     small    |    small     |
   -------------------------------
3) -------------------------------
   |         large item          |
   -------------------------------
   |  small  |  small  |  small  |
   -------------------------------

我认为 flexbox 将“只需要这样做”。但现在它不会按预期包装。右边的项目(应该在第二行)刚好溢出弹性框。

谁能看到我做错了什么?非常感谢!

这里有一个例子:Codepen

.container {
  display: flex;
  flex-wrap: wrap; /* ? */
  
  background-color: #ccc;
  padding: 10px 0;
  max-width: 1024px;
  margin: 0 auto;
}
			
.item_large {
  flex: 1 0 450px;
  background-color: green;
  height: 40px;
  border-radius: 2px;
}
			
.container_2 {
  display: flex;
  flex-wrap: nowrap;
  flex: 1 0 190px;
  margin: 0 -12px;
}
			
.item_small {
  flex: 1 0 190px;
  background-color: blue;
  height: 40px;
  border-radius: 2px;
  margin: 0 12px;
}

@media screen and (max-width: 719px) {
  .container_2 {
    flex-wrap: wrap;
  }
				
  .item_small {
    flex: 1 0 320px;
  }		
}

@media screen and (min-width: 720px) {

  .item_small:first-child:nth-last-child(1) {
    margin-left: 36px;
  }
}
<div class="container">
  <div class="item_large"></div>
</div>
</div><br /><br />
<div class="container">
  <div class="item_large"></div>
  <div class="container_2">
    <div class="item_small"></div>
  </div>	
</div><br /><br />
<div class="container">
  <div class="item_large"></div>
  <div class="container_2">
    <div class="item_small"></div><div class="item_small"></div>
		</div>
</div><br /><br />
<div class="container">
  <div class="item_large"></div>
  <div class="container_2">
    <div class="item_small"></div><div class="item_small"></div><div class="item_small"></div>
  </div>
</div>

【问题讨论】:

  • 它们并没有溢出主容器,但是你有嵌套容器和内部容器nowrap
  • 是的,内部容器不应该换行(它的内容),因为如果里面只有一个元素,它应该保留在第一行,如果有多个,它们会溢出主容器,因此在下面的行上对齐(展开)。你是什​​么意思(@temani-afif):它们没有溢出?我确实认为他们是(?)
  • 检查控制台,你会看到元素溢出内部容器......并且主容器没有溢出,所以问题出在内部容器
  • 对不起,我不明白:/“主要”容器(有两个孩子)为什么不会被太大的第二个孩子溢出?
  • 更新:通过一点“作弊”,我们可能(经过更多工作以使利润表现良好)到达那里:updated example from above。非常感谢@Temani Afif 将我推向正确的方向!

标签: html css flexbox overflow


【解决方案1】:

可以通过使用 flexbox(用于等间距)和一些项目计数(受thist post 启发)来实现所需的效果(如问题中所述)。

这可能类似于以下Codepen

.container {
  display: flex;
  flex-wrap: wrap;
  padding: 10px 0;
  background: #ccc;				
  margin: 0 -20px;
}
		
.item_large, 
.item_small {
  height: 40px;
  border-radius: 2px;
  margin: 0 12px;			
}
		
.item_large {
  flex: 1 0 450px;
  background-color: green;
}
		
.item_small {
  flex: 1 0 202px;
  background-color: blue;
}

@media screen and (max-width: 719px) {			
  .item_large, 
  .item_small {
	flex: 1 0 100%;
	margin: 0;
  }	
}
		
@media screen and (min-width: 720px) {			
  .item_large:first-child:nth-last-child(3), 
  .item_large:first-child:nth-last-child(4) {
    flex: 0 1 calc(100% - 24px);
  }
}
<div class="container">
  	  <div class="item_large"></div>
</div><br /><br />
<div class="container">
  <div class="item_large"></div>
  	  <div class="item_small"></div> 
</div><br /><br />
<div class="container">
  <div class="item_large"></div>
  <div class="item_small"></div><div class="item_small"></div>
</div><br /><br />
<div class="container">
  <div class="item_large"></div>
  	  <div class="item_small"></div><div class="item_small"></div><div class="item_small"></div>	
</div>

感谢(坚持)@temani-afif 和(研究)@matthematics :)。你拯救了我的一天(以及更多)!

【讨论】:

    【解决方案2】:

    您需要更好地理解弹性网格。这是一个很好的帖子Flex Docs

    您遇到的主要问题 id flex-grow: 1

      .container {
            display: flex;
            justify-content: space-between;
            align-items: center;
            margin-bottom: 1em;
        }
    
        .item_large {
            flex: 1;
            background-color: green;
        }
    
        .item_small {
            flex: 0 0 190px;
            background-color: steelblue;
        }
        
        [class^="item_"] {
          height: 2em;
          border-radius: 5px;
          margin: 0.5em;
          display: flex;
          align-items: center;
        }
    <div class="container">
        <div class="item_large"></div>
    </div>
    <div class="container">
        <div class="item_large"></div>
        <div class="item_small">190px</div>
    </div>
    <div class="container">
        <div class="item_large"></div>
    </div>
    <div class="container">
        <div class="item_large"></div>
        <div class="item_large"></div>
    </div>
    <div class="container">
        <div class="item_large"></div>
    </div>
    <div class="container">
        <div class="item_large"></div>
        <div class="item_large"></div>
        <div class="item_large"></div>
    </div>

    您可能想了解更多关于弹性网格的知识,以便将来制作您想要的任何网格。您可以在 .item_small 上使用相同的想法来制作网格 item_1 --> 10% | item_2 --> 20% |等等……

    【讨论】:

    • 谢谢!这看起来很棒,我确实必须更深入地研究 flexbox 的工作原理。
    • 经过一些调整,它可以满足我的需要:Codepen) :)
    • 谢谢@PumbaNjie 如果你准备好标记Correct Answer
    【解决方案3】:

    您已将 flex 容器设置为 max-width: 1024px

    您已将左侧项目 (.item_large) 设置为 flex-basis: 450px

    您已将右侧项目 (.container_2) 设置为 flex-basis: 190px

    450 + 190 = 640
    

    既然主要 flex 项的组合宽度是 640 像素,这大大小于容器上的 max-width: 1024px,为什么它们要换行?线上还有很多空间。

    不要在.container_2 上设置 190 像素,而是尝试使用 600 像素之类的值,这将使项目超过容器上的 1024 像素最大宽度。实际上,.container_2 上的 575 像素就足够了(两个项目总共 1025 像素),除非您需要考虑负边距。

    .container {
      display: flex;
      flex-wrap: wrap;  /* ? */
      background-color: #ccc;
      padding: 10px 0;
      max-width: 1024px;
      margin: 0 auto;
    }
    
    .item_large {
      flex: 1 0 450px;
      background-color: green;
      height: 40px;
      border-radius: 2px;
    }
    
    .container_2 {
      display: flex;
      flex-wrap: nowrap;
      flex: 1 0 600px;  /* adjusted */
      margin: 0 -12px;
    }
    
    .item_small {
      flex: 1 0 190px;
      background-color: blue;
      height: 40px;
      border-radius: 2px;
      margin: 0 12px;
    }
    
    @media screen and (max-width: 719px) {
      .container_2 {
        flex-wrap: wrap;
      }
      .item_small {
        flex: 1 0 320px;
      }
    }
    
    @media screen and (min-width: 720px) {
      .item_small:first-child:nth-last-child(1) {
        margin-left: 36px;
      }
    }
    <div class="container">
      <div class="item_large"></div>
    </div>
    </div><br /><br />
    <div class="container">
      <div class="item_large"></div>
      <div class="container_2">
        <div class="item_small"></div>
      </div>
    </div><br /><br />
    <div class="container">
      <div class="item_large"></div>
      <div class="container_2">
        <div class="item_small"></div>
        <div class="item_small"></div>
      </div>
    </div><br /><br />
    <div class="container">
      <div class="item_large"></div>
      <div class="container_2">
        <div class="item_small"></div>
        <div class="item_small"></div>
        <div class="item_small"></div>
      </div>
    </div>

    revised codepen

    【讨论】:

    • 但是如果你看他的图表,他想在一行中有 1 个绿色 + 1 个蓝色......如果有超过 1 个蓝色,它们就会换行。检查他最后的评论,你会发现他得到了我们想要的我们有点作弊
    • 对。我发布答案主要是为了确定问题。我的解决方案是次要的,旨在说明问题。