2017-10-19 20 views
0

J'ai une grille flexbox à 4 colonnes utilisée pour afficher les produits. Tous les produits ont une largeur de 25% mais comment puis-je m'assurer que le réseau ne se casse pas si seulement 1 produit obtient une largeur de 75% par exemple pour que je puisse afficher 2 produits sur une rangée?Grille Flexbox avec colonnes à plusieurs largeurs

Existe-t-il un moyen, en utilisant la flexbox, de donner la priorité à l'élément de réseau 75% plus large afin qu'il ajuste/déplace automatiquement la grille pour qu'elle ne se brise pas comme elle le fait actuellement?

jsFiddle(Code en bas)

https://jsfiddle.net/kdjkc15g/

C'est ce que je suis en train de réaliser:

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> 

Répondre

0

Modifier votre CSS à ce sujet. C'est complètement réactif maintenant.

Le 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; 
} 

Lien vers fiddle

0

Une façon de faire assez facile ce type de mise en page est à travers le module de grille CSS. Mais puisque vous l'avez demandé pour Flexbox; voici ma prise:

La grille à base de flexbox ici doit être ajustée sur la largeur (pas exactement la propriété width, mais flex-basis). En utilisant flex-basis, il est plus facile de dimensionner les flexbox-children, donc j'ai évité de leur donner un width.

Le réglage que j'ai fait ci-dessous est avec calc(), soustrayant les (n-1) fois de la largeur de la gouttière de chaque .grid__item.

Pourquoi (n-1) fois?

Nous avons donné une marge de gauche à chacun des .grid__item et nous voulons qu'il ne s'effondre pas. Donc, nous actualisons la dernière cellule d'affilée.

/* 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>

J'espère qu'il a été utile. À votre santé!