Опубликовано: 19 сентября 2024 г.
Рабочая группа CSS объединила два предложения по каменной кладке CSS в один проект спецификации . Группа надеется, что это облегчит их сравнение и принятие окончательного решения. Команда Chrome по-прежнему считает, что отдельный синтаксис кладки будет лучшим способом продолжить работу. Хотя самая большая проблема с производительностью, упомянутая в нашей предыдущей статье, решена, по-прежнему существуют опасения по поводу синтаксиса, начальных значений и того, насколько легко будет изучить версию, объединенную с сеткой.
Однако, чтобы проверить наши предположения, мы рассмотрели несколько примеров, показывающих, как кладка будет работать с каждой версией. Взгляните на примеры в этом посте и оставьте свой отзыв, чтобы мы могли принять решение и продолжить работу над этой функцией.
 Этот пост не охватывает все возможные варианты использования, однако ясно, что отделение каменной кладки от макета сетки не приведет к потере функциональности этой функции. На самом деле, может быть и наоборот. Как вы увидите в этом посте, версия display: masonry открывает новые возможности и упрощает синтаксис. Кроме того, многие разработчики выразили обеспокоенность по поводу того, что изменение порядка элементов с каменной кладкой может вызвать проблемы с доступностью. Эта проблема также решается в обеих версиях синтаксиса посредством предлагаемого свойства reading-flow .
Базовая схема кладки
Именно такую планировку представляет себе большинство людей, думая о каменной кладке. Элементы отображаются рядами, и после размещения первой строки последующие элементы перемещаются в пространство, оставленное более короткими элементами.
 С display: masonry
 Чтобы создать макет каменной кладки, используйте значение masonry для свойства display . При этом создается макет кладки с дорожками колонн, которые вы определяете (или задаются содержимым), и кладкой на другой оси. Первый элемент отображается в начале блока и в строке (следовательно, вверху слева на английском языке), а элементы располагаются в направлении строки.
 Чтобы определить треки, используйте masonry-template-tracks со значениями списка треков, которые используются в макете сетки CSS.
.masonry {
  display: masonry;
  masonry-template-tracks: repeat(3, 1fr);
  gap: 10px;
}
 С display: grid
 Чтобы создать макет каменной кладки, сначала создайте макет сетки, используя значение grid для свойства display . Определите столбцы с помощью свойства grid-template-columns , затем присвойте grid-template-rows значение masonry .
Это создаст макет, как и следовало ожидать, с автоматически размещенными элементами сетки, однако элементы в каждой строке используют макет кладки и будут переупорядочены, чтобы занять место, оставленное меньшими элементами в предыдущей строке.
.masonry {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: masonry;
  gap: 10px;
}
Что следует учитывать между двумя вариантами
 Заметное различие между этими методами заключается в том, что с помощью версии display: masonry вы получаете макет кладки, даже если вы не указываете никаких дорожек с помощью masonry-template-tracks . Поэтому display: masonry может быть всем, что вам нужно. Это связано с тем, что начальное значение masonry-template-tracks — repeat(auto-areas, auto) . Макет создает столько дорожек с автоматическим размером, сколько помещается в контейнер.
Обратное течение с каменной кладкой
В спецификации указаны способы изменения направления потока кладки. Например, вы можете изменить порядок отображения, начиная с конца блока вверх.
С display: masonry
 Создайте макет каменной кладки с помощью display: masonry , затем используйте masonry-direction со значением column-reverse .
.masonry {
  display: masonry;
  masonry-template-tracks: repeat(3, 1fr);
  masonry-direction: column-reverse;
}
 С display: grid
 Создайте макет кладки с помощью display: grid grid-template-rows: masonry . Затем используйте свойство grid-auto-flow с новым значением row-reverse , чтобы элементы располагались с конца блока контейнера сетки.
.masonry {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: masonry;
  grid-auto-flow: row-reverse;
}
Что следует учитывать между двумя вариантами
 Версия display: masonry очень похожа на то, как работает flexbox. Измените направление движения столбцов, используя свойство masonry-direction со значением column-reverse .
 Версия сетки CSS использует grid-auto-flow . Как определено в настоящее время grid-auto-flow: row-reverse и grid-auto-flow: column-reverse дадут тот же эффект. Это может сбить с толку, поскольку вы можете ожидать, что они сделают что-то другое.
Кладка для рядов
Вы также можете изменить направление, чтобы определить строки.
С display: masonry
 Создайте макет кладки с помощью display: masonry , затем установите для masonry-direction значение row . Если вы не хотите, чтобы ваши строки имели определенный размер блока, вам не нужно указывать размер дорожки, поскольку по умолчанию установлено значение auto , поэтому дорожки будут иметь размер, соответствующий содержимому, которое они содержат.
.masonry {
  display: masonry;
  masonry-direction: row;
}
 С display: grid 
