Перейти к основному содержимому

Практические рекомендации по CSS

Разработчику Аналитику Тестировщику Архитектору Инженеру

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

Подробные объяснения — в тематических главах раздела; в конце таблиц указаны ссылки.


Как читать таблицы

КолонкаСмысл
ИспользоватьРекомендуемая база или современная замена устаревшему
ИзбегатьЧастый источник багов, лишней сложности или плохого UX
ОсторожноДопустимо точечно; на мобильных или в проде — с проверкой

Контекст важнее абсолютных запретов: таблица задаёт направление, а не заменяет макет и тесты на целевых устройствах.


Частые паттерны вёрстки

Ниже — пять заготовок, которые повторяются от лендинга до личного кабинета. Теория по осям Flex и трекам Grid — в Flexbox и CSS Grid. Полные страницы с комментариями к каждой строке — HTML + CSS, готовые макеты.

Центрирование по горизонтали и вертикали

Flexbox выстраивает дочерние элементы вдоль главной оси (flex-direction) и поперечной. Свойства justify-content и align-items выравнивают содержимое по центру контейнера.

.center {
display: flex;
justify-content: center; /* по главной оси */
align-items: center; /* по поперечной */
min-height: 100dvh;
}

Интерактивный разбор блочной модели — на странице о разделе CSS. Готовый макет с комментариями — лаборатория 110.

Подвал внизу короткой страницы

Если контента мало, footer «висит» посередине экрана. Решение — колонка Flex на body, а main растягивается и занимает свободное место.

body {
display: flex;
flex-direction: column;
min-height: 100dvh;
}

main {
flex: 1; /* flex-grow: 1 — main тянется и отталкивает footer к низу */
}

Семантическая разметка header / main / footerHTML-страницы целиком.

Каркас страницы на CSS Grid

grid-template-areas задаёт именованные зоны. Каждому блоку в CSS пишут grid-area с тем же именем, что в сетке.

.page {
display: grid;
grid-template-areas:
"header header"
"nav content"
"footer footer";
grid-template-columns: 200px 1fr;
grid-template-rows: auto 1fr auto;
min-height: 100dvh;
}

.page__header { grid-area: header; }
.page__nav { grid-area: nav; }
.page__main { grid-area: content; }
.page__footer { grid-area: footer; }

На узком экране зоны перестраивают в одну колонку через @mediaадаптивный дизайн. Имена классов здесь в духе BEM — §111.

Адаптивная сетка карточек

repeat(auto-fill, minmax(...)) сам подбирает число колонок по ширине родителя:

  • auto-fill — создать столько колонок, сколько влезает;
  • minmax(min(100%, 16rem), 1fr) — колонка не уже 16rem и не шире контейнера;
  • 1fr — равномерно делит оставшееся место.
.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(min(100%, 16rem), 1fr));
gap: 1.25rem;
}

Готовая галерея с разбором — макеты, лаборатория 110. Функция minmax()Функции в CSS.

Равная ширина колонок во Flex

flex: 1 на дочерних элементах делит строку поровну. min-width: 0 снимает ограничение по умолчанию (min-width: auto), и длинный текст не раздувает колонку.

.row {
display: flex;
gap: 1rem;
}

.row__col {
flex: 1;
min-width: 0;
}

gap задаёт расстояние между элементами без отрицательных margin — см. таблицу «Макет» выше и §2.


Основа документа и сброс

ТемаИспользоватьИзбегатьОсторожноПодробнее
Модель коробкиbox-sizing: border-box на *, *::before, *::aftercontent-box для всех блоков подрядСмешение моделей в одном компоненте без документацииБлочная модель
Viewport (HTML)<meta name="viewport" content="width=device-width, initial-scale=1">Страница без viewport на мобильныхuser-scalable=no без веской причины (доступность)Адаптивность
Единицы ширины%, rem, em, max-width, min(), clamp()Жёсткая ширина контента только в pxvw / vh для полной высоты/ширины блоковОсновные стили, Адаптивность
Изображенияmax-width: 100%; height: autoКартинки без ограничения шириныobject-fit без запасного соотношенияАдаптивность
Глобальный сбросНебольшой reset или normalize + свои токеныТяжёлый reset, ломающий формы и спискиУниверсальный селектор * с десятками правилПодключение CSS

Макет и компоновка

