【问题标题】:Flex container with four divs, need three columns, second column with two rows具有四个 div 的 Flex 容器,需要三列,第二列有两行
【发布时间】:2019-03-31 11:43:25
【问题描述】:

对于页面上的一个部分,我试图显示两个矩形 div 堆叠在两侧的两个方形 div 之间,与两个堆叠 div 的高度一样大,这些 div 内部是 img 标签。

我使用这个标记是因为在移动设备上我希望能够将它们放在带有 overflow: hidden 父级的未包装的 flex 行上,这样我就可以使用滑动代码来平移 X 轴。我在使用 flexbox 使用此标记为桌面创建此布局时遇到问题(无网格,需要支持 IE11)。有人用这个标记做过这个布局吗?谢谢。

 <div class="flex_container">
   <div class='flex_child square'>
     <img...>
   </div>
   <div class='flex-child rect'>
     <img...>
   </div>
   <div class='flex-child rect'>
     <img...>
   </div>
   <div class='flex-child square'>
     <img...>
   </div>
 </div>

【问题讨论】:

  • 你的 CSS 在哪里?有什么尝试?
  • 是的,很多次,尝试了各种组合;浮动,显示内联等,如果我通过将两个矩形 div 嵌套在另一个 div 上,.flex_container 上只有 display: flex 来更改标记,则很容易修复,我只是想知道这个标记是否可行
  • Flex 不适用于此标记,因为您需要两个方向,而 flex 仅适用于单个方向。 IE11需要什么样的支持?我建议使用网格,然后使用 IE11 的后备。
  • 我需要在 IE11 以及其他浏览器中重现上面的图像,我尝试了 rect 类的包装器,它在 IE11 中运行良好,在移动设备上我需要所有 div使用展开的 flex,这样我就可以溢出 flex 容器并平移 x 轴
  • grid更适合这种布局,IE10-11支持旧版grid spec

标签: html css flexbox grid-layout


【解决方案1】:

假设这将是您页面的主要布局,您可以尝试设置固定高度并使用 flexbox 的列方向:

.flex_container {
  height: 100vh; /*adjust this value like you want*/
  display: flex;
  flex-direction: column;
  flex-wrap:wrap;
}
.flex_child {
  background:purple;
  border:2px solid #fff;
  box-sizing:border-box;
  width:calc(100% / 3);
}
.square {
  flex:1 1 100%;
}
.rect {
  flex:1 1 47%;
}

body {
  margin: 0;
}
<div class="flex_container">
  <div class='flex_child square'></div>
  <div class='flex_child rect  '></div>
  <div class='flex_child rect  '></div>
  <div class='flex_child square'></div>
</div>

如果您想要更好的浏览器支持,您可以使用浮动/内联块,方法是稍微调整开始时制作 2 个正方形的类:

.flex_container {
  height: 100vh; /*adjust this value like you want*/
}
.flex_child {
  background:purple;
  border:2px solid #fff;
  box-sizing:border-box;
  width:calc(100% / 3);
  height:100%;
}
.square:nth-child(1) {
  float:left;
}
.square:nth-child(2) {
  float:right;
}
.rect {
  display:inline-block;
  height:50%;
  vertical-align:top;
}

body {
  margin: 0;
}
<div class="flex_container">
  <div class='flex_child square'></div>
  <div class='flex_child square'></div>
  <div class='flex_child rect  '></div>
  <div class='flex_child rect  '></div>
</div>

如果您也不能更改类,请使用一些负边距来纠正最后一个元素的位置:

.flex_container {
  height: 100vh; /*adjust this value like you want*/
}
.flex_child {
  background:purple;
  border:2px solid #fff;
  box-sizing:border-box;
  width:calc(100% / 3);
  height:100%;
}
.square:first-child {
  float:left;
}
.square:last-child {
  float:right;
  margin-top:-50vh;
}
.rect {
  display:inline-block;
  height:50%;
  vertical-align:top;
}

body {
  margin: 0;
}
<div class="flex_container">
  <div class='flex_child square'></div>
  <div class='flex_child rect  '></div>
  <div class='flex_child rect  '></div>
  <div class='flex_child square'></div>
</div>

【讨论】:

  • 感谢您的回答,它是页面的一部分,我已经尝试过了,并意识到我忽略了这样一个事实,即在 flex childs 内部有图像,所以它不能很好地缩放,我有更新了问题
  • 我设法通过添加到flex_container align-content: center 并删除flex_child 上的计算宽度而不是flex: 1 1 ... 上的flex: 1 1 ... 添加width: 35% 类来使其工作和.rectwidth: 30%。当然必须在使用 js 调整大小时设置flex_container 的高度。谢谢!
