J'ai besoin de mettre en œuvre une disposition de maçonnerie assez délabrée. Cependant, pour un certain nombre de raisons, je ne souhaite pas utiliser JavaScript pour le faire.
Paramètres:
- Tous les éléments ont la même largeur
- Les éléments ont une hauteur qui ne peut pas être calculée côté serveur (une image plus diverses quantités de texte)
- Je peux vivre avec un nombre fixe de colonnes si je le dois
il existe une solution triviale à cela qui fonctionne dans les navigateurs modernes, la column-count
propriété.
Le problème avec cette solution est que les éléments sont classés en colonnes:
Bien que j'ai besoin que les éléments soient classés en lignes, au moins environ:
Les approches que j'ai essayées qui ne fonctionnent pas:
- Fabriquer des objets
display: inline-block
: gaspille de l'espace vertical. - Faire des articles
float: left
: lol, non.
Maintenant, je pourrais changer le rendu côté serveur et réorganiser les éléments en divisant le nombre d'éléments par le nombre de colonnes, mais c'est compliqué, sujet aux erreurs (en fonction de la façon dont les navigateurs décident de diviser la liste d'éléments en colonnes), alors j'aimerais pour l'éviter si possible.
Y a-t-il une nouvelle magie Flexbox qui rend cela possible?
Réponses:
Flexbox
Une disposition de maçonnerie dynamique n'est pas possible avec flexbox, du moins pas de manière propre et efficace.
Flexbox est un système de mise en page unidimensionnel. Cela signifie qu'il peut aligner les éléments le long de lignes horizontales OU verticales. Un élément flexible est confiné à sa ligne ou à sa colonne.
Un vrai système de grille est bidimensionnel, ce qui signifie qu'il peut aligner des éléments le long de lignes horizontales ET verticales. Les éléments de contenu peuvent s'étendre simultanément sur des lignes et des colonnes, ce que les éléments flexibles ne peuvent pas faire.
C'est pourquoi flexbox a une capacité limitée pour la construction de grilles. C'est aussi une raison pour laquelle le W3C a développé une autre technologie CSS3, Grid Layout .
row wrap
Dans un conteneur flexible avec
flex-flow: row wrap
, les éléments flex doivent être enveloppés dans de nouvelles lignes .Cela signifie qu'un élément flexible ne peut pas être enveloppé sous un autre élément de la même ligne .
Remarquez ci-dessus comment la div # 3 s'enroule sous la div # 1 , créant une nouvelle ligne. Il ne peut pas être enveloppé sous la div # 2 .
En conséquence, lorsque les éléments ne sont pas les plus hauts de la ligne, un espace blanc reste, créant des espaces disgracieux.
column wrap
Si vous passez à
flex-flow: column wrap
, une disposition en forme de grille est plus réalisable. Cependant, un conteneur de direction de colonne présente quatre problèmes potentiels dès le départ:Par conséquent, un conteneur de direction de colonne n'est pas une option dans ce cas, et dans de nombreux autres cas.
Grille CSS avec des dimensions d'élément non définies
Grid Layout serait une solution parfaite à votre problème si les différentes hauteurs des éléments de contenu pouvaient être prédéterminées . Toutes les autres exigences sont bien dans la capacité de Grid.
La largeur et la hauteur des éléments de la grille doivent être connues afin de combler les espaces avec les éléments environnants.
Donc, Grid, qui est le meilleur CSS a à offrir pour créer une mise en page de maçonnerie à écoulement horizontal, ne suffit pas dans ce cas.
En fait, jusqu'à ce qu'une technologie CSS arrive avec la capacité de combler automatiquement les lacunes, CSS en général n'a pas de solution. Quelque chose comme cela nécessiterait probablement de redéfinir le document, donc je ne suis pas sûr de son utilité ou de son efficacité.
Vous aurez besoin d'un script.
Les solutions JavaScript ont tendance à utiliser un positionnement absolu, qui supprime les éléments de contenu du flux de documents afin de les réorganiser sans espaces. Voici deux exemples:
Maçonnerie Desandro
Comment créer un site qui fonctionne comme Pinterest
Grille CSS avec des dimensions d'élément définies
Pour les mises en page où la largeur et la hauteur des éléments de contenu sont connues, voici une mise en page de maçonnerie à écoulement horizontal en CSS pur:
Démo jsFiddle
Comment ça fonctionne
inline-grid
serait l'autre option)grid-auto-rows
propriété définit la hauteur des lignes générées automatiquement. Dans cette grille, chaque ligne mesure 50 px de haut.grid-gap
propriété est un raccourci pourgrid-column-gap
etgrid-row-gap
. Cette règle définit un écart de 10 pixels entre les éléments de la grille. (Cela ne s'applique pas à la zone entre les articles et le conteneur.)La
grid-template-columns
propriété définit la largeur des colonnes définies explicitement.La
repeat
notation définit un modèle de colonnes (ou lignes) répétitives.La
auto-fill
fonction indique à la grille d'aligner autant de colonnes (ou de lignes) que possible sans déborder du conteneur. (Cela peut créer un comportement similaire à celui de la mise en page flexibleflex-wrap: wrap
.)La
minmax()
fonction définit une plage de tailles minimale et maximale pour chaque colonne (ou ligne). Dans le code ci-dessus, la largeur de chaque colonne sera au minimum de 30% du conteneur et au maximum de tout espace libre disponible.L'
fr
unité représente une fraction de l'espace libre dans le conteneur de grille. C'est comparable à laflex-grow
propriété de flexbox .Avec
grid-row
et,span
nous indiquons aux éléments de la grille le nombre de lignes sur lesquelles ils doivent s'étendre.Prise en charge du navigateur pour la grille CSS
Voici l'image complète: http://caniuse.com/#search=grid
Fonctionnalité de superposition de grille cool dans Firefox
Dans les outils de développement de Firefox, lorsque vous inspectez le conteneur de grille, il y a une petite icône de grille dans la déclaration CSS. Au clic, il affiche un contour de votre grille sur la page.
Plus de détails ici: https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector/How_to/Examine_grid_layouts
la source
Il s'agit d'une technique récemment découverte impliquant la flexbox: https://tobiasahlin.com/blog/masonry-with-css/ .
L'article a du sens pour moi, mais je n'ai pas essayé de l'utiliser, donc je ne sais pas s'il y a des mises en garde, autres que celles mentionnées dans la réponse de Michael.
Voici un exemple de l'article, utilisant la
order
propriété, combiné avec:nth-child
.Extrait de pile
la source
order
propriété, ce qui donne l'impression que les éléments circulent de gauche à droite. Pourtant, son principal truc estflex-flow: column wrap
, qui est mentionné dans la réponse ci-dessus. De plus, il ne peut pas faire circuler les éléments comme le fait une vraie maçonnerie, par exemple si le 3ème et le 4ème élément tiendraient dans la 3ème colonne, ils le feraient, celui lié ne le ferait pas. Mais encore une fois, comme je l'ai dit, tout dépend de ce que sont les exigences, et dans ce cas (cette question), cela ne fonctionnera pas comme ce qui était demandé.