ТемаИспользоватьИзбегатьОсторожноПодробнее
Сетка страницыFlexbox (одна ось), Grid (две оси)float для колонок и карточекТаблицы (display: table) для вёрсткиFlex и Grid
Отступы между элементамиgap во Flex/GridОтрицательные margin как "костыль" сеткиmargin на последнем ребёнке вместо gapFlex и Grid
Центрированиеdisplay: flex + justify-content / align-items, Grid place-itemsАбсолютное позиционирование "на глаз"position: absolute для всего макетаОсновные стили — position
Порядок блоковПорядок в HTML; order только для визуалаorder, меняющий смысловой порядок для скринридеровflex-direction: column-reverse без проверки a11yFlex и Grid
Фиксированные панелиposition: sticky для шапки при прокруткеМного position: fixed слоёвfixed без учёта safe-area на iPhoneposition — sticky и fixed, Справочник
Компонент в контейнере@container для карточек в sidebarТолько @media по ширине окна для внутренних блоков@container без container-typeАдаптивность, Логические свойства
RTL и многоязычностьmargin-inline, padding-inline, inset-inlineТолько left / right в интерфейсах с RTLСмешение физических и логических свойств в одном блокеЛогические свойства
Учебный проект "с нуля"Копировать готовый .html из лаборатории, менять по одному свойствуСразу Bootstrap/Tailwind без понимания Flex/GridСмешивать фреймворк и учебный чистый CSS в одной работеСначала HTML-страницы целиком, затем HTML + CSS — готовые макеты; после Flex/Grid — Tailwind — готовые блоки

Размеры, viewport и адаптивность

ТемаИспользоватьИзбегатьОсторожноПодробнее
Подход к медиазапросамMobile-first: база для узкого экрана, @media (min-width: …)Desktop-first с каскадом max-width в новых проектахmax-width в запросах при уже выбранном mobile-firstАдаптивность, Подключение
Ширина контейнераwidth: 100% + max-width + margin: 0 autowidth: 100vw (скролл из‑за полос прокрутки)"Full-bleed" через 100vw без overflow-x: hiddenАдаптивность
Ширина по содержимомуwidth: fit-content + max-width + margin-inline: auto для компактных блоковdisplay: inline-block ради "сжатия", когда нужен блочный элементfit-content без лимита ширины на мобильныхОсновные стили, Справочник
Высота экранаmin-height: 100dvh, Flex/Grid stretchheight: 100vh на мобильных (адресная строка)100svh / 100lvh без понимания разницы единицАдаптивность, Справочник
Текстовые колонкиmax-width: 65ch75ch, line-height: 1.51.7Строки на всю ширину 4K-монитораch в компонентах с нестандартным шрифтомАдаптивность
Типографика по экрануclamp(1rem, 2.5vw, 1.25rem) для заголовковОтдельный CSS-файл на каждый брейкпоинт для каждого font-sizeСлишком мелкий текст из‑за clamp на 320pxАдаптивность
Вырез и "чёлка"padding: env(safe-area-inset-*) у fixed/stickyКонтент под системными панелямиconstant() без fallback для старых iOSСправочник

Цвет, тема и контраст

ТемаИспользоватьИзбегатьОсторожноПодробнее
ПалитраCSS-переменные (--color-text, --space-md)Десятки "магических" hex в селекторах!important для перебивки цветовПеременные, Подключение
Оттенки и hover`color-mix(in oklch, var(--brand) N%, whiteblack)`Отдельный hex на каждый шаг палитры в SassСмешение в srgb, если нужна перцептивная равномерность
Тёмная тема@media (prefers-color-scheme: dark) + переменныеТолько ручной переключатель без учёта ОСЖёсткие цвета при forced-colors: activeДоступность
Контраст текстаСоотношение ≥ 4.5:1 для основного текста (WCAG)Светло-серый текст на белом (opacity: 0.5)Декоративный текст без требования чтенияДоступность
Прозрачностьrgba() / color-mix() осознанноЕдинственный способ "осветлить" — opacity на родителеПолупрозрачные слои поверх busy-фонаОсновные стили

Интерактивность, фокус и сенсор

