Jak utworzyć widok siatki / kafelków? [duplikować]

132

Na przykład mam jakąś klasę .article i chcę zobaczyć tę klasę jako widok siatki. Więc zastosowałem ten styl:

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

Ten styl sprawi, że .article będzie wyglądać jak kafelki / siatka. Działa dobrze przy stałej wysokości. Ale jeśli chcę ustawić wysokość na automatyczną (automatycznie rozciągnij zgodnie z zawartymi w niej danymi), siatka wygląda paskudnie.

wprowadź opis obrazu tutaj

Chcę zrobić taki widok:

wprowadź opis obrazu tutaj

Ariona Rian
źródło

Odpowiedzi:

80

Ten typ układu nazywa się układem murarskim . Mur to kolejny układ siatki, ale wypełni on białe znaki spowodowane różnicą wysokości elementów.

jQuery Masonry to jedna z wtyczek jQuery do tworzenia układu masonry.

Alternatywnie możesz użyć CSS3 column. Ale na razie wtyczka oparta na jQuery jest najlepszym wyborem, ponieważ występuje problem ze zgodnością z kolumną CSS3.

regał
źródło
3
Dodano sposób CSS3 , aby zostać!
BehradKhodayar
27

Możesz użyć flexbox.

  1. Umieść swoje elementy w wieloliniowym, elastycznym kontenerze

    #flex-container {
      display: flex;
      flex-flow: column wrap;
    }
    
  2. Zmień kolejność elementów, aby kolejność DOM była przestrzegana w poziomie, a nie w pionie. Na przykład jeśli chcesz mieć 3 kolumny,

    #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. Wymuś podział kolumny przed pierwszą pozycją w każdej kolumnie:

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

    Niestety, nie wszystkie przeglądarki obsługują jeszcze podział wiersza we flexboksie. Działa jednak w przeglądarce Firefox.

Oriol
źródło
Wow, to było stare pytanie. A użycie flexboksa do symulacji układu muru nie jest najlepszym rozwiązaniem. Twój fragment nie działa tak przy okazji: D, myślę, że nie rozumiesz tutaj. Innym sposobem rozwiązania tego problemu jest użycie kolumn CSS3. ale dziękuję za odpowiedź
Ariona Rian
1
@ArionaRian Wypróbuj fragment kodu w przeglądarce Firefox, inne przeglądarki nie obsługują jeszcze wymuszonego łamania linii. I tak, kolumny CSS też mogą działać, ale w przeciwieństwie do flexboksa, który wydaje się być bardziej zaprojektowany dla tekstu niż dla układu.
Oriol
Tak, w tym problem :), Dlatego do tej pory wciąż trzymamy się wtyczki masonry / isotope przy tworzeniu tego rodzaju projektów.
Ariona Rian
Po prostu umieść wyświetlacz: flex; flex-wrap: wrap; (i nic więcej) na kontenerze i działa idealnie w Chrome, Firefox, Safari, IE11 na Win11 i Win7. Uważaj jednak na min-height (patrz caniuse.com/#search=flex-wrap )
LBJ,
@LBJ Ale wtedy elementy są ułożone w rzędy. To nie jest pożądane zachowanie tutaj
Oriol,
12

Teraz, gdy CSS3 jest szeroko dostępny i kompatybilny z większością przeglądarek, nadszedł czas na czyste rozwiązanie wyposażone w narzędzie do fragmentów kodu SO:


Do stworzenia układu muru przy użyciu CSS3 wystarczyłoby column-countrazem z column-gap. Ale kiedyś też sprawiłem, media-queriesże będzie reagował.

Przed przystąpieniem do implementacji, proszę wziąć pod uwagę, że znacznie bezpieczniej byłoby dodać rezerwową bibliotekę jQuery Masonry, aby Twój kod był zgodny ze starszą przeglądarką, szczególnie IE8-:

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

No to ruszamy:

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

BehradKhodayar
źródło
Czy wiesz, jak zachować równą przestrzeń między przedmiotami w murze i pojemniku?
intcreator
7
To dobrze, ale dla wielu osób istnieje konieczność ZAMÓWIENIA masonry bricks. Kolumna porządkuje rzeczy z góry na dół, pytaniem było, aby kolejność pozostała taka sama w poziomie, a nie w pionie. Na przykład najkrótszy blok znaleziony powyżej POWINIEN znajdować się w trzeciej kolumnie, ale w górnym wierszu.
jscul
4

Najlepszą opcją rozwiązania tego problemu przy użyciu tylko CSS jest użycie właściwości css column-count.

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

Sprawdź to, aby uzyskać więcej informacji: https://developer.mozilla.org/en/docs/Web/CSS/column-count

Patricio Gabriel Maseda
źródło
3

Możesz użyć display: grid

na przykład:

To jest siatka z 7 kolumnami, a Twoje wiersze mają automatyczny rozmiar.

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

Aby uzyskać więcej informacji, przejdź pod następujący link: https://css-tricks.com/snippets/css/complete-guide-grid/

vrbsm
źródło
2

Jest jeden przykład oparty na siatce .

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

na podstawie tego pisaka kodu autorstwa Rachel Andrew FTW

vovchisko
źródło
2

Dzięki modułowi siatki CSS możesz stworzyć całkiem podobny układ.

Demo CodePen

1) Ustaw trzy kolumny siatki o stałej szerokości

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

2) Upewnij się, że elementy o dużej wysokości obejmują 2 rzędy

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

Codepen demo

Problemy:

  • Luki między przedmiotami nie będą jednolite
  • Musisz ręcznie ustawić duże / wysokie elementy tak, aby obejmowały 2 lub więcej rzędów
  • Ograniczona obsługa przeglądarki :)
Danield
źródło
1

a jeśli chcesz pójść jeszcze dalej niż masonry, użyj isotope http://isotope.metafizzy.co/ to jest zaawansowana wersja masonry (opracowana przez tego samego autora) to nie jest czysty CSS, korzysta z pomocy Javascript ale jest bardzo popularny, więc znajdziesz mnóstwo dokumentów

jeśli uznasz to za bardzo skomplikowane, istnieje wiele wtyczek premium, które już oparły swój rozwój na izotopie, na przykład Media Boxes http://codecanyon.net/item/media-boxes-responsive-jquery-grid/5683020

user1978456
źródło