J'utilise une boîte flexible pour afficher 8 éléments qui seront redimensionnés dynamiquement avec ma page. Comment le forcer à diviser les éléments en deux rangées? (4 par rangée)?
Voici un extrait pertinent:
(Ou si vous préférez jsfiddle - http://jsfiddle.net/vivmaha/oq6prk1p/2/ )
.parent-wrapper {
height: 100%;
width: 100%;
border: 1px solid black;
}
.parent {
display: flex;
font-size: 0;
flex-wrap: wrap;
margin: -10px 0 0 -10px;
}
.child {
display: inline-block;
background: blue;
margin: 10px 0 0 10px;
flex-grow: 1;
height: 100px;
}
<body>
<div class="parent-wrapper">
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</div>
</body>
Réponses:
Vous avez
flex-wrap: wrap
sur le conteneur. C'est bien, car il remplace la valeur par défaut, qui estnowrap
( source ). C'est la raison pour laquelle les éléments ne s'enroulent pas pour former une grille dans certains cas .Dans ce cas, le problème principal
flex-grow: 1
concerne les éléments flexibles.La
flex-grow
propriété ne dimensionne pas réellement les éléments flexibles. Sa tâche est de distribuer de l'espace libre dans le conteneur ( source ). Donc, peu importe la taille de l'écran, chaque élément recevra une partie proportionnelle de l'espace libre sur la ligne.Plus précisément, votre conteneur contient huit articles flexibles. Avec
flex-grow: 1
, chacun reçoit 1/8 de l'espace libre sur la ligne. Puisqu'il n'y a pas de contenu dans vos articles, ils peuvent se réduire à une largeur nulle et ne seront jamais encapsulés.La solution est de définir une largeur sur les articles. Essaye ça:
Avec
flex-grow: 1
défini dans laflex
sténographie, il n'est pas nécessaireflex-basis
d'être à 25%, ce qui entraînerait en fait trois éléments par ligne en raison des marges.Étant donné
flex-grow
que consommera de l'espace libre sur la ligne,flex-basis
il doit seulement être suffisamment grand pour appliquer un habillage. Dans ce cas, avecflex-basis: 21%
, il y a beaucoup d'espace pour les marges, mais jamais assez d'espace pour un cinquième élément.la source
flex: 1 0 calc(25% - 10px);
margin: 2%;
au lieu d'un nombre de pixels fixe afin d'empêcher les boîtes de sauter vers une nouvelle ligne sur les petits appareils / résolutions. la formule générale est(100 - (4 * box-width-percent)) / 8
% pour différentes largeurs de boîteAjoutez une largeur aux
.child
éléments. Personnellement, j'utiliserais des pourcentages sur lemargin-left
si vous voulez qu'il soit toujours 4 par ligne.DEMO
la source
Voici une autre approche.
Vous pouvez également le faire de cette manière:
Exemple: https://codepen.io/capynet/pen/WOPBBm
Et un échantillon plus complet: https://codepen.io/capynet/pen/JyYaba
la source
Je le ferais comme ça en utilisant des marges négatives et du calc pour les gouttières:
Démo: https://jsfiddle.net/9j2rvom4/
Autre méthode de grille CSS:
Démo: https://jsfiddle.net/jc2utfs3/
la source
J'espère que ça aide. pour plus de détails vous pouvez suivre ce lien
la source
Je crois que cet exemple est plus simple et plus facile à comprendre que @dowomenfart.
Cela permet d'effectuer les mêmes calculs de largeur tout en coupant directement à la viande. Le calcul est beaucoup plus facile et
em
constitue la nouvelle norme en raison de son évolutivité et de sa convivialité mobile.la source
;)
la source
justify-content: space-evenly;
au prent, ils s'alignent bien et vous n'avez pas à fairecalc
l'enfant. Merci pour l'exemple!Flex wrap + marge négative
Pourquoi flex vs
display: inline-block
?Pourquoi une marge négative?
Soit vous utilisez SCSS ou CSS-in-JS pour les cas de bord (c'est-à-dire le premier élément de la colonne), soit vous définissez une marge par défaut et vous vous débarrassez de la marge extérieure plus tard.
la mise en oeuvre
https://codepen.io/zurfyx/pen/BaBWpja
la source
Voici une autre façon sans utiliser
calc()
.C'est tout ce qu'on peut en dire. Vous pouvez devenir fantaisiste avec les dimensions pour obtenir des tailles plus esthétiques, mais c'est l'idée.
la source