.masonry {
  display: grid;
  grid-template-columns: masonry;
  grid-template-rows: repeat(3, 1fr);
}
Что следует учитывать между двумя вариантами
 Как и в случае с обратным потоком, изменение версии display: masonry со столбцов на строки означает изменение значения masonry-direction . В версии Grid вам нужно будет переключить значения свойств grid-template-columns и grid-template-rows . Или, если вы используете сокращение, измените порядок синтаксиса.
 В обоих этих примерах переключения потока версия display: masonry кажется более интуитивно понятной. Существует одно свойство, управляющее направлением masonry-direction , оно принимает одно из следующих значений:
-  row
-  column
-  row-reverse
-  column-reverse
 Затем вы добавляете всю необходимую информацию о размерах в masonry-template-tracks , предполагая, что значение auto по умолчанию не то, что вам нужно.
 В случае с сеткой, чтобы сделать обратное направление, вам нужно использовать свойство grid-auto-flow , а для выполнения кладки строк переключите значение свойств grid-template-* . В текущем синтаксисе сетки также невозможно оставить значение оси сетки неопределенным. Вам всегда нужно указывать свойстваgrid grid-template-* на оси, которая не имеет значения masonry .
Позиция элементов
В обеих версиях вы можете явно позиционировать элементы, используя расположение на основе линий, с которым вы знакомы по макету сетки. В обеих версиях вы можете размещать элементы только на оси сетки , это ось с предопределенными дорожками, вы не можете размещать элементы на оси, которая выполняет компоновку кладки.
 С display: masonry
 Следующий CSS определяет макет каменной кладки с четырьмя столбцами. Таким образом, ось сетки представляет собой столбцы. Элемент класса a размещается от первой строки столбца до третьей строки столбца, охватывая две дорожки с новыми свойствами masonry-track-* . Это также можно определить как сокращение от masonry-track: 1 / 3; .
.masonry {
  display: masonry;
  masonry-template-tracks: repeat(4, 1fr);
}
.a {
  masonry-track-start: 1;
  masonry-track-end: 3;
}
 С display: grid
 Следующий CSS определяет макет каменной кладки с четырьмя столбцами. Таким образом, ось сетки представляет собой столбцы. Элемент класса a размещается от первой строки столбца до третьей строки столбца, охватывая две дорожки со свойствами grid-column-* . Это также можно определить как сокращение grid-column: 1 / 3; .
 Если осью сетки являются столбцы, то свойства grid-row-* будут игнорироваться, а если осью сетки являются строки, свойства grid-columns-* будут игнорироваться.
.masonry {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: masonry;
}
.a {
  grid-column-start: 1;
  grid-column-end: 3;
}
 Вы можете использовать именованные строки с обоими синтаксисами. В следующих примерах показана сетка с двумя строками столбцов с a .
 С display: masonry
 Именованные строки определены в значении списка дорожек masonry-template-tracks . Элемент можно разместить после любой строки с a .
.masonry {
  display: masonry;
  masonry-template-tracks: 100px [a] auto [a] auto 100px;
}
.item {
  masonry-track: a;
}
 С display: grid
 Именованные строки определены в значении списка дорожек grid-template-columns . Элемент размещается после первой строки с именем a . Если свойство grid-row определено, оно будет игнорироваться. 
.masonry {
  display: grid;
  grid-template-columns: 100px [a] auto [a] auto 100px;
  grid-template-rows: masonry;
}
.item {
  grid-column: a;
  grid-row: a; /* ignored */
}
Вы также можете использовать именованные области в обоих синтаксисах. В следующих примерах показана сетка с тремя дорожками с именами «a», «b» и «c».
 С display: masonry
 Дорожки называются в соответствии со значением masonry-template-areas . Поскольку размеры дорожек не определены, для всех трех по умолчанию выбран auto размер. Элемент помещается на дорожку «a». 
.masonry {
  display: masonry;
  masonry-template-areas: "a b c";
}
.item {
  masonry-track: a;
}
Это работает одинаково, определяете ли вы строки или столбцы; единственная разница будет заключаться в свойстве masonry-direction .
 С display: grid
 Для столбцов синтаксис практически идентичен. Аналогично, поскольку размеры дорожек не определены, все три по умолчанию имеют auto размер, но вам все равно нужно явно указать, что другая ось — каменная кладка: 
.masonry {
  display: grid;
  grid-template-areas: "a b c";
  grid-template-rows: masonry;
}
.item {
  grid-column: a;
}
Однако для rows значение должно быть записано по-другому, поскольку grid-template-areas фактически определяет двумерную область, и каждая строка записывается как отдельная строка: 
.masonry {
  display: grid;
  grid-template-areas: "a" "b" "c"; /* Note the difference, each row is quoted. */
  grid-template-columns: masonry;
}
.item {
  grid-row: a;
}
Что следует учитывать между двумя вариантами
 При любом позиционировании синтаксис display: masonry работает лучше, когда дело доходит до переключения направления. Поскольку свойство masonry-track-* работает в любом направлении оси сетки, все, что вам нужно сделать, чтобы изменить направление, — это изменить значение masonry-direction . В версии с сеткой вам, по крайней мере, потребуются избыточные свойства для включения переключения. Однако см. предыдущие примеры, чтобы узнать о других способах изменения направления, которые усложняются в версии с сеткой.
