J'ai une disposition simple de boîte flexible avec un conteneur comme:
.grid {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
Maintenant, je veux que les éléments de la dernière ligne soient alignés avec l'autre. justify-content: space-between;
doit être utilisé car la largeur et la hauteur de la grille peuvent être ajustées.
Actuellement, il ressemble
Ici, je veux que l'article en bas à droite soit dans la "colonne du milieu". Quelle est la façon la plus simple d'y parvenir? Voici un petit jsfiddle qui montre ce comportement.
.exposegrid {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
.exposetab {
width: 100px;
height: 66px;
background-color: rgba(255, 255, 255, 0.2);
border: 1px solid rgba(0, 0, 0, 0.4);
border-radius: 5px;
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
margin-bottom: 10px;
}
<div class="exposegrid">
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
<div class="exposetab"></div>
</div>
css
flexbox
grid-layout
Thorben Croisé
la source
la source
Réponses:
Ajoutez un
::after
qui remplit automatiquement l'espace. Pas besoin de polluer votre HTML. Voici un codepen le montrant: http://codepen.io/DanAndreasson/pen/ZQXLXjla source
justify-content: space-between;
de.grid
et retiré.grid:after
et il fonctionne de la même. Maintenant, si vous essayez quelque chose comme ça, ça casse totalement. Remarquez que les largeurs pour chaque ensemble de 4 ne totalisent pas 100%. Dans le violon de l' OP, les largeurs sont définies en px, de sorte que votre solution ne fonctionne pas dans cette situation.space-between
. Cependant, lorsque j'ai défini leflex-basis
of.grid:after
sur le même dimensionnement que les autres éléments de la grille (par point d'arrêt, en remplaçant le code de module par défaut / de base ci-dessus), la dernière ligne s'est étalée correctement. Semble fonctionner sur Safari, iOS, Firefox, Chrome (besoin de tester IE) et ma plus grande taille de ligne est de 3 sur ma mise en œuvre initiale.{ content: "";flex: 0 0 32%;max-width: 480px;}
et j'ai changé la largeur maximale avec des changements de requête de média afin que la grille soit parfaite à toutes les largeurs.Une technique consisterait à insérer un certain nombre d'éléments supplémentaires (autant que le nombre maximal d'éléments que vous vous attendez à avoir dans une rangée) qui reçoivent une hauteur nulle. L'espace est toujours divisé, mais les rangées superflues se réduisent à rien:
http://codepen.io/dalgard/pen/Dbnus
À l'avenir, cela peut devenir réalisable en utilisant plusieurs
::after(n)
.la source
Comme d'autres affiches l'ont mentionné - il n'y a aucun moyen propre d'aligner à gauche la dernière ligne avec flexbox (au moins selon la spécification actuelle)
Cependant, pour ce que ça vaut: avec le module de disposition de grille CSS c'est étonnamment facile à produire:
Fondamentalement, le code pertinent se résume à ceci:
1) Faire de l'élément conteneur un conteneur de grille
2) Définissez la grille avec des colonnes automatiques de largeur 100px. (Notez l'utilisation du remplissage automatique (tel qu'apposé à
auto-fit
- qui (pour une mise en page à une ligne) réduit les pistes vides à 0 - ce qui entraîne l'expansion des éléments pour occuper l'espace restant. Cela entraînerait un «espace entre 'disposition lorsque la grille n'a qu'une seule ligne, ce qui dans notre cas n'est pas ce que nous voulons. (consultez cette démo pour voir la différence entre eux)).3) Définissez les espaces / gouttières pour les lignes et les colonnes de la grille - ici, car vous voulez une disposition `` espace entre '' - l'écart sera en fait un écart minimum car il augmentera si nécessaire.
4) Similaire à la flexbox.
Afficher l'extrait de code
Codepen Demo (redimensionner pour voir l'effet)
la source
auto-fit
, il y avait un bug dans Chrome 57-60 (et les navigateurs basés sur son moteur, comme Samsung Internet 6.0) car la spécification était un peu ambiguë à l'époque. Maintenant, les spécifications ont été clarifiées et les nouvelles versions de Chrome s'affichentauto-fit
correctement, mais les navigateurs avec l'ancien moteur sont toujours utilisés, alors soyez prudent avec cette valeur.:after
pseudo-élément peut entraîner des résultats indésirables dans les cas de bord.Sans aucun balisage supplémentaire, l'ajout a simplement
::after
fonctionné pour moi en spécifiant la largeur de la colonne.Avec le HTML comme ceci:
la source
flex-basis: 10em
place de la largeur.Tu ne peux pas. Flexbox n'est pas un système de grille. Il n'a pas les constructions de langage pour faire ce que vous demandez, du moins pas si vous l'utilisez
justify-content: space-between
. Le plus proche que vous pouvez obtenir avec Flexbox est d'utiliser l'orientation des colonnes, ce qui nécessite de définir une hauteur explicite:http://cssdeck.com/labs/pvsn6t4z (remarque: préfixes non inclus)
Cependant, il serait plus simple d'utiliser simplement des colonnes, qui ont un meilleur support et ne nécessitent pas de définir une hauteur spécifique:
http://cssdeck.com/labs/dwq3x6vr (remarque: préfixes non inclus)
la source
Une solution possible consiste à utiliser
justify-content: flex-start;
sur le.grid
conteneur, des restrictions de taille sur ses enfants et des marges sur les éléments enfants appropriés - en fonction du nombre de colonnes souhaité.Pour une grille à 3 colonnes, le CSS de base ressemblerait à ceci:
C'est une autre solution imparfaite, mais cela fonctionne.
http://codepen.io/tuxsudo/pen/VYERQJ
la source
Je sais qu'il y a beaucoup de réponses ici mais .. La façon la plus simple de le faire est avec un
grid
au lieu deflex
etgrid template columns
avecrepeat
etauto fills
, où vous devez définir le nombre de pixels que vous avez donné à chaque élément, à100px
partir de votre code d'extrait.la source
Oui.! Nous pouvons le faire, mais avec certaines requêtes multimédias et aucun nombre maximum de colonnes n'est prédéfini .
Ici, j'utilise 4 colonnes. Vérifiez mon code:
NOTE
1) Pas besoin de créer de div enfant. Il peut s'agir de n'importe quelle autre balise comme 'img' r ce que vous voulez.
2) Si vous voulez plus de colonnes, ajustez les requêtes multimédias et le nombre maximum de colonnes.
la source
Si vous voulez une grille avec un espace entre les éléments et les éléments commençant sans espace initial, cette solution simple fonctionne:
Si vous voulez l'espace initial de 5px, supprimez simplement la marge négative :) Simple.
https://jsfiddle.net/b97ewrno/2/
La réponse acceptée, bien que bonne, fait qu'il n'y a pas d'espace entre les éléments de la deuxième rangée.
la source
Si vous souhaitez aligner le dernier élément sur la grille, utilisez le code suivant:
Conteneur de grille
Article dans la grille
L'astuce consiste à définir la largeur maximale de l'élément égale à la largeur maximale de la grille .card: après.
Démo en direct sur Codepen
la source
Il est possible d'utiliser "flex-start" et d'ajouter les marges manuellement. Il nécessite un peu de piratage mathématique, mais il est certainement facile à faire et à utiliser avec un préprocesseur CSS comme LESS.
Voir par exemple ce mixin MOINS:
Et puis, il peut facilement être utilisé pour afficher une disposition de grille réactive:
Voici un exemple de
http://codepen.io/anon/pen/YyLqVB?editors=110
la source
Ce problème a été résolu pour moi en utilisant la grille CSS,
Cette solution n'est applicable que si vous rencontrez un nombre fixe de colonnes, c'est-à-dire non. d'éléments à afficher sur une seule ligne
-> utilisant une grille mais ne spécifiant pas le nombre de lignes, comme le nombre d'éléments augmente, il s'enroule dans des colonnes et ajoute des lignes dynamiquement, j'ai spécifié trois colonnes dans cet exemple
-> vous n'avez pas à donner de position à votre enfant / cellules, car cela le rendra fixe, ce que nous ne voulons pas.
la source
Cette version est le meilleur moyen pour les blocs à largeur fixe:
http://codepen.io/7iomka/pen/oxxeNE
Dans d'autres cas - version de dalgard
http://codepen.io/dalgard/pen/Dbnus
la source
Il existe un moyen sans flexbox, bien que vous deviez remplir les conditions suivantes. 1) Le conteneur a un rembourrage. 2) Les articles sont de la même taille et vous savez exactement combien vous voulez par ligne.
Le rembourrage plus petit sur le côté droit du conteneur permet le rembourrage supplémentaire à droite de chaque élément de la liste. En supposant que les autres éléments du même parent que l'objet de liste sont remplis de 0 à 5%, ils seront alignés avec eux. Vous pouvez également ajuster les pourcentages selon la marge souhaitée ou utiliser le calcul des valeurs px.
Bien sûr, vous pouvez faire de même sans le rembourrage sur le conteneur en utilisant nth-child (IE 9+) pour supprimer la marge sur une troisième boîte.
la source
En utilisant flexbox et quelques requêtes multimédias, j'ai fait ce petit contournement: http://codepen.io/una/pen/yNEGjv (c'est un peu hacky mais ça marche):
la source
J'ai fait un mixage SCSS pour cela.
Ceci est le lien codepen: http://codepen.io/diana_aceves/pen/KVGNZg
Il vous suffit de définir la largeur des éléments en pourcentage et en nombre de colonnes.
J'espère que cela pourra vous aider.
la source
Voici un autre couple de mixins scss.
Ces mixins supposent que vous n'utiliserez pas de plugins js comme Isotope (ils ne respectent pas l'ordre de balisage html, gâchant ainsi les règles nss du CSS).
De plus, vous pourrez en profiter pleinement, surtout si vous écrivez vos points d'arrêt réactifs de manière mobile en premier. Vous utiliserez idéalement flexbox_grid () sur le plus petit point d'arrêt et flexbox_cell () sur les points d'arrêt suivants. flexbox_cell () se chargera de réinitialiser les marges précédemment définies qui ne sont plus utilisées sur les points d'arrêt plus grands.
Et en passant, tant que vous configurez correctement les propriétés flex de votre conteneur, vous pouvez également utiliser uniquement flexbox_cell () sur les éléments, si vous en avez besoin.
Voici le code:
Usage:
De toute évidence, c'est à vous de définir éventuellement le remplissage / marge / largeur du conteneur et les marges inférieures de la cellule, etc.
J'espère que cela aide!
la source
C'est assez hacky, mais ça marche pour moi. J'essayais d'obtenir un espacement / des marges cohérents.
http://codepen.io/rustydev/pen/f7c8920e0beb0ba9a904da7ebd9970ae/
la source
Il semble que personne n'ait proposé la solution flex-grow sur le dernier élément. L'idée est d'avoir votre dernier article flex pour prendre toute la place qu'il peut en utilisant flex-grow: 1.
Remarque: Cette solution n'est pas parfaite, surtout si vous avez des éléments centrés à l'intérieur de vos éléments flexibles, car elle sera centrée sur le dernier élément flexible éventuellement énorme.
la source
Ceci est une combinaison de beaucoup de réponses, mais il fait exactement ce dont j'avais besoin - qui est d'aligner le dernier enfant dans un conteneur flexible vers la gauche tout en conservant le comportement d'espace entre les deux (dans ce cas, il s'agit de trois colonnes disposition).
Voici le balisage:
la source
flex-grow: 0.9
au lieu deflex-basis
travaux pour un certain nombre de colonnes. Testé dans un tas de navigateurs modernes - il fonctionne dans tous mais le rembourrage est cassé dans IE (mais fonctionne dans Edge0En supposant:
Définissez une marge gauche sur chaque élément sauf le 1er, le 5e et le 9e élément, etc. Si la marge de gauche est de 10 pixels, chaque ligne aura une marge de 30 pixels répartie sur 4 éléments. Le pourcentage de largeur pour l'article est calculé comme suit:
Il s'agit d'une solution de contournement décente pour les problèmes impliquant la dernière ligne de flexbox.
la source
Si vous connaissez la largeur des espaces entre les éléments de la ligne et la quantité d'éléments dans une ligne, cela fonctionnerait:
la source
Utilisez simplement l'astuce Jquery / Javascript pour ajouter un div vide:
la source
Oh boy, je pense que j'ai trouvé une bonne solution avec un minimum de CSS et pas de JS. Vérifiez-le:
La clé ici est de se rappeler que ce que nous essayons d'atteindre est exactement ce qui
text-align: justify
fait!Les éléments vides dans le HTML sont là pour que la dernière ligne s'affiche parfaitement sans changer l'apparence, mais peuvent ne pas être nécessaires compte tenu de ce que vous essayez de réaliser. Pour un équilibre parfait dans chaque situation, vous avez besoin d'au moins x-4 éléments vides, x étant le nombre d'éléments à afficher, ou n-2, n étant le nombre de colonnes que vous souhaitez afficher.
la source
Ajoutez simplement quelques faux articles avec les mêmes propriétés à l'exception de la hauteur définie à 0px à la fin.
la source
tu veux aligner
utiliser
align-content: flex-start;
au lieu dejustify-content: space-between;
cela tire les éléments de la dernière ligne vers la gauche et répartit également l'espace de manière égale,
https://codepen.io/anon/pen/aQggBW?editors=1100
La solution danAnderson n'est PAS DYNAMIQUE .PERİOD !!
lorsque la largeur de l'élément est passée de 25 à 28 dan anderson manque d'espace entre les images
danAnderson: https://codepen.io/anon/pen/ZwYPmB?editors=1100
dynamique: https://codepen.io/anon/pen/aQggBW?editors=1100
c'est ce que j'ai essayé de dire. dans est hacky .....
la source
J'ai pu le faire avec
justify-content: space-between
sur le containerla source