Понимание css grid (1 часть): grid-контейнер

Grid-зазоры

Grid-сетка автоматически создаёт горизонтальный зазор между столбцами и вертикальный между двумя последующими строками. По умолчанию grid-зазоры на больших экранах шире.

Современные технологии

Адаптивная вёрстка

Стандартный размер

Large зазор

Чтобы использовать большой зазор между грид-ячейками, просто добавьте класс .

Большой отступ

Большой отступ

Medium зазор

Чтобы применить зазор среднего размера между столбцами сетки, просто добавьте класс .

Средний отступ

Средний отступ

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

Мелкий отступ

Мелкий отступ

Типы GRID-систем

В настоящий время выделяют три основных типа GRID-систем:

  1. GRID на основе использования добровольно предоставляемого свободного ресурса персональных компьютеров (добровольная GRID);
  2. Научная GRID — хорошо распараллеливаемые приложения программируются специальным образом (например, с использованием Globus Toolkit);
  3. GRID на основе выделения вычислительных ресурсов по требованию (Enterprise GRID или коммерческая GRID) — обычные коммерческие приложения работают на виртуальном компьютере, который, в свою очередь, состоит из нескольких физических компьютеров, объединённых с помощью GRID-технологий.

Смешивание автоматического и «линейного» позиционирования

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

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

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

Сначала будут размещены «вручную» спозиционированные элементы, а остальные будут последовательно занимать оставшееся свободное место

Также, работа автоматического позиционирования немного меняется, если какие-то из элементов уже были размещены разработчиком. Сначала будут размещены «вручную» спозиционированные элементы, а остальные будут последовательно занимать оставшееся свободное место.

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

Стоит разобраться в принципах этого поведения, так как это может избежать ситуаций, в которых элементы будут оказываться в неожиданных для вас местах.

Sass

Одним из ограничений CSS Grid является то, что наши классы по умолчанию по-прежнему генерируются двумя переменными Sass: и . Это фактически предопределяет количество классов, сгенерированных в нашем скомпилированном CSS. У вас есть два варианта:

  • Измените эти переменные Sass по умолчанию и перекомпилируйте свой CSS.
  • Используйте встроенные или настраиваемые стили для расширения предоставленных классов.

Например, вы можете увеличить количество столбцов и изменить размер зазора, а затем изменить размер «столбцов» с помощью сочетания встроенных стилей и предопределенных классов столбцов таблицы CSS (например, ).

14 колонок
.g-col-4

линии сетки

Следует отметить,что когда мы определяем сетку,мы определяем трассы сетки,а не линии.Сетка затем дает нам пронумерованные линии для использования при позиционировании элементов.В нашей трёхстолбцовой,двухстолбцовой сетке мы имеем четыре строки.

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

Позиционирование элементов относительно линий

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

В следующем примере я помещаю первые два элемента в нашу сетку трёх столбцов, используя свойства , , и . Работая слева направо, первый элемент размещается напротив строки 1 столбца и охватывает линию 4 столбца, которая в нашем случае является крайней правой линией на сетке. Он начинается в строке 1 строки и заканчивается строкой 3 строки, поэтому охватывает две дорожки строки.

Второй пункт начинается на первой строке столбца сетки и простирается на одну дорожку.Это настройка по умолчанию,поэтому мне не нужно указывать конечную строку.Он также охватывает две дорожки от 3-й строки до 5-й строки.Остальные элементы будут располагаться на пустых местах в сетке.

<div class="wrapper">
  <div class="box1">One</div>
  <div class="box2">Two</div>
  <div class="box3">Three</div>
  <div class="box4">Four</div>
  <div class="box5">Five</div>
</div>
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
}

.box1 {
  grid-column-start: 1;
  grid-column-end: 4;
  grid-row-start: 1;
  grid-row-end: 3;
}

.box2 {
  grid-column-start: 1;
  grid-row-start: 3;
  grid-row-end: 5;
}

