Mon sass (utiliser une boussole pour obtenir les préfixes) est affiché dans ce violon :
.container
@include display-flex
@include flex-wrap(wrap)
.item
@include flex-grow(1)
@include flex-basis(190px)
Bien que, je voudrais que les deux éléments en bas aient le même objet que ceux en haut.
Je ne veux pas les laisser à gauche et fixer leur largeur, cela ne fonctionnera pas pour mon arrangement dans d'autres résolutions.
Toutes les suggestions sont les bienvenues!
Vous avez 2 façons de faire cela:
flex-grow: 0 ( violon )
Si vous définissez flex-grow
sur 0, vous indiquez aux éléments de conserver leur largeur et d’agrandir l’espace vide. En utilisant flex-grow: 1
, les éléments augmenteront la largeur pour s’adapter à l’espace.
objets invisibles ( violon )
Ajoutez des éléments invisibles après les éléments normaux avec les mêmes propriétés de flex. Vous obtiendrez un regard aligné à gauche.
Dans cette solution, il y aura le même nombre d'éléments dans toutes les lignes visibles. Assurez-vous donc d'ajouter suffisamment d'éléments invisibles pour fonctionner correctement sur des écrans plus grands.
Je ne peux pas répondre à la réponse d'Igor pour suggérer une amélioration de sa solution, mais son violon ne fonctionne pas entièrement pour une mise en page réactive.
La première solution avec flex-grow: 0;
ne permet pas d'étirer les éléments pour remplir les conteneurs. La deuxième solution avec des éléments invisibles fonctionne, mais augmente la hauteur du conteneur. Enlever les marges supérieure/inférieure a toutefois fait l'affaire.
J'ai modifié jsfiddle pour le rendre réactif et corriger les éléments invisibles qui étendaient le conteneur, en utilisant des commentaires pour expliquer ce que j'avais changé. Cela ne fonctionne toujours pas si le conteneur est plus grand que la rangée d'éléments: ( fiddle )
J'ai aussi fait ma propre solution simple. J'essayais de le faire moi-même et la solution d'Igor m'a énormément aidé. ( violon )
.container {
display: flex;
flex-flow: row wrap;
/*style*/
padding: 0.5em;
background-color: royalblue;
}
.item {
flex: 1 0 80px;
/*style*/
margin: 0.5em;
padding: 1em;
text-align: center;
background-color: lightblue;
}
.filler {
flex: 1 0 80px;
height: 0px;
/*style*/
margin: 0 0.5em;
padding: 0 1em;
}
<div class="container">
<div class="item">sm</div>
<div class="item">medium</div>
<div class="item">large item</div>
<div class="item">medium</div>
<div class="item">medium</div>
<div class="item">large item</div>
<div class="item">sm</div>
<div class="item">sm</div>
<div class="item">medium</div>
<div class="item">large item</div>
<div class="item">medium</div>
<div class="item">medium</div>
<div class="item">large item</div>
<div class="item">sm</div>
<div class="filler"></div>
<div class="filler"></div>
<div class="filler"></div>
<div class="filler"></div>
<div class="filler"></div>
<div class="filler"></div>
<div class="filler"></div>
<div class="filler"></div>
</div>
vous pouvez essayer de définir flex-basis: 50%;
et flex-grow: 1
.
.parent {
display: flex;
width: 300px;
height: 300px;
}
.child {
flex-basis: 50%;
flex-grow: 1;
background: tomato;
border: 1px solid #ccc;
}
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div>
Pour ce type de problème, je viens d'utiliser float.
.container {
overflow: hidden;
}
.child-item {
float: left;
}