Как создать вид сетки / плитки?


129

Например, у меня есть класс .article, и я хочу видеть этот класс в виде сетки. Итак, я применил этот стиль:

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

В этом стиле .article будет выглядеть мозаично / сеткой. Он отлично работает с фиксированной высотой. Но если я хочу установить высоту автоматически (автоматически растягиваться в соответствии с данными в ней), сетка выглядит неприятно.

введите описание изображения здесь

И я хочу сделать такой вид:

введите описание изображения здесь

Ответы:


79

Такой вид планировки называется кладкой . Каменная кладка - это еще одна сетка, но она заполняет пробелы, вызванные разницей в высоте элементов.

jQuery Masonry - один из плагинов jQuery для создания макета каменной кладки.

В качестве альтернативы вы можете использовать CSS3 columns. Но пока плагин на основе jQuery - лучший выбор, поскольку существует проблема совместимости со столбцом CSS3.


3
Добавлена CSS3-путь здесь , чтобы остаться!
behradkhodayar 05

27

Вы можете использовать flexbox.

  1. Поместите элементы в гибкий контейнер с многострочным столбцом

    #flex-container {
      display: flex;
      flex-flow: column wrap;
    }
  2. Измените порядок элементов так, чтобы порядок DOM соблюдался по горизонтали, а не по вертикали. Например, если вам нужно 3 столбца,

    #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. Разрыв столбца перед первым элементом каждого столбца:

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

    К сожалению, не все браузеры пока поддерживают разрывы строк в flexbox. Однако он работает в Firefox.


Вау, это был старый вопрос. И использование флексбокса для имитации разметки кладки - не лучший вариант. Ваш фрагмент, кстати, не работает: D, я думаю, вы упускаете суть здесь. Другой способ решения этой проблемы - использование столбцов CSS3. но, спасибо за ответ
Ариона Риан

1
@ArionaRian Попробуйте этот фрагмент в Firefox, другие браузеры пока не поддерживают принудительный перенос строки. И да, столбцы CSS тоже могут работать, но в отличие от flexbox, который кажется больше предназначен для текста, чем для макета.
Oriol

Да, вот в чем проблема :) Вот почему до сих пор мы все еще придерживаемся плагина masonry / isotope для разметки такого дизайна.
Ariona Rian

Просто поставьте display: flex; flex-wrap: обертка; (и не более того) в контейнере, и он отлично работает в Chrome, Firefox, Safari, IE11 на Win11 и Win7. Однако будьте осторожны с min-height (см. Caniuse.com/#search=flex-wrap )
LBJ

@LBJ Но тогда элементы располагаются рядами. Это нежелательное поведение здесь,
Oriol

11

Теперь, когда CSS3 широко доступен и совместим с основными браузерами, пришло время для чистого решения, оснащенного инструментом сниппета SO:


Для создания макета кирпичной кладки с использованием CSS3 будет достаточно column-countвместе с column-gap. Но я также media-queriesделал его отзывчивым.

Прежде чем погрузиться в реализацию, учтите, что было бы намного безопаснее добавить резервную библиотеку jQuery Masonry, чтобы сделать ваш код совместимым с устаревшим браузером, особенно IE8-:

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

Вот так:

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


Знаете ли вы, как обеспечить равное пространство между элементами в кладке и емкости?
intcreator

5
Это хорошо, но для многих людей необходимо ЗАКАЗАТЬ masonry bricks. Столбец упорядочивает вещи сверху вниз, вопрос заключался в том, чтобы порядок оставался неизменным по горизонтали, а не переключался на вертикальный. Например, самый короткий блок, найденный выше, ДОЛЖЕН находиться в третьем столбце, но в верхней строке.
jscul


3

Вы можете использовать display: grid

например:

Это сетка с 7 столбцами, и ваши строки имеют автоматический размер.

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

Для получения дополнительной информации перейдите по следующей ссылке: https://css-tricks.com/snippets/css/complete-guide-grid/


2

С помощью модуля CSS Grid вы можете создать довольно похожий макет.

Демо CodePen

1) Установите три столбца сетки фиксированной ширины

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

2) Убедитесь, что предметы с большой высотой занимают 2 ряда.

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

Проблемы:

  • Промежутки между предметами не будут одинаковыми
  • Вы должны вручную установить большие / высокие элементы, чтобы они занимали 2 или более строк.
  • Ограниченная поддержка браузера :)

1

и если вы хотите пойти еще дальше, чем кладка, используйте изотоп http://isotope.metafizzy.co/, это расширенная версия каменной кладки (разработанная тем же автором), это не чистый CSS, он использует помощь Javascript но он очень популярен, поэтому вы найдете множество документов

если вы находите это очень сложным, то есть много плагинов премиум-класса, которые уже основывают свою разработку на изотопах, например Media Boxes http://codecanyon.net/item/media-boxes-responsive-jquery-grid/5683020


1

Вот один пример на основе сетки .

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

на основе этой кодовой ручки Рэйчел Эндрю FTW

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.