Кодирование

Как я использую CSS Grid для создания одностраничного веб-сайта

Начните с визуализации макета и спланируйте сетку перед написанием кода.

Хотя есть и другие способы достижения той же разметки, например flexbox, я использую только CSS Grid, поскольку это является предметом внимания данной статьи.

Шаг 1. Спланируйте перед написанием кода

Планирование перед написанием кода заставляет меня принимать решение заранее

  • элементы, которые будут стилизованы как контейнеры-сетки (также известные как родительские)
  • нет. столбцов и строк мне нужно для каждого грид-контейнера

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

Основываясь на приведенном выше макете, я хочу добиться следующего:

A) Макет для отображения содержимого на странице. Мой нижний колонтитул остается внизу страницы, даже если у меня мало содержимого. Если содержание не может быть размещено на странице, моя страница будет расширяться соответствующим образом.

сетка-контейнер: body | элементы сетки: header, main и footer

столбцы: 1 | ряды: 3

Б) Элементы навигации можно переключать из строк в столбцы в зависимости от размера экрана.

сетка-контейнер: header | элементы сетки: nav1, nav2, nav3, nav4

(вид на рабочий стол) столбцов: 4 | ряды: 1

(мобильная версия) столбцов: 1 | ряды: 4

В) Содержимое в главном выровнено по центру.

сетка-контейнер: main | элементы сетки: ящик 1 и ящик 2

столбцы: 1 | ряды: 2

Шаг 2 - Создайте свой HTML-файл

Напечатайте html перед стилизацией.

Шаг 3 - Создайте файл CSS

Сетка-контейнер 1

Сначала я удаляю поля и отступы по умолчанию для html и body elements и добавляю высоту 100%.

Чтобы преобразовать body в сетку-контейнер, я добавляю к нему display: grid. Это автоматически изменяет прямые дочерние элементы body на элементы сетки.

Затем я работаю над созданием сетки, в которой я указываю ширину строк и высоту столбцов.

Чтобы нижний колонтитул сдвинулся до конца страницы, я добавляю grid-template-rows: min-content auto min-content.

min-content : Моя первая строка (она же заголовок) и последняя строка (она же нижний колонтитул) будут занимать минимум места, в котором они нуждаются.

auto : Моя вторая строка (также известная как основная) займет оставшуюся часть высоты родительского контейнера.

Сетка-контейнер 2

Для заголовка я преобразовываю элемент header ul в другой контейнер-сетку. Это преобразует Nav1-4 в элементы сетки.

Добавляю grid-template-columns: repeat(4, min-content). Это создает 4 столбца, ширина каждого из которых соответствует минимальному необходимому пространству.

Затем я добавляю justify-content: space-evenly, чтобы расположить элементы навигации по встроенной оси (строке) контейнера сетки.

Я добавляю несколько стилей в заголовок, чтобы он выглядел лучше.

Сетка-контейнер 3

Затем я работаю над main, элементом, который охватывает два div с классом .box.

Я преобразовываю main в контейнер-сетку, чтобы я мог использовать CSS Grid для размещения двух блоков в их соответствующих положениях. После этого я использовал grid-template-rows: min-content min-content и justify-content: center для достижения запланированного макета.

Теперь я хочу проверить сетку на предмет main element. Я открываю инструмент Grid Inspector в Firefox и выбираю main под сеткой наложения. Это покажет дорожки сетки в элементе main.

На приведенном выше снимке экрана дорожки сетки покрывают область, которая меньше, чем контейнер сетки (основной). Это означает, что мы можем использовать align-content для изменения его положения вдоль оси блока. Добавляю align-content: center.

В основной раздел добавлены стили, чтобы он выглядел лучше.

В footer добавлены стили, чтобы он выглядел лучше.

Наконец, я изменяю расположение элементов навигации в зависимости от размера экрана с помощью медиа-запроса. Это делается путем изменения свойства grid-template-columns.

Напомним, я добавил grid-template-columns: repeat(4, 1fr) к header ul. Если изменить его на grid-template-columns: none, столбцы не будут определены явно, и в моем макете сетки будет только один столбец.