2017-10-19 64 views
0

我有一个用于显示产品的4列Flexbox网格。所有产品的宽度都为25%,但是如果只有1种产品的宽度为75%,我怎么能确保网格不会中断?例如,我可以在一行上显示2种产品?具有多宽度色谱柱的Flexbox网格

有没有一种方法,使用flexbox,给予更广泛的75%网格项目的优先权,以便它自动调整/移动网格,以确保它不会像现在这样破坏?

的jsfiddle(代码在底部)

https://jsfiddle.net/kdjkc15g/

这就是我想要实现:

enter image description here

CSS

.grid-uniform { 
    display: -ms-flex; 
    display: -webkit-flex; 
    display: flex; 
    flex-wrap: wrap; 
    margin-left: -20px; 
} 

.grid__item { 
    width: 25%; 
    display: -ms-flex; 
    display: -webkit-flex; 
    display: flex; 
    padding-left: 20px; 
    position: relative; 
    margin-bottom: $gutter*2; 
} 

.grid__item.featured-product { 
    width: 75%; 
} 

HTML

<div class="flex-grid"> 
<div class="grid-uniform"> 
    <a href="#" class="product grid__item"> 
    <div class="flex-content"> 
     <div class="grid__image"> 
     <img src="http://via.placeholder.com/250x350"> 
     </div> 
     <div class="grid product-info"> 
     <p> 
     This is a title 
     </p> 
     </div> 
    </div> 
    </a> 
    ... 
</div> 
</div> 

回答

0

编辑你的CSS这一点。现在它完全响应。

的CSS

* {box-sizing: border-box;} 
.flex-grid { 
    overflow: hidden; 
    padding: 0; 
} 

.grid-uniform { 
    display: flex; display: -webkit-flex; 
    flex-wrap:wrap; -webkit-flex-wrap: wrap; 
} 

.grid__item { 
    flex-grow: 1; -webkit-flex-grow: 1; 
    flex-basis: 25%; 
} 

.grid__item.featured-product { 
    flex-basis: 50%; 
} 

.grid__image { 
    background:#f4f4f4; 
    padding-top:$gutter; 
    padding-bottom:$gutter; 
    overflow: hidden; 
} 

链接fiddle

0

一个相当简单的方法来做到这类型的布局是通过CSS网格模块。但是,既然你已经问过它的Flexbox,这里是我的看法:

这里基于flexbox的网格需要根据宽度进行调整(不完全是width属性,但是flex-basis)。使用flex-basis可以更容易地设置flexbox-children的大小,因此我避免给他们一个width

我在下面做的调整是calc(),从每个.grid__item减去排水沟宽度的(n-1)倍。

为什么(n-1)次?

我们一直在为每个.grid__item提供一个左边距,并且希望它不会折叠。所以,我们打折了连续的最后一个单元格。

/* Box-sizing reset */ 
 
*, 
 
*:before, 
 
*:after { 
 
    box-sizing: border-box; 
 
} 
 

 
.flex-grid { 
 
    max-width: 1120px; 
 
    margin: 2em auto; 
 
} 
 

 
.grid-uniform { 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
    margin-left: -20px; 
 
} 
 

 
.grid__item { 
 
    display: flex; 
 
    /* Used `flex` instead of `width` */ 
 
    flex: 1 0 calc(25% - 60px); /* (4-1) * 20px = 60px 
 
    /* Used `margin` instead of `padding` */ 
 
    margin: 0 0 20px 20px; 
 
    position: relative; 
 
    /* Gave it a size in order to make it look "uniform" */ 
 
    max-height: 350px; 
 
} 
 

 
.grid__item.featured-product { 
 
    flex-basis: calc(75% - 60px); /* (4-1) * 20px = 60px */ 
 
} 
 

 
.flex-content { 
 
    /* Made the content take up the whole available width and hide bleed-outs, if any */ 
 
    width: 100%; 
 
    overflow: hidden; 
 
} 
 

 
.grid__image img { 
 
    /* Made the dummy images look okay */ 
 
    width: 100%; 
 
    object-fit: cover; 
 
    object-position: center; 
 
}
<div class="flex-grid"> 
 
    <div class="grid-uniform"> 
 
    <a href="#" class="product grid__item"> 
 
     <div class="flex-content"> 
 
     <div class="grid__image"> 
 
      <img src="http://via.placeholder.com/250x350"> 
 
     </div> 
 
     <div class="grid product-info"> 
 
      <p> 
 
      This is a title 
 
      </p> 
 
     </div> 
 
     </div> 
 
    </a> 
 
    <a href="#" class="product grid__item"> 
 
     <div class="flex-content"> 
 
     <div class="grid__image"> 
 
      <img src="http://via.placeholder.com/250x350"> 
 
     </div> 
 
     <div class="grid product-info"> 
 
      <p> 
 
      This is a title 
 
      </p> 
 
     </div> 
 
     </div> 
 
    </a> 
 
    <a href="#" class="product grid__item"> 
 
     <div class="flex-content"> 
 
     <div class="grid__image"> 
 
      <img src="http://via.placeholder.com/250x350"> 
 
     </div> 
 
     <div class="grid product-info"> 
 
      <p> 
 
      This is a title 
 
      </p> 
 
     </div> 
 
     </div> 
 
    </a> 
 
    <a href="#" class="product grid__item"> 
 
     <div class="flex-content"> 
 
     <div class="grid__image"> 
 
      <img src="http://via.placeholder.com/250x350"> 
 
     </div> 
 
     <div class="grid product-info"> 
 
      <p> 
 
      This is a title 
 
      </p> 
 
     </div> 
 
     </div> 
 
    </a> 
 
    <a href="#" class="product grid__item"> 
 
     <div class="flex-content"> 
 
     <div class="grid__image"> 
 
      <img src="http://via.placeholder.com/250x350"> 
 
     </div> 
 
     <div class="grid product-info"> 
 
      <p> 
 
      This is a title 
 
      </p> 
 
     </div> 
 
     </div> 
 
    </a> 
 
    <a href="#" class="product grid__item featured-product"> 
 
     <div class="flex-content"> 
 
     <div class="grid__image"> 
 
      <img src="http://via.placeholder.com/550x350"> 
 
     </div> 
 
     <div class="grid product-info"> 
 
      <p> 
 
      This is a title 
 
      </p> 
 
     </div> 
 
     </div> 
 
    </a> 
 
    <a href="#" class="product grid__item"> 
 
     <div class="flex-content"> 
 
     <div class="grid__image"> 
 
      <img src="http://via.placeholder.com/250x350"> 
 
     </div> 
 
     <div class="grid product-info"> 
 
      <p> 
 
      This is a title 
 
      </p> 
 
     </div> 
 
     </div> 
 
    </a> 
 
    <a href="#" class="product grid__item"> 
 
     <div class="flex-content"> 
 
     <div class="grid__image"> 
 
      <img src="http://via.placeholder.com/250x350"> 
 
     </div> 
 
     <div class="grid product-info"> 
 
      <p> 
 
      This is a title 
 
      </p> 
 
     </div> 
 
     </div> 
 
    </a> 
 
    </div> 
 
</div>

我希望这是有益的。干杯!