ТемаИспользоватьИзбегатьОсторожноПодробнее
Фокус:focus-visible + видимый outline или box-shadowoutline: none без заменыСтили :focus как у :hover на каждом кликеПсевдоклассы, Доступность
Наведение:hover для десктопа; дублировать важное состояние иначеТолько :hover для критичной информацииСложные анимации на :hover на touch-экранахПсевдоклассы
Зоны нажатияmin-height / min-width ≥ 44–48px, padding у ссылок и кнопокКликабельная область размером с иконку 16px@media (pointer: coarse) для увеличения целейАдаптивность, Доступность
Жестыtouch-action: manipulation на кнопках/слайдерахtouch-action: none на всей страницеОтключение pull-to-refresh без альтернативыСправочник
Прокрутка в модалкахoverscroll-behavior: containЦепочка скролла "на фон" под оверлеемВложенные scroll без фиксированной высиныСправочник
Скрытый текстКласс .sr-only (визуально скрыт, в DOM есть)display: none для подписей, нужных скринридеруvisibility: hidden для интерактиваДоступность

Анимации и производительность

ТемаИспользоватьИзбегатьОсторожноПодробнее
Плавные эффектыtransition на opacity, transform, colorАнимация width, height, top, left, marginwill-change на многих элементах сразуАнимации, лаборатория, Справочник
Движение@keyframes + transformПараллакс и автопрокрутка без паузыБесконечные тяжёлые анимации фонаАнимации, лаборатория
Настройки пользователя@media (prefers-reduced-motion: reduce)Игнорирование "уменьшить движение"Отключение всех transition глобальноДоступность
Размытие и фильтрыЛёгкие тени, редкий filterbackdrop-filter на больших областяхfilter / backdrop-filter на слабых мобильныхСправочник
Длинные спискиcontent-visibility: autoТысячи DOM-узлов без виртуализацииcontain без замера в DevToolsСправочник
Селектор :has()Узкий контекст (.card:has(.badge))body:has(...) на больших страницахСложные цепочки в критичном пути рендераСелекторы :has

Организация CSS и каскад

ТемаИспользоватьИзбегатьОсторожноПодробнее
ИменованиеBEM или согласованная методология в командеГлубокая вложенность селекторов (.header .nav ul li a)ID в стилях компонентовПодключение
СпецифичностьКлассы; :where() для сброса веса!important в основной кодовой базе!important в утилитах дизайн-системыПодключение, Каскад
Слои@layer base, components, utilitiesХаотичный порядок файлов без правилСлишком много слоёв без схемыКаскадные слои
ПодключениеВнешний файл + критичный CSS при необходимостиСотни <link> без сборкиInline-стили на каждом элементеПодключение
ДублированиеПеременные, миксины (препроцессор) или @layerКопипаст одних и тех же блоковПрепроцессор там, где хватит нативных переменныхПеременные

Устаревшее и замены

Было (устарело)Современная заменаКомментарий
Вёрстка колонок на floatFlexbox / Gridfloat — для обтекания текстом вокруг картинки
Фиксированные брейкпоинты только в pxrem / em в запросах, container queriesСогласованность с масштабом шрифта
@import в середине файла<link> или сборщик (Vite, webpack)@import блокирует параллельную загрузку
Префиксы вручную (-webkit-)Autoprefixer по browserslistСинтаксис
!important для перебития фреймворкаПовысить специфичность, @layer, локальный scopeВременный костыль — пометить в коде
Desktop-first (max-width каскадом)Mobile-first (min-width)В легаси — рефакторить постепенно

Быстрый чек перед публикацией

ПроверкаДействие
ViewportМетатег в <head>
Горизонтальный скроллDevTools → 320px; нет 100vw и "вылезших" margin
КасанияКнопки и ссылки ≥ 44px по высоте/ширине зоны
ФокусTab-навигация: видно, куда попал фокус
ДвижениеЕсть ветка prefers-reduced-motion
КонтрастОсновной текст читаем на фоне
Реальное устройствоХотя бы один проход на телефоне, не только эмулятор
ПроизводительностьТяжёлые эффекты выключены или упрощены на мобильных

Расширенный чек-лист вопросов — в самопроверке.


Куда углубиться

ТемаГлава
Пошаговая адаптивностьАдаптивный и отзывчивый дизайн
Доступность и prefers-*Доступность и пользовательские настройки
Все свойства по алфавитуСправочник по CSS
Частые паттерны вёрстки§ выше
Типовые UI-паттерныТиповые элементы интерфейса
Каталог UI (Uiverse / Galaxy, MIT)UI-паттерны из Uiverse
Готовые страницы с разборомHTML-страницы целиком, HTML + CSS — готовые макеты, Tailwind — готовые блоки
Готовые анимации с разборомCSS-анимации — готовые эффекты
Итоги разделаИтоги


В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Веб-разработкаHTML — о разделе, JavaScript — о разделе, CSS — о разделе, Адаптивный и отзывчивый дизайн, Доступность и пользовательские настройки в CSS.