html - 每行最多 3 个 div,即使只有 1 或 2 个 div,Flexbox 的宽度也相同

标签 html css flexbox

我一直坚持使用 Flexbox 创建一个每行最多包含 3 个 div 的 div。如果一行仅包含一个或两个 div,脚本会拉伸(stretch)它们以适应剩余宽度,但我希望它们全部结构化为彼此内联。

不太重要的问题是图片div比items-div宽一点

Example

https://jsfiddle.net/bk3ctapb/

body{  
margin: 0;
}
.wrapper {
  width: 500px;
  display: flex;
  height: 200px;
  margin: 0 auto;
  align-items: flex-start; 
}
.main_content {
  flex: 2;
  display: flex;
  flex-wrap: wrap;
}
.first {
  border-style:solid;
  background-color:blue;
  width: 100%;
}
.item{
  flex: 1; 
  margin: 0 0px; 
  min-width: calc(100% * (1/4) - 1px);
  margin-right:10px;
  border-style:solid;
  height: 30px;
  }
.items{
  flex: 1; 
  display: flex; 
  flex-wrap: wrap; 
  align-content: flex-start;
 }
.items * {
  box-sizing: border-box;  
}
.content_4{
  height:200px;
  width:20px;
  background-color: red;
  flex: 1;
  margin-left: 10px;
}
<div class="wrapper">
        <div class="main_content">
           <div class="first">PICTURE</div>
           <div class="items">
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
           </div>
        </div>
        <div class="content_4">CONTENT_4</div>
 </div>

最佳答案

由于您连续有 3 个,因此不要使用 flex: 1,而是使用 flex-basis: calc(33.333% - 10px);,其中 10px 是右边距。

堆栈片段

body{  
margin: 0;
}
.wrapper {
  width: 500px;
  display: flex;
  height: 200px;
  margin: 0 auto;
  align-items: flex-start; 
}
.main_content {
  flex: 2;
  display: flex;
  flex-wrap: wrap;
}
.first {
  border-style:solid;
  background-color:blue;
  width: 100%;
}
.item{
  flex-basis: calc(33.333% - 10px); 
  margin: 0 0px; 
  min-width: calc(100% * (1/4) - 1px);
  margin-right:10px;
  border-style:solid;
  height: 30px;
  }
.items{
  flex: 1; 
  display: flex; 
  flex-wrap: wrap; 
  align-content: flex-start;
 }
.items * {
  box-sizing: border-box;  
}
.content_4{
  height:200px;
  width:20px;
  background-color: red;
  flex: 1;
  margin-left: 10px;
}
<div class="wrapper">
        <div class="main_content">
           <div class="first">PICTURE</div>
           <div class="items">
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
           </div>
        </div>
        <div class="content_4">CONTENT_4</div>
 </div>


如果还想匹配第一个元素(在其左/右对齐),请这样做,为每行的第二个和第三个元素提供左边距。

堆栈片段

body{  
margin: 0;
}
.wrapper {
  width: 500px;
  display: flex;
  height: 200px;
  margin: 0 auto;
  align-items: flex-start; 
}
.main_content {
  flex: 2;
  display: flex;
  flex-wrap: wrap;
}
.first {
  border-style:solid;
  background-color:blue;
  width: 100%;
}
.item{
  flex-basis: calc(33.333% - 10px); 
  margin: 0 0px; 
  min-width: calc(100% * (1/4) - 1px);
  border-style:solid;
  height: 30px;
  }
.item:nth-child(3n+2),
.item:nth-child(3n+3) {           /*  every 3rd element, start at 2nd and 3rd  */
  margin-left:15px;               /*  10px per item, divide with 2 gaps  */
  }
.items{
  flex: 1; 
  display: flex; 
  flex-wrap: wrap; 
  align-content: flex-start;
 }
.items * {
  box-sizing: border-box;  
}
.content_4{
  height:200px;
  width:20px;
  background-color: red;
  flex: 1;
  margin-left: 10px;
}
<div class="wrapper">
        <div class="main_content">
           <div class="first">PICTURE</div>
           <div class="items">
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
                <div class="item">ITEM</div>
           </div>
        </div>
        <div class="content_4">CONTENT_4</div>
 </div>

关于html - 每行最多 3 个 div,即使只有 1 或 2 个 div,Flexbox 的宽度也相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48371861/

相关文章:

jquery - wordpress 中的多元素轮播 Bootstrap

php - 如何为相同的数据获得相同的背景颜色?

html - CSS 未连接到 HTML

html - 如何在动画中途水平翻转图像

html - 如何让 flex-shrink 真正收缩一个元素?

html - Flex 增长直到溢出滚动,侧边栏中的页脚组件父高度为 100%

javascript - jQuery,切换菜单项

css - 一些 Glyphicons 显示为空框 Bootstrap 3?

javascript - html-css 使 div 模糊的一部分

css - 使用 Flexbox 解决 Internet Explorer 表格呈现小宽度的错误