【解决方案2】:

对您的内容做出一些主要假设,但您可以使用绝对定位来对齐内容。本质上,您可以将中间两个元素从文档流中拉出来,并通过定位来模拟堆叠。

在这种情况下,当高于767px 时,整行都在文档流中。在767px下方时,我们重新定位内部的两个元素,并将容器设置为justify-content: space-between,以提供视觉空间。

* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

.flex_container {
  position: relative;
  display: flex;
}

.flex_item {
  flex: 1;
  height: 120px;
  border: 1px solid orange;
  padding: 40px;
  background-color: red;
  text-align: center;
}

@media (max-width: 767px) {
  .flex_container {
    justify-content: space-between;
  }  

  .flex_item {
    padding: 20px;
  }
  
  .square {
    flex: 0 1 33%;
  }
  
  .rect {
    position: absolute;
    left: calc(100% / 3);
    width: calc(100% / 3);
    height: 50%;
  }
  .rect.three {
    top: 50%;
  }
}
<div class="flex_container">
  <div class="one flex_item square">
    One
  </div>
  <div class="two flex_item rect">
    Two
  </div>
  <div class="three flex_item rect">
    Three
  </div>
  <div class="four flex_item square">
    Four
  </div>
</div>

再次提醒,请注意 - 这假设您可以控制容器的高度和内容的尺寸。如果没有,这种类型的布局很容易分崩离析。如其他 cmets 所述,如果您想要更多的结构和稳定性,最好用另一个带有 flex-direction: column 的 flex 元素包裹内部元素。只知道风险!

【讨论】:

    【解决方案3】:

    试试

       .flex_container{
          display:flex;
          flex-direction: row;
          border: 1px solid red;
    
        }
        .flex_container2{
          display:flex;
          flex-direction:column;
          border: 1px solid green;
        }  
        .flex-child{
          border: 1px solid blue;
         } 
     <div class="flex_container">
       <div class='flex_child square'>A</div>
       <div class="flex_container2">
           <div class='flex-child rect'>B</div>
           <div class='flex-child rect'>C</div>
       </div>
       <div class='flex-child square'>D</div>
     </div>

    我认为您需要第二个弹性容器。

    【讨论】:

      【解决方案4】:

      如果您添加第二个容器来控制两个rect,它会变得更容易。 您可以控制squareheight and width 使它们成为方形,而不是动态宽度。

      .flex-container {
        	display: flex;
        	height: 150px;
      }
      .container>*, .square {
        background-color: purple;
      }
      
      .flex-child {
          flex:1;
          display: inline-flex;
          margin: 2px
      }
      
      .square { flex-basis: 25%; }
      .container {
          flex-direction: row;
          flex-basis: 50%
      }
      .container > * { 
        flex-basis: 50%; 
      }
      .container div:first-child {
      	margin-right: 4px 
      }
      
      @media (max-width: 767px) {
        .container {
            flex-direction: column;
            flex-basis: 33.333%
        }
        .container div:first-child{
            margin: 0 0 4px 0
         }	
      }
      <div class="flex-container">
         <div class='flex-child square'></div>
         <div class='flex-child container'>
         		<div class='rect'></div>
         		<div class='rect'></div>
         </div>
         <div class='flex-child square'></div>
       </div>

      或者:(点击full page查看变化)

      .flex-container {
        	display: flex;
        	height: 150px;
      }
      .container>*, .square {
        background-color: purple;
      }
      
      .flex-child {
          flex:1;
          display: inline-flex;
          margin: 2px
      }
      
      .square { flex-basis: 25%; }
      .container {
          flex-direction: column;
          flex-basis: 33.333%
      }
      .container > * { 
        flex-basis: 50%; 
      }
      .container div:first-child {
      	margin: 0 0 4px 0
      }
      
      @media (max-width: 767px) {
      	.square, .container>* {
          	height: 100px;
          }
      	.flex-container {
          	height: auto;
          	flex-direction: column;	
          }
        	.rect {
            flex-direction: column;
            flex-basis: 50%
        	}
        	
      }
          
      <div class="flex-container">
         <div class='flex-child square'></div>
         <div class='flex-child container'>
            <div class='rect'></div>
            <div class='rect'></div>
         </div>
         <div class='flex-child square'></div>
       </div>

      【讨论】:

        猜你喜欢
        • 2016-08-15
        • 2021-09-02
        • 2020-04-21
        • 2015-06-02
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        相关资源
        最近更新 更多