Comment créer une vue de grille / tuile?

par exemple, j'ai une classe .l'article, et je veux afficher cette classe comme une grille. Alors j'ai appliqué ce style:

.article{
  width:100px;
  height:100px;
  background:#333;
  float:left;
  margin:5px;
}

Que le style de faire de la .article regarder carrelé / grille. C'est un travail parfait avec une hauteur fixe. Mais si je veux régler la hauteur à auto (étirer automatiquement selon les données qu'il contient), la grille regarder désagréable.

enter image description here

et je veux faire la vue comme ceci:

enter image description here

105
demandé sur Paolo Forgia 2011-12-12 08:50:01

8 réponses

ce type de disposition est appelé disposition de maçonnerie . La maçonnerie est une autre disposition de grille, mais elle remplira l'espace blanc causé par la hauteur de différence des éléments.

jQuery Masonry est l'un des plugins jQuery pour créer la disposition de la maçonnerie.

alternativement, vous pouvez utiliser CSS3 column s. Mais pour l'instant le plugin basé sur jQuery est le meilleur choix puisqu'il y a Compatibilité problème avec la colonne CSS3.

74
répondu bookcasey 2016-02-17 20:13:11

vous pouvez utiliser flexbox.

  1. placez vos éléments dans une colonne multiligne flex container

    #flex-container {
      display: flex;
      flex-flow: column wrap;
    }
    
  2. réorganiser les éléments, de sorte que L'ordre DOM soit respecté horizontalement au lieu de verticalement. Par exemple, si vous voulez 3 colonnes,

    #flex-container > :nth-child(3n + 1) { order: 1; } /* 1st column */
    #flex-container > :nth-child(3n + 2) { order: 2; } /* 2nd column */
    #flex-container > :nth-child(3n + 3) { order: 3; } /* 3rd column */
    
  3. forcer une rupture de colonne avant le premier élément de chaque colonne:

    #flex-container > :nth-child(-n + 3) {
      page-break-before: always; /* CSS 2.1 syntax */
      break-before: always;  /* New syntax */
    }
    

    malheureusement, tous les navigateurs ne prennent pas encore en charge les sauts de ligne dans flexbox. Il fonctionne sur Firefox, cependant.

#flex-container {
  display: flex;
  flex-flow: column wrap;
}

#flex-container > :nth-child(3n + 1) { order: 1; } /* 1st column */
#flex-container > :nth-child(3n + 2) { order: 2; } /* 2nd column */
#flex-container > :nth-child(3n + 3) { order: 3; } /* 3rd column */

#flex-container > :nth-child(-n + 3) {
  page-break-before: always; /* CSS 2.1 syntax */
  break-before: always;  /* New syntax */
}

/* The following is optional */
#flex-container > div {
  background: #666;
  color: #fff;
  margin: 3px;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 36px;
}
#flex-container > :nth-child(1) { height: 100px; }
#flex-container > :nth-child(2) { height: 50px; }
#flex-container > :nth-child(3) { height: 75px; }
#flex-container > :nth-child(4) { height: 50px; }
#flex-container > :nth-child(5) { height: 100px; }
#flex-container > :nth-child(6) { height: 50px; }
#flex-container > :nth-child(7) { height: 100px; }
#flex-container > :nth-child(8) { height: 75px; }
#flex-container > :nth-child(9) { height: 125px; }
<div id="flex-container">
  <div>1</div><div>2</div><div>3</div>
  <div>4</div><div>5</div><div>6</div>
  <div>7</div><div>8</div><div>9</div>
</div>
23
répondu Oriol 2016-01-30 02:00:18

maintenant que CSS3 est largement disponible et compatible à travers les principaux navigateurs, son temps pour une solution pure équipée de so's snippet tool:


Pour la création de maçonnerie mise en page à l'aide de CSS3 column-count avec column-gap suffirait. Mais j'ai aussi utilisé media-queries pour le rendre réceptif.

avant de plonger dans le mise en œuvre, s'il vous plaît considérer qu'il serait beaucoup plus sûr d'ajouter une bibliothèque de repli de maçonnerie jQuery pour rendre votre code compatible pour le navigateur héritage, particulièrement IE8 -:

<!--[if lte IE 9]>
    <script src="/path/to/js/masonry.pkgd.min.js"></script>
<![endif]-->

nous y voilà:

.masonry-brick {
    color: #FFF;
    background-color: #FF00D8;
    display: inline-block;
    padding: 5px;
    width: 100%;
    margin: 1em 0; /* for separating masonry-bricks vertically*/
}

@media only screen and (min-width: 480px) {
    .masonry-container {
        -moz-column-count: 3;
        -webkit-column-count: 3;
        column-count: 3;
    }
}

@media only screen and (min-width: 768px) {
    .masonry-container {
        -moz-column-count: 4;
        -webkit-column-count: 4;
        column-count: 4;
    }
}

@media only screen and (min-width: 960px) {
    .masonry-container {
        -moz-column-count: 5;
        -webkit-column-count: 5;
        column-count: 5;
    }
}
<div class="masonry-container">
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
</div>
8
répondu Behrad Khodayar 2017-03-05 21:44:37

la meilleure option pour résoudre cela avec seulement css est d'utiliser la propriété CSS colonne-count.

 .content-box {
   border: 10px solid #000000;
   column-count: 3;
 }

vérifiez ceci pour plus d'informations: https://developer.mozilla.org/en/docs/Web/CSS/column-count

4
répondu Patricio Gabriel Maseda 2016-02-04 13:21:38

et si vous voulez aller encore plus loin que la maçonnerie, l'utilisation des isotopes http://isotope.metafizzy.co/ c'est la version avancée de la maçonnerie (développé par le même auteur), il n'est pas pur CSS, il utilise l'aide de Javascript, mais il est très populaire, de sorte que vous trouverez beaucoup de docs

si vous le trouvez très compliqué, alors il existe de nombreux plugins haut de gamme qui ont basé leur développement sur l'isotope déjà, par exemple Les Media Boxes http://codecanyon.net/item/media-boxes-responsive-jquery-grid/5683020

1
répondu user1978456 2015-08-31 15:43:34

vous pouvez utiliser display: grid

par exemple:

c'est une grille avec 7 colonnes et vos lignes ont la taille automatique.

.myGrid{
      display: grid;
      grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
      grid-auto-rows: auto;
      grid-gap: 10px;
      justify-items: center;
}

Pour plus de détails acccess le lien suivant: https://css-tricks.com/snippets/css/complete-guide-grid /

1
répondu vrbsm 2018-07-01 21:53:45

avec le CSS Grid Module vous pouvez créer un disposition assez similaire .

CodePen démo

1) placer trois colonnes de grille de largeur fixe

ul {
  display: grid;
  grid-template-columns: 150px 150px 150px;
  ...
}

2) Assurez-vous que les articles avec une grande portée de hauteur 2 lignes

li:nth-child(1),
li:nth-child(3),
li:nth-child(5),
li:nth-child(8),
li:nth-child(9),
li:nth-child(10),
li:nth-child(12)
{
  grid-row: span 2;
}

body {
  margin: 0;
}
ul {
  display: grid;
  grid-template-columns: 150px 150px 150px;
  grid-gap: 1rem;
  justify-content: center;
  align-items: center;
  
  /* boring properties: */
  list-style: none;
  width: 90vw;
  height: 85vh;
  margin: 4vh auto;
  border: 5px solid green;
  padding: 1rem;
  overflow: auto;
  counter-reset: item;
}
li {
  position: relative;
}
li:after {
  content: counter(item);
  counter-increment: item;
  position: absolute;
  padding: 0.3rem;
  background: salmon;
  color: white;
  left:0;
  top:0;
}
img {
  outline: 5px solid salmon;
}
li:nth-child(1),
li:nth-child(3),
li:nth-child(5),
li:nth-child(8),
li:nth-child(9),
li:nth-child(10),
li:nth-child(12)
{
  grid-row: span 2;
}
<ul>
  <li><img src="http://lorempixel.com/150/150/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/50/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/140/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/80/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/220/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/120/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/70/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/200/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/230/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/240/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/130/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/160/animals" alt="" /></li>
</ul>

Codepen démo

Les problèmes:

  • Les écarts entre les éléments ne seront pas en uniforme
  • vous devez régler manuellement les éléments grand/haut pour s'étendre sur 2 lignes ou plus
  • Limité prise en charge du navigateur :)
1
répondu Danield 2018-07-01 21:54:14

il y a un grid-based exemple.

.grid-layout {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  grid-gap: 10px;
  grid-auto-rows: minmax(100px, auto);
  grid-auto-flow: dense;
  padding: 10px;
}

.grid-layout .item {
  padding: 15px;
  color: #fff;
  background-color: #444;
}

.span-2 {
  grid-column-end: span 2;
  grid-row-end: span 2;
}

.span-3 {
  grid-column-end: span 3;
  grid-row-end: span 4;
}
<div class="grid-layout">
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item span-3">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item span-2">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item span-3">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item span-2">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
</div>

basé sur ce code-pen par Rachel Andrew F. T. W

0
répondu Vladimir Ishenko 2018-05-22 18:06:21