Flexbox, viewport и адаптивный интерфейс мобильной страницы

Подготовьтесь заранее

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

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

Сегодня разберём три простые вещи: какой элемент управляет расположением карточек, чем отличаются строка, столбец и перенос, зачем странице настройка viewport. Внедрять Flexbox в свой проект будем на следующей компьютерной практике.


Flexbox: родитель и его дети

Flexbox помогает располагать элементы рядом или друг под другом. Для этого родителю задают display: flex. Этот родитель называется контейнером. Правило управляет только его непосредственными детьми.

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

Запись Что означает
.actions Селектор: элементы с class="actions"
display: flex Включить Flexbox у выбранного элемента
flex-direction: row Располагать детей в строку
flex-direction: column Располагать детей в столбец
flex-wrap: wrap Разрешить перенос на следующую строку
gap: 12px Оставить промежуток между элементами

В этой статье используем обычное направление текста слева направо и порядок элементов из HTML. Для строки можно разрешить перенос через wrap или запретить через nowrap. nowrap — значение по умолчанию. В реальном браузере карточки могут сжиматься. В бумажных схемах ниже отдельно задано, что их размер сохраняется: здесь изучаем только порядок и перенос.

На рисунках четыре карточки с номерами 1–4. Их размер сохраняется: сжатия и роста нет. Места по ширине хватает на три карточки с промежутками, но не на четыре; по высоте места достаточно. Пунктир показывает границу контейнера.

Строка без переноса

flex-direction: row; flex-wrap: nowrap — карточки остаются в одной строке. В нашей модели четвёртая выходит за правую границу.

Четыре карточки в строке без переноса: четвёртая выходит за границу контейнера

Столбец

flex-direction: column; flex-wrap: nowrap — те же карточки располагаются сверху вниз.

Четыре карточки в одном столбце внутри контейнера

Строка с переносом

flex-direction: row; flex-wrap: wrap — если следующей карточке не хватает места, она переходит на новую строку. Порядок сохраняется: 1, 2, 3, 4.

Три карточки в первой строке, четвёртая перенесена на следующую


Разобранный пример: две кнопки

Нужно расположить две кнопки рядом. Места для обеих хватает.

<nav class="actions">
  <button>Сохранить</button>
  <button>Отмена</button>
</nav>

Ищем общего родителя кнопок: это nav с классом actions. Значит, правило назначаем .actions.

Общий контейнер nav.actions управляет двумя непосредственными детьми button

.actions {
  display: flex;
  flex-direction: row;
  gap: 12px;
}
Что определяем Ответ для примера
Селектор контейнера .actions
Непосредственные дети Два элемента button
Расположение Две кнопки рядом, как на рисунке

Если внутри кнопки появится span, он будет ребёнком кнопки, а не непосредственным ребёнком nav. Внешний контейнер продолжит располагать две целые кнопки.


Viewport: страница на телефоне

Viewport — область просмотра страницы в браузере. Чтобы мобильный браузер использовал ширину устройства для вёрстки и исходный масштаб 1, в каждой странице внутри head записывают одну строку:

<meta name="viewport" content="width=device-width, initial-scale=1">
Фрагмент Назначение
width=device-width Использовать ширину устройства для вёрстки в CSS-пикселях
initial-scale=1 Задать исходный масштаб 1

Строка не запрещает человеку увеличивать страницу. Она сама не перестраивает карточки: их расположением управляет CSS.


Самостоятельная работа на бумаге

Подпишите фамилию и номер своего варианта. Выполните три задания. Перенесите на лист таблицы ответов, сохранив номера строк; заполняйте только места с многоточиями. HTML, объяснения и условия целиком переписывать не нужно. Задания одинаковы для всех вариантов.

Задание 1. Найдите контейнер

Нужно расположить рядом две целые карточки А и Б.

<main>
  <h1>Каталог</h1>
  <div class="products">
    <article class="item"><h2>А</h2></article>
    <article class="item"><h2>Б</h2></article>
  </div>
</main>
№ Что записать Ваш ответ
1.1 Один селектор класса общего родителя двух карточек …
1.2 Одно CSS-свойство со значением, включающее Flexbox у этого родителя …
1.3 Название тега непосредственных детей этого родителя и их количество Тег: …; количество: …

Задание 2. Покажите расположение

Есть три карточки А, Б, В, именно в таком порядке в HTML. Контейнер уже имеет display: flex. Каждая строка таблицы — отдельный случай.

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

В каждой строке ответа нарисуйте расположение, обозначая карточки как [А], [Б], [В]. Переход на новую строку показывайте новой строкой рисунка. Если карточка выходит за правую границу контейнера, подпишите её букву в последней колонке; если выхода нет, напишите «нет». Считать размеры не нужно.

№ Свойства контейнера Ваш рисунок За правой границей: буква или «нет»
2.1 flex-direction: row; flex-wrap: nowrap … …
2.2 flex-direction: column; flex-wrap: nowrap … …
2.3 flex-direction: row; flex-wrap: wrap … …

Задание 3. Добавьте viewport

В HTML-странице пока нет настройки viewport. Заполните две строки. В строке 3.1 запишите один полный тег с width=device-width и initial-scale=1, как в объяснении. Другие параметры добавлять не нужно. В строке 3.2 укажите пару тегов, между которыми его размещают.

№ Что записать Ваш ответ
3.1 Полная строка настройки viewport …
3.2 Открывающий и закрывающий теги раздела страницы … и …

Перед сдачей проверьте: лист подписан, заполнены строки 1.1–1.3, нарисованы три схемы 2.1–2.3 и заполнены строки 3.1–3.2. Сдайте лист преподавателю. Запускать код на этой паре не требуется.