Come creare una vista griglia / affiancata?


129

Ad esempio, ho una classe .article e voglio vedere questa classe come vista a griglia. Quindi ho applicato questo stile:

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

Questo stile renderà il .article aspetto piastrellato / griglia. Funziona bene con altezza fissa. Ma se voglio impostare l'altezza su auto (allungare automaticamente in base ai dati al suo interno), la griglia sembra cattiva.

inserisci qui la descrizione dell'immagine

E voglio rendere la vista in questo modo:

inserisci qui la descrizione dell'immagine

Risposte:


78

Questo tipo di layout è chiamato layout in muratura . La muratura è un altro layout di griglia ma riempie lo spazio bianco causato dalla differenza di altezza degli elementi.

jQuery Masonry è uno dei plugin jQuery per creare layout in muratura.

In alternativa, puoi usare CSS3 column. Ma per ora il plugin basato su jQuery è la scelta migliore poiché esiste un problema di compatibilità con la colonna CSS3.


3
Aggiunto il modo CSS3 qui per rimanere!
Behradkhodayar,

27

Puoi usare flexbox.

  1. Posiziona i tuoi elementi in un contenitore flessibile a colonne multilinea

    #flex-container {
      display: flex;
      flex-flow: column wrap;
    }
  2. Riordinare gli elementi, in modo che l'ordine DOM venga rispettato in senso orizzontale anziché verticale. Ad esempio, se vuoi 3 colonne,

    #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. Forza un'interruzione di colonna prima del primo elemento di ogni colonna:

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

    Purtroppo, non tutti i browser supportano ancora le interruzioni di riga in flexbox. Funziona su Firefox, però.


Caspita, questa era una vecchia domanda. E l'uso di flexbox per simulare il layout in muratura non è la migliore opzione. Il tuo frammento non funziona in questo modo: D, penso che ti sfugga il punto qui. L'altra soluzione alternativa per risolvere questo problema è utilizzando le colonne CSS3. ma, grazie per la risposta
Ariona Rian il

1
@ArionaRian Prova lo snippet su Firefox, altri browser non supportano ancora le interruzioni di riga forzate. E sì, anche le colonne CSS potrebbero funzionare, ma a differenza della flexbox che sembra più progettata per il testo che per il layout.
Oriol

Sì, questo è il problema :), ecco perché fino ad ora, siamo ancora fedeli al plug-in in muratura / isotopo per definire questo tipo di design.
Ariona Rian,

Basta mettere display: flex; avvolgimento flessibile: avvolgimento; (e nient'altro) sul contenitore, e funziona perfettamente in Chrome, Firefox, Safari, IE11 su Win11 e Win7. Fai attenzione all'altezza minima, però (vedi caniuse.com/#search=flex-wrap )
LBJ

@LBJ Ma poi gli elementi sono disposti in file. Questo non è il comportamento desiderato qui
Oriol

11

Ora che CSS3 è ampiamente disponibile e compatibile con i principali browser, è tempo di una soluzione pura dotata dello strumento snippet di SO:


Per la creazione di layout in muratura utilizzando CSS3 è sufficiente il metodo column-countinsieme column-gap. Ma l'ho anche usato media-queriesper renderlo reattivo.

Prima di immergerti nell'implementazione, tieni presente che sarebbe molto più sicuro aggiungere un fallback della libreria di jQuery Masonry per rendere il tuo codice compatibile per il browser legacy, in particolare IE8-:

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

Eccoci qui:

.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>


Sai come avere lo stesso spazio tra gli oggetti in muratura e il contenitore?
Intcreatore,

5
È buono ma per molte persone, è necessario ORDINARE masonry bricks. La colonna ordina le cose dall'alto verso il basso, la domanda era che l'ordine rimanesse lo stesso in orizzontale, non in verticale. Ad esempio, il blocco più corto trovato sopra DOVREBBE essere nella terza colonna ma nella riga superiore.
jscul,


3

Puoi usare display: grid

per esempio:

Questa è una griglia con 7 colonne e le tue righe hanno dimensioni automatiche.

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

Per maggiori dettagli accedi al seguente link: https://css-tricks.com/snippets/css/complete-guide-grid/


2

Con il modulo griglia CSS puoi creare un layout abbastanza simile .

Demo CodePen

1) Impostare tre colonne della griglia a larghezza fissa

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

2) Accertarsi che gli articoli con altezza elevata si estendano su 2 file

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;
}

Demo Codepen

I problemi:

  • Gli spazi tra gli oggetti non saranno uniformi
  • Devi impostare manualmente gli elementi grandi / alti su 2 o più righe
  • Supporto per browser limitato :)


1

C'è un esempio basato sulla griglia .

.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>

basato su questa penna di codice di Rachel Andrew FTW

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.