C'est en fait la mise en page Pinterest. Cependant, les solutions trouvées en ligne sont encapsulées dans des colonnes, ce qui signifie que le conteneur croît par inadvertance horizontalement. C'est not la mise en page Pinterest et cela ne fonctionne pas bien avec le contenu chargé dynamiquement.
Ce que je veux, c’est avoir un tas d’images de largeur fixe et de hauteur asymétrique, disposées horizontalement mais enveloppées dans une nouvelle ligne lorsque les limites du conteneur de largeur fixe sont atteintes:
Est-ce que la flexbox peut le faire ou dois-je recourir à une solution JS telle que la maçonnerie?
Flexbox est un système de mise en page "1 dimension": il peut aligner des éléments le long de lignes verticales OR horizontales.
Un véritable système de grille est "bidimensionnel": il peut aligner des éléments le long de lignes horizontales ET verticales. En d'autres termes, les cellules peuvent s'étendre sur des colonnes et des lignes, ce que flexbox ne peut pas faire.
C'est pourquoi la flexbox a une capacité limitée de construction de grilles. C’est aussi une des raisons pour lesquelles le W3C a développé une autre technologie CSS3, Grid Layout (voir ci-dessous).
Dans un conteneur flex avec flex-flow: row wrap
, les éléments flex doivent être renvoyés à la nouvelle lignes.
Cela signifie que un élément flexible ne peut pas être placé sous un autre élément de la même ligne.
Notez ci-dessus comment (div # 3} _ enroule sous div # 1, créant une nouvelle ligne. Il ne peut pas envelopper sous div # 2.
Par conséquent, lorsque les éléments ne sont pas les plus hauts de la rangée, il reste un espace blanc, créant des espaces disgracieux.
_ {crédit d'image: Jefree Sujit
column wrap
SolutionSi vous passez à flex-flow: column wrap
, les éléments flexibles s'empileront verticalement et une mise en page semblable à une grille sera plus accessible. Cependant, un conteneur dans la direction des colonnes présente trois problèmes potentiels dès le départ:
En conséquence, un conteneur dans le sens des colonnes peut ne pas être réalisable dans de nombreux cas.
Ajouter des conteneurs
Dans les deux premières images ci-dessus, envisagez de regrouper les éléments 2 et 3 dans un conteneur séparé. Ce nouveau conteneur peut être un frère de l'article 1. Fait.
Voici un exemple détaillé: Disposition du clavier de la calculatrice avec flexbox
Un inconvénient qui mérite d'être souligné: si vous souhaitez utiliser la propriété order
pour réorganiser votre mise en page (par exemple, dans les requêtes multimédia), cette méthode peut éliminer cette option.
La maçonnerie est une bibliothèque de disposition de grille JavaScript. Il fonctionne en plaçant les éléments dans une position optimale en fonction des éléments disponibles espace vertical, un peu comme un maçon posant des pierres dans un mur.
source: http://masonry.desandro.com/
Comment construire un site qui fonctionne comme Pinterest
[Pinterest] est vraiment un site cool, mais ce que je trouve intéressant, c'est la façon dont ces tableaux sont disposés ... Ainsi, l'objectif de ce tutoriel est de recréer nous-mêmes cet effet de bloc réactif ...
source: https://benholland.me/javascript/2012/02/20//how-to-build-a-site-that-works-like-pinterest.html
Module de disposition de grille CSS niveau 1
Ce module CSS définit un système de présentation bidimensionnel basé sur une grille, optimisé pour la conception d'interface utilisateur. Dans le modèle de présentation en grille, les enfants d'un conteneur de grille peuvent être positionnés dans des emplacements arbitraires d'une grille de présentation prédéfinie flexible ou de taille fixe.
Exemple de disposition de grille: Disposition de maçonnerie CSS uniquement mais avec des éléments ordonnés horizontalement
l'approche column
semble un bon compromis si vous définissez column-width
via vmin
ou vmax
unités et que vous supprimez column-count
(premier extrait), display:grid
et vmin
est également une option pour l'avenir (deuxième extrait).
extrait inspiré de @Lanti answer.
tester la démo avec vmin
.container {
}
ul {
margin: 0;
padding: 0;
}
ul li {
list-style: none;
font-size: 0;
}
.portfolio ul {
-webkit-column-width:50vmin;
-moz-column-width:50vmin;
column-width:50vmin;
-webkit-column-fill:balance;
-moz-column-fill:balance;
column-fill:balance;
-webkit-column-gap: 3px;
-moz-column-gap: 3px;
column-gap: 3px;
}
.portfolio ul:hover img {
opacity: 0.3;
}
.portfolio ul:hover img:hover {
opacity: 1;
}
.portfolio ul li {
margin-bottom: 3px;
}
.portfolio ul li img {
max-width: 100%;
transition: 0.8s opacity;
}
<section class="container portfolio">
<ul>
<li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_2959-1400px.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-010.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_6188-dng-k.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/20151220-csaladi-peregi-046-k.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/20151230-csalad-szalai-0194-k.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-001(1).jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171819-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171829-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171938-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171953-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528194754-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528184948-portfolio.jpg" alt="" /></li>
</ul>
</section>
un lien parmi d'autres https://web-design-weekly.com/2014/11/18/viewport-units-vw-vh-vmin-vmax/
display:grid
facilite également le remplissage automatique, mais il faudra définir une valeur d’étendue sur la plus grande image pour que les lignes et les colonnes puissent être incorporées.
.container {}
ul {
margin: 0;
padding: 0;
}
ul li {
list-style: none;
font-size: 0;
}
.portfolio ul {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(50vmin, 1fr));
grid-gap: 5px;
grid-auto-rows: minmax(10px, 1fr);
grid-auto-flow: dense;
}
.portfolio ul:hover img {
opacity: 0.3;
}
.portfolio ul:hover img:hover {
opacity: 1;
}
.portfolio ul li {
margin-bottom: 3px;
}
.portfolio ul li img {
max-width: 100%;
transition: 0.8s opacity;
}
li {
border: solid blue;
grid-row-end: span 1;
display: flex;
align-items: center;
background: lightgray;
}
li:nth-child(1),
li:nth-child(3),
li:nth-child(6),
li:nth-child(7),
li:nth-child(8),
li:nth-child(9),
li:nth-child(10),
li:nth-child(11) {
border: solid red;
grid-row-end: span 2
}
<section class="container portfolio">
<ul>
<li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_2959-1400px.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-010.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_6188-dng-k.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/20151220-csaladi-peregi-046-k.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/20151230-csalad-szalai-0194-k.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-001(1).jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171819-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171829-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171938-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171953-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528194754-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528184948-portfolio.jpg" alt="" /></li>
</ul>
</section>
vous pouvez voir https://css-tricks.com/snippets/css/complete-guide-grid/
Vous pouvez obtenir l'effet de maçonnerie selon votre capture d'écran, mais vous avez défini la hauteur de la div externe dynamiquement
html {
box-sizing: border-box;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
.item-list {
max-width: 400px;
border: 1px solid red;
display: -ms-flexbox;
-ms-flex-direction: column;
-ms-flex-wrap: wrap;
display: flex;
flex-direction: column;
flex-wrap: wrap;
height: 100vw;
}
.item-list__item {
border: 1px solid green;
width: 50%;
}
<div class="item-list" >
<div class="item-list__item">
Is we miles ready he might going. Own books built put civil fully blind fanny. Projection appearance at of admiration no. As he totally cousins warrant besides ashamed do. Therefore by applauded acuteness supported affection it. Except had sex limits
county enough the figure former add. Do sang my he next mr soon. It merely waited do unable.
</div>
<div class="item-list__item">
Is we miles ready he might going. Own books built put civil fully blind fanny. Projection appearance at of admiration no. As he totally cousins warrant besides ashamed do.
</div>
<div class="item-list__item">
Is we miles ready he might going. Own books built put civil fully blind fanny. Projection appearance at of admiration no. As he totally cousins warrant besides ashamed do. Therefore by applauded acuteness supported affection it. Except had sex limits
</div>
<div class="item-list__item">
Is we miles ready he might going. Own books built put civil fully blind fanny. Projection appearance at of admiration no. As he totally cousins warrant besides ashamed do.
</div>
<div class="item-list__item">
Is we miles ready he might going. Own books built put civil fully blind fanny. Projection appearance at of admiration no. As he totally cousins warrant besides ashamed do. Therefore by applauded acuteness supported affection it. Except had sex limits
</div>
</div>
Au lieu de flexbox
, je recommande d’utiliser columns pour des grilles comme celle-ci. Comme vous pouvez le constater, l'espacement sur les images du bas peut être meilleur, mais pour une solution CSS native, je pense que c'est très bien. Plus de JS:
.container {
max-width: 900px;
width: 100%;
margin: 0 auto;
}
ul {
margin: 0;
padding: 0;
}
ul li {
list-style: none;
font-size: 0;
}
.portfolio ul {
-moz-column-count: 4;
-webkit-column-count: 4;
column-count: 4;
-moz-column-gap: 3px;
-webkit-column-gap: 3px;
column-gap: 3px;
}
.portfolio ul:hover img {
opacity: 0.3;
}
.portfolio ul:hover img:hover {
opacity: 1;
}
.portfolio ul li {
margin-bottom: 3px;
}
.portfolio ul li img {
max-width: 100%;
transition: 0.8s opacity;
}
<section class="container portfolio">
<ul>
<li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_2959-1400px.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-010.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/IMG_6188-dng-k.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/20151220-csaladi-peregi-046-k.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/20151230-csalad-szalai-0194-k.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/lantosistvan-portfolio-001(1).jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171819-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171829-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171938-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528171953-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528194754-portfolio.jpg" alt="" /></li>
<li><img src="http://lantosistvan.com/temp/freecodecamp/160528184948-portfolio.jpg" alt="" /></li>
</ul>
</section>