Примечание. Не забывайте, что вы можете использовать Инспектор сетки в Инструментах разработчика Firefox, чтобы увидеть, как элементы расположены относительно линий сетки.

Line-positioning shorthands

Полные значения, использованные выше, могут быть сжаты в одну строку для столбцов с и в одну строку для строк с . В следующем примере будет показано то же расположение, что и в предыдущем коде, но с гораздо меньшим количеством CSS. Значение перед символом косой черты ( ) — это начальная строка, значение после конечной строки.

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

.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
}

.box1 {
  grid-column: 1 / 4;
  grid-row: 1 / 3;
}

.box2 {
  grid-column: 1;
  grid-row: 3 / 5;
}

Наслаивание элементов при размещении по линиям

При автоматическом позиционировании, CSS Grid помещает элементы сетки в пустые ячейки, а не в одну и ту же. Однако, вы всё же можете сделать это с помощью их размещения с указанием конкретных линий. В следующем примере изображение занимает два строковых трека, а подпись расположена во втором строковом треке и имеет полупрозрачный фон.

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

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

Вложенные гриды

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

Если мы задаём для  значение  , то можем написать для него структуру треков, и он тоже станет гридом, а его дочерние элементы будут размещены внутри этого нового грида.

В данном случае вложенный грид не связан с родительским. Как вы можете видеть, он не наследует значение свойства (en-US) родительского элемента и линии вложенного грида не выравниваются по линиям родительского грида.

В спецификации гридов уровня 2 есть функциональность, называемая подгридом (subgrid) , которая позволит нам создавать вложенные гриды, использующие структуру треков родительского грида.

Примечание. Эта функция поставляется в браузере Firefox 71, который в настоящее время является единственным браузером для реализации subgrid.

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

Одинаковая, отзывчивая высота столбцов

Компонент Grid использует Flexbox, поэтому высота столбцов грида выстраивается автоматически. Чтобы добиться того же эффекта в старых браузерах, которые не поддерживают Flexbox, просто добавьте атрибут в свой grid-контейнер. Если грид состоит из нескольких строк, сопоставляются только столбцы грида в одной строке.

Чтобы сопоставить столбцы сетки по всем строкам, используйте .

Пример

Господа, склады ломятся от зерна.
Чистосердечное признание облегчает душу.
Каждый из нас понимает очевидную вещь: социально-экономическое развитие является качественно новой ступенью приоритизации разума над эмоциями.

Примечание
Если столбцы грида расширяются до 100% ширины, их высоты больше не будут совпадать. Это имеет смысл, например, когда они располагаются вертикально в более узких областях просмотра.

Одинаковая, отзывчивая высота блоков

Если вы хотите установить одинаковую высоту блокам в гриде, добавьте класс .
При использовании data-атрибута вам необходимо добавить селектор .

Пример

Сложно сказать, почему зима близко.

Сложно сказать, почему зима близко.

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

Управление расположением

Для создания сетки нужно условность свойство
display
в
grid или inline-grid.

Далее нужно указать как должна формироваться структура сетки, для этого используются свойства
grid-template-columns
и
grid-auto-rows.

Их синтаксис довольно прост, рассмотрим его на примере колонок.
Допустим, нам требуется сделать две колонки, у которых первая примерно в два раза больше второй. Тогда нужно перечислить ширину каждой ячейки по очереди:

 
grid-template-columns: 70% 30%;

— и все, третий элемент автоматически будет перенесен на новую строку.

Специально для сеток css grid появилась новая единица измерения fr (фракция), по своей сути она похожа на проценты, но позволяет более красиво задать отношения между шириной или высотой ячеек.

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

 
grid-template-columns: 2fr 1fr;

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

 
grid-template-columns: 1fr 3fr 2fr;

Учитывая, что может потребоваться, например, 12 ячеек одинакового размера, то можно использовать функцию повтора. Также ее можно комбинировать с обычными единицами, скажем, если 13 колонка должна быть 50 пикселей:

 
grid-template-columns: repeat(12, 1fr) 50px;

