Понимание CSS Grid: области шаблона сетки

Опубликовано: 2022-03-10
Краткое резюме ↬ В новой серии статей Рэйчел Эндрю разбирает спецификацию CSS Grid Layout. На этот раз мы рассмотрим, как использовать grid-template-areas для размещения элементов.

При использовании CSS Grid Layout вы всегда можете размещать элементы с одной линии сетки на другую. Однако существует альтернативный способ описания вашего макета, который носит визуальный характер. В этой статье мы узнаем, как использовать свойство grid-template-areas для определения размещения в сетке и выясним, как это свойство работает на самом деле.

Если вы пропустили предыдущие статьи этой серии, вы можете найти их здесь:

  • Часть 1: Создание грид-контейнера
  • Часть 2: Линии сетки
  • Часть 3: Области шаблона сетки

Описание макета с помощью grid-template-areas

Свойство grid-template-areas принимает в качестве значения одну или несколько строк. Каждая строка (заключенная в кавычки) представляет строку вашей сетки. Вы можете использовать свойство в сетке, которую вы определили с помощью grid-template-rows и grid-template-columns , или вы можете создать свой макет, и в этом случае все строки будут иметь автоматический размер.

Следующее свойство и значение описывают сетку с четырьмя областями, каждая из которых охватывает две дорожки столбцов и две дорожки строк. Область создается для охвата нескольких дорожек путем повторения имени во всех ячейках, которые вы хотели бы охватить:

 grid-template-areas: "one one two two" "one one two two" "three three four four" "three three four four";

Элементы размещаются в макете путем присвоения им имени с помощью свойства grid-area . Поэтому, если я хочу поместить элемент с классом test в область сетки с именем one , я использую следующий CSS:

 .test { grid-area: one; }

Вы можете увидеть это в действии в примере CodePen, показанном ниже. У меня есть четыре предмета (с классами от первого до четвертого); они назначаются соответствующей области сетки с помощью свойства grid-area и, следовательно, отображаются на сетке в правильных полях.

См. пример Grid-template-areas Pen Simple от Рэйчел Эндрю (@rachelandrew) на CodePen.

См. пример Grid-template-areas Pen Simple от Рэйчел Эндрю (@rachelandrew) на CodePen.

Если вы используете Firefox Grid Inspector, вы можете увидеть имена областей и линии сетки, демонстрирующие, что каждый элемент действительно охватывает две дорожки строки и две колонки — и все это без какого-либо линейного позиционирования самого элемента.

Сетка из четырех элементов с выделением линий инспектором сетки Firefox.
Каждый элемент занимает две строки и два столбца.

Правила использования grid-template-areas

Есть несколько правил при создании макета таким образом. Нарушение правил сделает значение недействительным, и поэтому ваш макет не будет реализован. Первое правило заключается в том, что вы должны описать полную сетку , т.е. каждая ячейка вашей сетки должна быть заполнена.

Если вы хотите оставить ячейку (или ячейки) пустым пространством, вы делаете это, вставляя файл . или серии, такие как ... без пробела между ними.

Поэтому, если я изменю значение grid-template-areas следующим образом:

 grid-template-areas: "one one two two" "one one two two" ". . four four" "three three four four";

Теперь у меня есть две ячейки без содержимого. Третий элемент отображается только в последней строке сетки.

Один элемент теперь занимает только одну строку, а инспектор сетки Firefox выделяет строки.
Теперь в сетке есть пробелы

Вы можете определить каждую область только один раз , а это означает, что вы не можете использовать это свойство для копирования содержимого в два места в сетке! Таким образом, следующее значение будет недопустимым и приведет к игнорированию всего свойства, поскольку мы продублировали область three :

 grid-template-areas: "one one three three" "one one two two" "three three four four" "three three four four";

Вы не можете создать непрямоугольную область, поэтому это свойство нельзя использовать для создания области в форме буквы «L» или «T», что делает следующее значение также недействительным:

 grid-template-areas: "one one two two" "one one one one" "three three four four" "three three four four";

Форматирование строк

Мне нравится отображать значение grid-template-areas , как показано выше (каждая строка представляет собой строку ниже предыдущей строки). Это дает мне визуальное представление о том, каким будет макет.

Чтобы помочь в этом, полезно добавить дополнительные пробельные символы между каждой ячейкой, а также использовать несколько файлов . символы, обозначающие пустые ячейки.

В приведенном ниже значении я использовал несколько пробелов между меньшими словами, а также несколько . символы, так что пустые ячейки выстраиваются в линию:

 grid-template-areas: "one one two two" "one one two two" "..... ..... four four" "three three four four";

Тем не менее, также вполне допустимо разместить все строки в одной строке, поэтому мы могли бы написать наш пример следующим образом:

 grid-template-areas: "one one two two" "one one two two" "three three four four" "three three four four";
Еще после прыжка! Продолжить чтение ниже ↓

Объяснение grid-template-areas grid-area

Причина, по которой каждая область должна быть полным прямоугольником, заключается в том, что она должна иметь ту же форму, которую вы могли бы создать, используя размещение на основе линий. Если мы будем придерживаться нашего примера выше, мы могли бы сделать этот макет с линиями сетки, как в следующем CodePen. Здесь я создал свою сетку, как и раньше. На этот раз, однако, я использовал линии сетки для создания позиционирования, используя свойства grid-column-start , grid-column-end , grid-row-start и grid-row-end .

См. размещение Pen Grid Line Рэйчел Эндрю (@rachelandrew) на CodePen.

См. размещение Pen Grid Line Рэйчел Эндрю (@rachelandrew) на CodePen.

Примечание . Если вы читали мою предыдущую статью «Понимание CSS-сетки: линии сетки», вы знаете, что можно использовать grid-area в качестве сокращения для объявления всех четырех строк одновременно.

Это означает, что мы также можем создать наш макет со следующим порядком строк:

  • grid-row-start
  • grid-column-start
  • grid-row-end
  • grid-column-end
 .one { grid-area: 1 / 1 / 3 / 3; } .two { grid-area: 1 / 3 / 3 / 5; } .three { grid-area: 3 / 1 / 5 / 3; } .four { grid-area: 3 / 3 / 5 / 5; }

Свойство grid-area интересно тем, что оно может принимать номера и имена строк. Также важно понимать, как он ведет себя по-разному в каждом режиме.

Использование grid-area с номерами строк

Если вы используете свойство grid-area с номерами строк, то строки назначаются в порядке, описанном выше.

Если вы пропустите какие-либо значения — поэтому укажите 1, 2 или 3 номера строки — пропущенные значения устанавливаются auto , что означает, что область будет охватывать 1 дорожку (это значение по умолчанию). Таким образом, следующий CSS поместит элемент grid-row-start: 3 со всеми остальными значениями, установленными в auto, поэтому элемент будет автоматически помещен в первую доступную дорожку столбца и охватывать одну дорожку строки и одну дорожку столбца.

 grid-area: 3;

Использование grid-area с идентификаторами

Если вы используете идентификатор (именно так называется именованная область в Grid Layout), то свойство grid-area также занимает четыре строки. Если у вас есть именованные линии в сетке, как описано в разделе «Понимание CSS-сетки: создание контейнера сетки», вы можете использовать эти именованные строки так же, как и пронумерованные.

Однако то, что происходит, когда вы пропускаете некоторые строки, отличается от того, когда вы используете идентификаторы, а не числа.

Ниже я создал сетку с именованными линиями и использовал grid-area для размещения элемента (отсутствует окончательное значение):

 .grid { display: grid; grid-template-columns: [one-start three-start] 1fr 1fr [one-end three-end two-start four-start] 1fr 1fr [two-end four-end]; grid-template-rows: [one-start two-start] 100px 100px [one-end two-end three-start four-start] 100px 100px [three-end four-end];; } .two { grid-area: two-start / two-start / two-end; }

Это означает, что нам не хватает имени строки для grid-column-end . Спецификация говорит, что в этой ситуации grid-column-end должен использовать копию grid-column-start . Если grid-column-end и grid-column-start идентичны, то конечная линия отбрасывается, и, по сути, значение устанавливается равным auto, поэтому мы охватываем одну дорожку, как в пронумерованной версии.

То же самое произойдет, если мы пропустим третье значение grid-row-end ; он становится таким же, как grid-row-start и, следовательно, становится auto .

Взгляните на следующий пример CodePen о том, как используется каждая grid-area и как это затем меняет макет элемента:

См. Pen Missing idents in grid-area от Рэйчел Эндрю (@rachelandrew) на CodePen.

См. Pen Missing idents in grid-area от Рэйчел Эндрю (@rachelandrew) на CodePen.

Это объясняет, почему grid-area работает с одним значением ident, представляющим имя области.

Когда мы создаем именованную область с помощью свойства grid-template-areas , на край каждой области можно ссылаться по имени линии, которое совпадает с именем области, которое вы использовали. В нашем случае мы могли бы взять нашу область с именем one и разместить наш элемент с помощью именованных строк следующим образом:

 .one { grid-row-start: one; grid-row-end: one; grid-column-start: one; grid-row-end: one; }

Если строка является строкой -start , то one разрешается в начальный конец столбца или строки. Если это -end строка, то one разрешается в конечную строку столбца или строки.

Это означает, что когда мы говорим grid-area: one , мы опускаем последние три значения для сокращения grid-area ; все они в конечном итоге являются копиями первого значения — в нашем случае все становятся one целым, и элемент размещается так же, как и при обычном использовании.

Способ, которым именование работает в Grid Layout, умен и позволяет использовать некоторые интересные вещи, о которых я писал в своих предыдущих статьях «Именование объектов в CSS Grid Layout» и «Редакционные шаблоны дизайна с CSS Grid и именованными столбцами».

Наслоение элементов при использовании grid-template-areas

Только одно имя может занимать каждую ячейку при использовании grid-template-areas , однако вы все равно можете добавлять дополнительные элементы в сетку после того, как сделаете свой основной макет таким образом. Вы можете использовать номера строк, как обычно.

В приведенном ниже примере CodePen я добавил дополнительный элемент и расположил его, используя линейное позиционирование поверх уже размещенных элементов:

См. Pen Размещение элемента с номерами строк Рэйчел Эндрю (@rachelandrew) на CodePen.

См. Pen Размещение элемента с номерами строк Рэйчел Эндрю (@rachelandrew) на CodePen.

Вы также можете использовать имена строк, определенные при создании обычных столбцов или строк. Более того, у вас будет несколько имен линий, созданных при формировании областей. Мы уже видели, как можно получить четыре имени строки с названием области. Вы также получаете линию на начальном краю каждой области с добавлением -start к имени области и линию на конечном краю каждой области с добавлением -end .

Таким образом, область с именем one имеет начальные краевые линии с именем one-start и конечные краевые линии с именем one-end .

Затем вы можете использовать эти неявные имена строк для размещения элемента в сетке. Это может быть полезно, если вы переопределяете сетку в разных контрольных точках, если вы всегда хотите, чтобы размещаемый элемент шел после определенного имени строки.

См. Pen Размещение элемента с неявными именами строк Рэйчел Эндрю (@rachelandrew) на CodePen.

См. Pen Размещение элемента с неявными именами строк Рэйчел Эндрю (@rachelandrew) на CodePen.

Использование областей шаблона сетки в адаптивном дизайне

Я часто работаю над созданием компонентов в библиотеке компонентов и считаю, что использование grid-template-areas может быть полезным с точки зрения возможности точно увидеть, как компонент будет выглядеть из CSS. Также очень просто переопределить компонент в разных контрольных точках, переопределив значение grid-template-areas иногда в дополнение к изменению количества доступных дорожек столбцов.

В приведенном ниже CSS я определил макет с одним столбцом для своего компонента. Затем, при минимальной ширине 600 пикселей, я переопределяю количество столбцов, а также значение grid-template-areas , чтобы создать макет с двумя столбцами. В этом подходе хорошо то, что любой, кто смотрит на этот CSS, может увидеть, как работает макет!

 .wrapper { background-color: #fff; padding: 1em; display: grid; gap: 20px; grid-template-areas: "hd" "bd" "sd" "ft"; } @media (min-width: 600px) { .wrapper { grid-template-columns: 3fr 1fr; grid-template-areas: "hd hd" "bd sd" "ft ft"; } } header { grid-area: hd; } article {grid-area: bd; } aside { grid-area: sd; } footer { grid-area: ft; }

Доступность

Вы должны знать, что при использовании этого метода очень легко перемещать вещи и вызывать проблему отключения визуального отображения от основного исходного порядка. Любой, кто перемещается по сайту или смотрит на экран во время озвучивания контента, будет использовать порядок, в котором вещи находятся в источнике. Перемещая отображение из этого порядка, вы можете создать очень запутанный, отсоединенный опыт. Не используйте этот метод для перемещения вещей, не убедившись также, что источник находится в разумном порядке и соответствует визуальному восприятию.

Резюме

Это суть использования свойств grid-template-area и grid-area для создания макетов. Если вы еще не использовали этот метод компоновки, попробуйте. Я считаю, что это прекрасный способ поэкспериментировать с макетами, и часто использую его при прототипировании макета — даже если по той или иной причине мы в конечном итоге будем использовать другой метод для производственной версии.

Переполнение и потеря данных в CSS

CSS предназначен для того, чтобы ваш контент был удобочитаемым. Давайте рассмотрим ситуации, в которых вы можете столкнуться с переполнением в своем веб-дизайне, и то, как эволюционировал CSS, чтобы создать лучшие способы управления и проектирования с учетом неизвестных объемов контента. Читать статью по теме →