Сокращения
 В этом посте использовались длинные записи, чтобы было понятнее, какие свойства используются, однако версии display: masonry и display: grid можно определить с помощью сокращений.
 С display: masonry
 В сокращении display: masonry используется ключевое слово masonry . Чтобы создать базовый макет каменной кладки, используйте следующий CSS: 
.masonry {
  display: masonry;
  masonry: repeat(3, 1fr);
}
Чтобы создать простую компоновку кладки на основе рядов:
.masonry {
  display: masonry;
  masonry: row;
}
Чтобы определить дорожки и расположение строк с помощью сокращенной записи:
.masonry {
  display: masonry;
  masonry: repeat(3, 1fr) row;
}
 С display: grid
 Чтобы создать базовую компоновку каменной кладки, используя сокращение grid . 
.masonry {
  display: grid;
  grid: masonry / repeat(3, 1fr);
}
Чтобы создать простую компоновку кладки на основе рядов:
.masonry {
  display: grid;
  grid: repeat(3, auto) / masonry;
}
 В более сложных примерах, поскольку общий синтаксис display:masonry проще, в сокращенную запись можно упаковать больше свойств, не усложняя ее.
Например, представьте, что вы создаете три столбца с именами «a», «b» и «c», заполненные снизу вверх.
 С display:masonry
 В display: masonry все три из них можно объединить в сокращении: 
.masonry {
  display: masonry;
  masonry: column-reverse "a b c";
}
Поскольку они имеют автоматический размер, вам не нужно указывать размеры, но если вам нужен конкретный размер, его можно добавить. Например: masonry: column-reverse 50px 100px 200px "ab c"; .
 Кроме того, каждый компонент можно свободно переупорядочивать; нет никакого конкретного порядка, который вам нужно запомнить. А если вместо этого вы хотите использовать строки, все, что вам нужно сделать, это поменять местами column-reverse на row или row-reverse ; остальная часть синтаксиса остается прежней.
 С display: grid
 В display: grid эти три аспекта должны быть установлены отдельно: 
.masonry {
  display: grid;
  grid-template-rows: masonry;
  grid-template-areas: "a b c";
  grid-auto-flow: wrap-reverse;
}
Как и в примере с каменной кладкой, это приводит к auto размера всех столбцов, но если вы хотите указать явные размеры, вы можете сделать это: 
.masonry {
  display: grid;
  grid: masonry / 50px 100px 200px;
  grid-template-areas: "a b c";
  grid-auto-flow: wrap-reverse;
}
Или, если вы хотите использовать «сетку» для одновременного задания размеров и названий областей:
.masonry {
  display: grid;
  grid: "a b c" masonry / 50px 100px 200px;
  grid-auto-flow: wrap-reverse;
}
В обоих этих примерах порядок строго обязателен и может отличаться, если вам нужны строки. Например, переход к строкам выглядит так:
.masonry {
  display: grid;
  grid: 50px 100px 200px / masonry;
  grid-template-areas: "a" "b" "c";
}
Или, если объединить их все в одно сокращение:
.masonry {
  display: grid;
  grid: "a" 50px "b" 100px "c"  200px / masonry;
}
Что следует учитывать между двумя вариантами
 Сокращение display: masonry вероятно, будет широко использоваться, учитывая, что это относительно простое сокращение. Во многих случаях для «стандартной» компоновки каменной кладки вам просто нужно установить определения дорожек; все остальные значения могут принимать значения по умолчанию.
 Версия display: grid использует существующую сокращенную версию grid , которая является довольно сложной и, по нашему опыту, реже используется разработчиками. Как показано в предыдущих примерах, даже при использовании для простых макетов каменной кладки требуется осторожность при установке порядка значений.
Другие соображения
 В этом посте рассматриваются некоторые распространенные сегодня варианты использования, однако мы не знаем, что ждет в будущем сетку или каменную кладку. Большой аргумент в пользу использования отдельного display: masonry позволяет им расходиться в будущем. В частности, с начальными значениями, такими как значения для masonry-template-tracks , может быть полезно сделать в masonry что-то другое, чем это делает сетка. Мы не можем изменить настройки сетки по умолчанию, если выберем версию display: grid , это может ограничить то, что мы, возможно, захотим сделать в будущем.
 В этих примерах вы можете увидеть места, где браузеру приходится игнорировать свойства, действительные в сетке при использовании кладки. Например, grid-template-areas , где большая часть значений проходит, поскольку он определяет двухмерную компоновку сетки, в каменной кладке мы полностью определяем только одно направление.
Оставьте свой отзыв
Взгляните на эти примеры, а также на черновой вариант спецификации, в котором каждая версия располагается рядом с другой. Дайте нам знать, что вы думаете, комментируя выпуск 9041 , или, если вы предпочитаете написать сообщение в своем блоге или в социальных сетях, обязательно сообщите нам об этом в X или LinkedIn .