Также есть функция, позволяющая задать размер ячейки в зависимости от его контента, но не меньше переданного занчения:

 
grid-template-columns: 1fr fit-content(400px) 1fr;

И еще, не менее удобной и полезной функцией, является minmax, она позволяет задать минимальный и максимальный размер ячейки:

 
grid-auto-rows: minmax(150px, auto);

Со строками все тоже самое, но стоит обратить внимание на термин «Неявная сетка».
Проще его понять на примере, допустим у нас задана ширина для двух колонок и высота для 3 рядов:

 
grid-template-columns: 2fr 1fr;
grid-template-rows: repeat(3, 1fr);

тогда первые 6 ячеек будут расположены как указано, но что будет с 7 и последующими?
Они пойдут новым и рядами, но их высота будет выставлена в auto (значение по умолчанию) и как раз они будут считаться как элементы неявной сетки.

Это далеко не всегда удобно, поэтому существует свойство grid-auto-rows, оно позволяет выставить значения таким элементам сетки.

Пример общего кода:

 
.grid {
    display: grid;
    /*
    grid-template-columns: 70% 30%;
    grid-template-columns: 2fr 1fr;
    */
    grid-template-columns: repeat(3, 1fr) 2fr;

    /*
    Высота всех блоков:
    grid-auto-rows: 150px;
    */
    grid-auto-rows: minmax(150px, auto);
}

Также можно ознакомиться с несколькими
примерами, например, с тем, что можно внутри одной сетки расположить другую (вложенную) сетку или с тем, как ячейки могут накладываться друг на друга.

Special Units & Functions

fr units

You’ll likely end up using a lot of fractional units in CSS Grid, like . They essentially mean “portion of the remaining space”. So a declaration like:

Means, loosely, . Except that those percentage values are much more firm than fractional units are. For example, if you added padding to those percentage-based columns, now you’ve broken 100% width (assuming a box model). Fractional units also much more friendly in combination with other units, as you can imagine:

Sizing Keywords

When sizing rows and columns, you can use all the lengths you are used to, like , rem, %, etc, but you also have keywords:

  • : the minimum size of the content. Imagine a line of text like “E pluribus unum”, the min-content is likely the width of the word “pluribus”.
  • : the maximum size of the content. Imagine the sentence above, the is the length of the whole sentence.
  • : this keyword is a lot like units, except that they “lose” the fight in sizing against units when allocating the remaining space.
  • : use the space available, but never less than min-content and never more than .
  • fractional units: see above

Sizing Functions

The minmax() function does exactly what it seems like: it sets a minimum and maximum value for what the length is able to be. This is useful for in combination with relative units. Like you may want a column to be only able to shrink so far. This is extremely useful and probably what you want:

  • The function.
  • The function.

The repeat() Function and Keywords

The  function can save some typing:

But can get extra fancy when combined with keywords:

  • : Fit as many possible columns as possible on a row, even if they are empty.
  • Fit whatever columns there are into the space. Prefer expanding columns to fill space rather than empty columns.

This bears the most famous snippet in all of CSS Grid and one of the all-time great CSS tricks:

The difference between the keywords is spelled out in detail here.

Masonry

An experimental feature of CSS grid is masonry layout. Note that there are lots of approaches to CSS masonry, but mostly of them are trickery and either have major downsides or aren’t what you quite expect.

now, and this is behind a flag in Firefox:

See Rachel’s article for a deep dive.

Subgrid

Subgrid is an extremely useful feature of grids that allows grid items to have a grid of their own that inherits grid lines from the parent grid.

This is right now, but it really needs to get everywhere.

It’s also useful to know about . This is not the same as subgrid, but it can be a useful tool sometimes in a similar fashion.

Resize with Parent Container

We can dynamically react to screen changes by making use of the grid API features. In this section we describe a few recommended approaches to resize the grid and show/hide columns based on screen size changes.

These recipes below are suggestions — as the grid can be placed & positioned in your application in many ways and with many frameworks the suggestions below may not work out of the box in your particular application, but they should serve to help point you in the right direction.

