2017-10-19 62 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>

我希望這是有益的。乾杯!