HTML + CSS — готовые макеты
Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.
Текущая статья посвящена макетам на HTML и CSS — Flexbox, Grid, адаптив, типовые блоки страницы.
Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:
- Основы
- Система и сеть
- Данные и разметка
- Код и разработка
- Языки
- Искусственный интеллект
- Проект
- Инфраструктура и безопасность
- Спин-офф
Обязательно пройдитесь.
А теперь приступим к нашему предмету.
Основы вёрстки
Подробно про Flexbox и Grid — отдельная глава.
Шпаргалка «что использовать / чего избегать» — Практические рекомендации по CSS.
Вставьте любой пример из статьи в редактор выше — предпросмотр обновится через пару секунд. Так быстрее, чем каждый раз сохранять файл на диск. Для отдельных вкладок HTML, CSS и JavaScript — полноценный WebEditor.
Мини-симулятор показывает, как Flex и Grid по-разному раскладывают четыре блока. Перед сложными макетами полезно покрутить justify-content и align-items.
Базовые термины
| Термин | Простыми словами |
|---|---|
| HTML | Разметка: заголовки, абзацы, кнопки, формы — «скелет» страницы |
| CSS | Стили: цвета, отступы, сетка, расположение блоков |
| Макет (layout) | Как блоки стоят относительно друг друга и экрана |
| Flexbox | Раскладка в одну линию (ряд или столбец) с выравниванием |
| CSS Grid | Раскладка в таблицу из строк и колонок сразу |
| Адаптив | Страница подстраивается под ширину телефона и монитора |
Медиазапрос @media |
Другие стили, когда экран уже или шире порога |
rem |
Единица от размера шрифта корня; удобна для отступов |
viewport |
Видимая область браузера; без meta-тега на телефоне страница «мелкая» |
Порядок действий
- Скопируйте весь блок кода (от
<!DOCTYPE html>до</html>). - Вставьте в файл
макет.html(илиindex.html). - Откройте двойным щелчком или перетащите в Chrome / Edge / Firefox.
- Меняйте текст, цвета, числа в
padding— смотрите, что изменилось. - Если сломали — верните исходник из статьи и меняйте по одному свойству.
Grid — каркас страницы (шапка, сайдбар, контент), сетка карточек одинаковой ширины, bento-блоки разного размера.
В реальных сайтах их комбинируют: Grid для страницы, Flex внутри карточки.
Обязательный каркас каждой страницы
Любой пример ниже можно собрать на этом фундаменте.
Разбор по строкам.
| Фрагмент | Смысл |
|---|---|
<!DOCTYPE html> |
Сообщает браузеру режим HTML5 (страница рисуется предсказуемо) |
lang="ru" |
Язык страницы: озвучка скринридеров, переносы слов |
<meta charset="UTF-8"> |
Кириллица и emoji отображаются правильно |
viewport + width=device-width |
На телефоне ширина макета = ширина экрана, без «уменьшенного десктопа» |
<style>…</style> |
CSS в том же файле; для учёбы удобно, в проекте стили часто в .css |
box-sizing: border-box |
padding и border входят в заявленную ширину блока — сетка не «плывёт» |
body { margin: 0 } |
Убирает белую полоску по умолчанию у краёв окна |
img { max-width: 100% } |
Картинка не вылезает за экран на узком телефоне |
Типичные ошибки.
- Забыли
viewport— на мобильном всё мелкое, нужен зум пальцами. - Стили в
<body>через атрибутstyle=""на каждом теге — править макет трудно. - Нет
box-sizing: border-box— блоки сwidth: 50%в два столбца не помещаются в ряд.
Вынести CSS в файл (как в «взрослых» проектах):
<link rel="stylesheet" href="style.css">
Файл style.css лежит в той же папке, что и HTML.
Стартовые макеты
Простые задачи, которые чаще всего ищут в интернете.
Центрированная карточка
Задача. Окно входа, сообщение «скоро откроемся», одна карточка по центру экрана.
Разбор CSS.
| Свойство | Зачем здесь |
|---|---|
min-height: 100dvh |
Высота не меньше окна; dvh учитывает панель адреса на телефоне |
display: grid на body |
Включает сетку из одной «ячейки» на весь экран |
place-items: center |
Сокращение: центр по горизонтали и вертикали сразу |
padding: 1rem на body |
На узком экране карточка не прилипает к краям |
width: min(100%, 22rem) |
На телефоне — вся ширина минус отступы; на ПК — не шире ~352px |
border-radius, box-shadow |
Скругление и лёгкая тень — визуально «карточка», а не просто белый прямоугольник |
button { width: 100% } |
Кнопка на всю ширину карточки — привычный паттерн для форм |
HTML. Тег <article> семантически означает самостоятельный блок контента (для курсовой и доступности лучше, чем голый <div>).
Типичные ошибки.
- Центрируют через
position: absolute; top: 50%; left: 50%без знанияtransform— на разной высоте контента блок съезжает. - Задают
height: 100vhна мобильном — под карточкой появляется лишняя прокрутка из‑за адресной строки.
Попробуйте сами. Поменяйте place-items: center на start — карточка прижмётся к верху. Уберите box-shadow — плоский плоский дизайн.
Шапка и подвал — контент между ними (Flexbox)
Задача. Подвал всегда внизу окна, даже если текста в main мало («липкий footer»).
Разбор.
| Блок | Идея |
|---|---|
body + flex + column |
Три зоны друг под другом: шапка, середина, подвал |
main { flex: 1 } |
Средняя часть забирает всё свободное место, выталкивая footer вниз |
max-width + margin: 0 auto на main |
Текст не растягивается на весь 4K-монитор — удобно читать |
nav { display: flex; gap: 1rem } |
Ссылки в ряд с равномерным зазором без отступов на каждой ссылке |
flex-wrap: wrap |
На узком экране пункты меню переносятся на следующую строку |
Типичные ошибки.
- Пытаются прижать подвал через
position: fixed— он перекрывает текст при прокрутке. - Нет
min-height: 100dvhнаbody— при длинном контенте разницы нет, при коротком подвал «всплывает» вверх.
Попробуйте сами. Добавьте в main десять абзацев — подвал уйдёт за нижний край и появится прокрутка (это нормально).
Адаптивная сетка карточек
Задача. Каталог товаров, галерея проектов, карточки новостей — сами перестраиваются в 1–2–3–4 колонки.
Разбор ключевой строки.
grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
minmax(14rem, 1fr)— колонка не уже 14rem, но может растянуться (1fr).auto-fit— браузер сам считает, сколько колонок влезает в ряд.gap: 1rem— расстояние между карточками безmarginна каждой.
Типичные ошибки.
- Фиксируют
grid-template-columns: repeat(4, 1fr)— на телефоне четыре узких полоски. - Делают отступы только через
margin-right— у последней карточки в ряду отступ лишний;gapпроще.
Попробуйте сами. Замените 14rem на 10rem — колонок станет больше. Добавьте пятую карточку в HTML — сетка пересчитается сама.
Две колонки — текст и картинка
Задача. Блок «о нас», лендинг, статья с иллюстрацией: на телефоне столбик, на планшете — две колонки.
Разбор.
| Элемент | Смысл |
|---|---|
| Без медиазапроса | Одна колонка — mobile-first (сначала стили для телефона) |
@media (min-width: 40rem) |
От ~640px включаются две равные колонки 1fr 1fr |
align-items: center |
Текст и «картинка» по вертикали по центру друг относительно друга |
aspect-ratio: 4 / 3 |
Прямоугольник держит пропорции, пока нет настоящего <img> |
aria-hidden="true" на декоративном блоке |
Скринридер не озвучивает пустой градиент |
Типичные ошибки.
- Пишут
max-widthв медиазапросе для «десктопа» в новом проекте — путаница; для учёбы прощеmin-widthот мобильной базы. - Ставят две колонки без медиазапроса — на телефоне текст и картинка слишком узкие.
Форма входа по центру
Задача. Страница логина, регистрации, восстановления пароля.
Разбор.
| Приём | Зачем |
|---|---|
flex + align-items + justify-content на body |
Центрирование формы (альтернатива grid + place-items) |
flex-direction: column + gap на form |
Поля друг под другом с одинаковыми промежутками |
input внутри label |
Клик по тексту «Email» фокусирует поле — удобнее на телефоне |
type="email", required, minlength |
Базовая проверка в браузере без JavaScript |
width: 100% у input |
Поле на всю ширину формы при box-sizing: border-box |
Типичные ошибки.
- Забывают
type="submit"у кнопки — Enter в поле может не отправить форму. - Нет
nameу полей — если позже подключите сервер (PHP и т.д.), данные не придут.
Попробуйте сами. Уберите required и отправьте пустую форму — браузер покажет подсказки (если не отключена валидация).
Готовые макеты страниц
Составные шаблоны для сайта, лендинга и панели администратора.
1. Каркас сайта на CSS Grid
1.1. Шапка, боковое меню, контент, подвал
Задача. Типичный учебный «сайт-визитка» или админка с меню слева.
Разбор grid-template-areas.
"header header" ← шапка на всю ширину (2 колонки)
"nav main" ← слева меню 12rem, справа контент
"footer footer" ← подвал на всю ширину
Каждый дочерний блок с grid-area: header (и т.д.) попадает в «клетку» схемы. Менять макет можно, переставив буквы в кавычках — без перестановки HTML.
На мобильном (max-width: 48rem) |
Что происходит |
|---|---|
| Одна колонка | Области идут столбиком: шапка → меню → текст → подвал |
nav { display: flex } |
Пункты меню в ряд, а не столбиком слева |
Типичные ошибки.
- Опечатка в имени области (
"heder"вместо"header") — блок исчезает из сетки. - Разное количество столбцов в строках areas — правило CSS не применится.
2. Лендинг и навигация
2.1. Герой-блок и три преимущества
Задача. Одностраничный промо-сайт: меню, большой заголовок, кнопка, карточки ниже.
Разбор.
| Приём | Смысл |
|---|---|
.wrap |
Ограничитель ширины контента по центру (max-width + margin: 0 auto) |
justify-content: space-between в шапке |
Логотип слева, ссылки справа |
clamp(1.75rem, 4vw, 2.75rem) |
Шрифт заголовка от 28px до 44px в зависимости от окна |
border-radius: 999px на .cta |
«Таблетка» — типичная форма кнопки призыва |
Повтор auto-fit + minmax в .features |
Та же адаптивная сетка, что у каталога карточек |
2.2. Липкая шапка при прокрутке
Задача. Меню остаётся сверху, пока читаете длинную статью.
Разбор.
| Свойство | Смысл |
|---|---|
position: sticky |
Элемент ведёт себя как обычный, пока не «прилипнет» к top: 0 при скролле |
z-index: 10 |
Шапка рисуется поверх текста, а не под ним |
rgba(255,255,255,0.92) |
Полупрозрачный фон — лёгкий эффект стекла |
backdrop-filter: blur(8px) |
Размытие контента под шапкой (в старых браузерах просто непрозрачный фон) |
Отличие от fixed. fixed вырывает шапку из потока — нужен padding-top у main. sticky проще для учебных статей.
3. Дашборд и bento-сетка
3.1. Боковая панель + плитки метрик
Задача. Макет «админки»: меню слева, сверху заголовок раздела, ниже виджеты.
Разбор.
- Grid на
body— две большие зоны: сайдбар и рабочая область. - Flex на
.workspace— внутри правой части бар сверху, плитки заполняют остаток (flex: 1у.tiles). min-width: 0— flex-ребёнок может сжиматься; без этого иногда появляется горизонтальная прокрутка.- Вложенный Grid в
.tiles— сноваauto-fitдля карточек метрик.
3.2. Bento — плитки разного размера
Задача. Современная сетка «как у Apple / Notion»: одни ячейки шире или выше других.
Разбор.
| Класс | Эффект |
|---|---|
grid-auto-rows: 5rem |
Высота одной «ступеньки» сетки — 80px |
grid-column: span 2 |
Блок занимает 2 колонки |
grid-row: span 2 |
Блок занимает 2 ряда |
.big |
И ширина, и высота удвоены — крупная плитка |
4. Статья и тарифы
4.1. Текст и боковая колонка
Задача. Блог, документация: основной текст + метаданные справа.
Разбор.
| Приём | Смысл |
|---|---|
65ch |
Ширина текста в символах — глаза меньше устают, чем на всю ширину монитора |
minmax(0, 1fr) |
Колонка с текстом может сжиматься; длинные слова не ломают сетку |
Порядок в HTML: article, потом aside |
На мобильном сначала главное, метаданные ниже — хорошо для чтения и SEO |
border-top у aside |
Визуально отделяет боковую колонку без лишней рамки вокруг всего |
4.2. Три тарифа в ряд
Задача. Страница цен: карточки «Базовый / Про / Команда», средний выделен.
Разбор.
| CSS | Зачем |
|---|---|
flex-direction: column на .plan |
Элементы карточки в столбик |
flex: 1 на ul |
Список растягивается, кнопки на одной линии внизу у всех тарифов |
.featured |
Выделение среднего тарифа — типичный приём на лендингах |
transform: scale(1.02) |
Чуть крупнее соседей; на очень узком экране можно убрать, если мешает |
5. Подвал с колонками ссылок
Задача. Внизу сайта группы ссылок (продукт, компания, правовое) и строка копирайта.
Разбор. main { flex: 1 } прижимает footer к низу окна. Внутри подвала снова auto-fit — колонки сами перестраиваются. Ссылки display: block — удобная зона нажатия на телефоне.
Типичная ошибка. Забыли flex: 1 у main — на короткой странице подвал оказывается посередине, а не внизу.
6. Адаптив и тёмная тема
6.1. Mobile-first — меню сверху, на ПК слева
Разбор. Сначала стили для узкого экрана, в @media (min-width: 48rem) — расширение. Так проще сопровождать, чем верстать только «десктоп» и ужимать через max-width. 48rem ≈ 768px при стандартном размере шрифта.
6.2. Светлая и тёмная тема через переменные
Разбор. Переменные --имя объявляют в :root (доступны везде). var(--bg) подставляет значение. Браузер сам выбирает тёмный блок, если в ОС включена тёмная тема.
Попробуйте сами. DevTools (F12) → «Rendering» → prefers-color-scheme — переключите light/dark.
7. Чистая база для своего проекта
| Строка | Зачем |
|---|---|
-webkit-text-size-adjust: 100% |
iOS не раздувает мелкий шрифт в landscape |
font: inherit на полях ввода |
Кнопки и input совпадают с шрифтом страницы |
min(100% - 2rem, 64rem) |
Контейнер с отступами от краёв, но не шире 1024px |
margin-inline: auto |
Центрирование (логичное свойство «слева–справа») |
Частые вопросы
Как центрировать div по центру страницы?
Самый короткий способ — body { display: grid; min-height: 100dvh; place-items: center; } или flex с align-items и justify-content (см. карточку и форму выше).
Почему два блока по 50% не влезают в ряд?
Часто из‑за box-sizing: content-box и padding. Добавьте глобально box-sizing: border-box или используйте gap во Grid/Flex вместо width: 50% + margin.
Flexbox или Grid для всего сайта?
Grid для «каркаса» (шапка, колонки, подвал), Flex для строк меню, кнопок в форме, выравнивания внутри карточки.
Нужен ли Bootstrap?
Для обучения и малых работ хватит чистого CSS из этой статьи. Фреймворки ускоряют большие проекты, но скрывают основы.
Как посмотреть макет на телефоне?
Откройте DevTools (F12) → режим устройства, или залейте файл на хостинг / откройте через «Поделиться» в локальной сети.
Что изучить дальше
| Тема | Куда перейти |
|---|---|
| Теги, формы, ссылки | HTML |
| Flex и Grid подробно | Flexbox и CSS Grid |
Медиазапросы, clamp, viewport |
Адаптивность |
| Мини-шаблоны git, README | Шаблоны |
| Рисование в Python (другой формат «примеров») | Рисование в браузере (JavaScript) |
| Окна, формы, кнопки на Python | Tkinter — окна и виджеты |
| Интерактив в браузере | JavaScript — о разделе |
В описании работы укажите, какой приём использовали: «адаптивная сетка на CSS Grid с auto-fit», «липкий header на position: sticky». Одно точное название свойства показывает, что вы понимаете код, а не только скопировали шаблон.