Inside Flexbox Container

By default, the grid runs a timer that watches its container size and resizes the UI accordingly. This might interfere with the default behavior of elements with set. The simple workaround is to add to the grid element parent.

Open the example below in a new tab and resize the window to see how the grid instance gets resized accordingly.

For more information on how to work with flexbox, please visit: CSS Flexbox

Inside CSS Grid Container

By default the grid watches its container size and resizes the UI accordingly. This might interfere with the default behavior of elements with set. The simple workaround is to add to the grid element parent.

Open the example below in a new tab and resize the window to see how the grid instance gets resized accordingly.

For more information on how to work with the Grid Layout, please visit: CSS Grid Layout

The quickest way to achieve a responsive grid is to set the grid’s containing div to a percentage. With this simple change the grid will automatically resize based on the div size and columns that can’t fit in the viewport will simply be hidden and available to the right via the scrollbar.

Sometimes you want to have columns that don’t fit in the current viewport to simply be hidden altogether with no horizontal scrollbar.

To achieve this determine the width of the grid and work out how many columns could fit in that space, hiding any that don’t fit, constantly updating based on the event firing, like the next example shows.

This example is best seen when opened in a new tab — then change the horizontal size of the browser and watch as columns hide/show based on the current grid size.

Dynamic Vertical Resizing

Sometimes the vertical height of the grid is greater than the number of rows you have it in. You can dynamically set the row heights to fill the available height as the following example shows:

Расслоение элементов с z-index

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

Перекрытие без z-индекса

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

<div class="wrapper">
  <div class="box box1">One</div>
  <div class="box box2">Two</div>
  <div class="box box3">Three</div>
  <div class="box box4">Four</div>
  <div class="box box5">Five</div>
</div>
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
}

.box1 {
  grid-column-start: 1;
  grid-column-end: 4;
  grid-row-start: 1;
  grid-row-end: 3;
}

.box2 {
  grid-column-start: 1;
  grid-row-start: 2;
  grid-row-end: 4;
}

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

Контроль заказа

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

.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
}

.box1 {
  grid-column-start: 1;
  grid-column-end: 4;
  grid-row-start: 1;
  grid-row-end: 3;
  z-index: 2;
}

.box2 {
  grid-column-start: 1;
  grid-row-start: 2;
  grid-row-end: 4;
  z-index: 1;
}

Сходства и различия

Масло в огонь подливает то, что гридами и флексами можно решать одни и те же задачи. Например, сделать стики-футер
(когда подвал сайта прилипает к нижней части экрана), случайное количество карточек товара или каркас всей страницы.

Одно из преимуществ гридов — зазоры между линиями (gap), но и они перешли уже в общую спецификацию. Теперь gap можно использовать во флексах, что ещё больше добавляет путаницу
в выборе CSS-свойства.

Но тем не менее между флексами и гридами есть значимые различия.

Флексы — одномерные. Это значит, что управлять расположением в рядах нельзя.

Пример сетки на флексах

Гриды же двухмерные. То есть можно передвигать элементы между строками и рядами.

Пример сетки на гридах

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

Если взять целый сайт, с шапкой, контентной частью и подвалом, то здесь речь будет идти уже о двухмерности
интерфейса. И хотя флексами сайт тоже можно сверстать, гриды сделают это эффективнее и надёжнее.

Таким образом, гриды в основном используются для построения сетки всего интерфейса. Флексы же — для расположения
элементов внутри сетки.

Гриды — для каркаса сайта, флексы — для контента.

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

Чтобы быстрее это понять, можно потренироваться на навыках «Построение сеток на флексах» и «Построение сеток на гридах». Навыки покажут все различия
между способами построения сеток, помогут отработать оба и уложить это в голове.

Функция minmax(), auto-fill и auto-fit

Рассмотрим пример с использованием этой функции.

Запись означает, что минимальный размер столбца равен 120px, а максимальный — 1fr.

