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

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.


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.


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>


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


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/


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


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 :)

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.