Необходима обратная связь: как нам следует определить CSS-кладку?

Опубликовано: 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-tracksrepeat(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-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 .