делает наш грид адаптивным, то есть в нем элементы меняют свои позиции с тем, как мы меняем размер окна браузера.

Ширина окна браузера 450px:

Ширина окна браузера 300px:

Ширина окна браузера 200px:

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

Чтобы показать разницу, рассмотрим следующие примеры:

С у нас три колонки

С пустая колонка исчезает

Области сетки Grid Areas

CSS Grid Area — области сетки. Например, то, что бывает в обычном макете страницы: хедер, футер, главная часть и сайдбар. При помощи данного инструмента верстают различные раскладки. Мы попробуем на примере такой:

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

Ячейка Header заняла весь первый ряд. Ячейка Sidebar растянулась на 3 и 4 ряд в первой колонке. И это поведение можно описать при помощи уже известных нам свойств и , но это плохо воспринимается визуально и вы не сразу поймете с какой раскладкой имеете дело, глядя только в код

По сути, мы видим две колонки и три ряда. Ячейка Header заняла весь первый ряд. Ячейка Sidebar растянулась на 3 и 4 ряд в первой колонке. И это поведение можно описать при помощи уже известных нам свойств и , но это плохо воспринимается визуально и вы не сразу поймете с какой раскладкой имеете дело, глядя только в код.

А можно воспользоваться инструментом Grid Area:

1). Описываем привычным способом колонки и ряды.

2). Описываем раскладку в свойстве .Просто называем сущности так как нам удобно. В данном случае по содержимому. И поехали. Первый ряд описываем в двойных кавычках через пробел: первую и вторую ячейку первого ряда занимает header Пробел и описываем второй ряд: первая ячейка — aside, вторая — main. Таким же образом описываем третий ряд. получается весьма наглядно:

3). Каждому тегу присваиваем имя области через

4). Для того, чтобы Footer оказался внизу, а Main занял все свободное место, следует добавить

Поработать с областями сетки сюда.

See the Pen CSS Grid — №11 Области сетки Grid Areas by Webcademy.ru online school (@webcademy) on CodePen.dark

Единица fr

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

Всего у нас 3 единицы fr, так что каждый из столбцов будет иметь 1/3 общей ширины. Вот еще пример:

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

Это по-настоящему мощные единицы, особенно в связке с другими единицами измерения:

В этом примере мы задали четыре столбца:

  • Первый фиксированной ширины в 300px
  • Последний может подстраиваться, имея ширину 20% от общей ширины контейнера
  • единицы fr сами генерируют свою ширину, оставляя второму столбцу всего одну часть от оставшегося пространства
  • а третьему – три части.

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

Вернемся теперь к нашей основной сетке. Давайте заменим неточные и топорные 33.33% на 1fr:

Финальная версия:

Выравнивание ячеек внутри колонок и рядов

По умолчанию ячейки тянутся на всю ширину колонки и ряда. За это отвечают свойства для колонок и для рядов. Итак, по умолчанию их значение — то есть растягиваться на всю ширину.

Другие значения свойства:

— ячейка прилипает к началу колонки или ряда

— ячейка прилипает к концу колонки или ряда

— ячейка располагается по центру

Сравним поведение ячеек при использовании различных комбинаций этих свойств и значений. Для этого следует задать сначала задать фиксированные ширины для колонок и для рядов — что бы видеть поведение ячеек при дальнейших манипуляциях.

See the Pen CSS Grid — №9 Выравнивание ячеек by Webcademy.ru online school (@webcademy) on CodePen.dark

Тренируйтесь тут. Попробуйте добавлять больше контента в некоторые ячейки. И не забывайте заглядывать в инспектор (нажатием F12), увидите, что размеры колонок остаются неизменными.

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

Объединение CSS Grid и Flexbox

Не только у каждого модуля макета есть свои варианты использования, но мы можем использовать их оба. Когда я думаю об их объединении, первое, что у меня возникает, — это список карточек. Grid используется для размещения карт, а flexbox используется для самого компонента карточки.

Вот требования к макету:

  • Высота карточек для каждого ряда должна быть одинаковой.
  • Ссылка «read more» должна располагаться в конце карточки независимо от ее высоты.
  • grid должна использовать функцию minmax()
<div class="wrapper">
    <article class="card">
        <img src="sunrise.jpg" alt="">
    <div class="card__content">
      <h2><!-- Title --></h2>
      <p><!-- Desc --></p>
      <p class="card_link"><a href="#">Read more</a></p>
    </div>
    </article>
</div>
@media (min-width: 500px) {
    .wrapper {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
        grid-gap: 16px;
    }
}

.card {
    display: flex; /*  */
    flex-direction: column; /*  */
}

.card__content {
    flex-grow: 1; /*  */
    display: flex; /*  */
    flex-direction: column;
}

.card__link {
    margin-top: auto; /*  */
}

Позвольте мне объяснить приведенный выше CSS.

  1. Делаем карточки как обертку flexbox.
  2. direction — column, что означает, что элементы карточек уложены друг на друга.
  3. Позволим содержимому карточек расшириться и заполнить оставшееся пространство.
  4. Делаем содержимое карточек как оболочку flexbox.
  5. Наконец, используйте margin-top: auto, чтобы переместить ссылку вниз. Это сохранит ее положение в конце независимо от высоты карточки.

Как вы видели, объединить CSS grid и flexbox несложно. Эти два инструмента могут дать нам множество способов реализовать макеты в Интернете. Давайте использовать их правильно и комбинировать только при необходимости, как указано выше.

Свойство justify-content

Может случиться так, что общий размер сетки будет больше, чем размер grid-контейнера. Например, такое может произойти, если ширина всех grid-элементов является фиксированной (т. е. задана в таких единицах как ). В этом случае вы можете установить выравнивание сетки в grid-контейнере с помощью свойства . Это свойство выравнивает сетку вдоль оси строки.

Доступные значения:

  • — изменяет размеры grid-элементов так, чтобы сетка могла заполнить всю ширину grid-контейнера;
  • — выравнивает сетку по левому краю grid-контейнера;
  • — выравнивает сетку по правому краю grid-контейнера;
  • — выравнивает сетку по центру grid-контейнера;
  • — добавляет равное количество пространства между каждым grid-элементом, а по краям сетки оставляет половину этого пространства;
  • — добавляет равное количество пространства между каждым grid-элементом, но по краям сетки не создает пространства;
  • — добавляет равное количество пространства между каждым grid-элементом, включая края сетки.
.grid-container {
  justify-content: stretch;
}
.grid-container {
  justify-content: start;
}
.grid-container {
  justify-content: end;
}
.grid-container {
  justify-content: center;
}
.grid-container {
  justify-content: space-around;
}
.grid-container {
  justify-content: space-between;
}
.grid-container {
  justify-content: space-evenly;
}

Выводы

CSS Grid открывает перед разработчиками мощные возможности, но полноценно реализовать их пока мешает недостаточная поддержка браузеров IE10 и 11 (поддерживаются частично свойства через вендорные префиксы).

Преимущества

  • CSS Grid сделает HTML более чистым (разметка проще, отсутствие множества классов и дополнительных тегов).
  • Простота макета страницы.
  • Гибкость и адаптация при работе с элементами.
  • Layout можно изменять, не затрагивая разметку.
  • Возможность построения блоков в двумерном пространстве (layout учитывает горизонтальное и вертикальное пространство одновременно).
  • Нет ограничений по элементам построения сетки макета.
  • Отлично подходит для создания больших макетов и управления ими.
  • Возможно создавать сайты с динамическим контентом.
  • Медиазапросы не требуются, чтобы адаптироваться к свободному пространству.

Недостатки

Частичная поддержка в браузерах IE10 и IE11.

Grid остается революционной областью для веб. Его возможности в сочетании с другими инструментами позволят создавать более интересные и гибкие раскладки без лишних стилей, не думая про отдельные фреймворки.

И напоследок, эту статью я также опубликовал на английском в нашем блоге.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: