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

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

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

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

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


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

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

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


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

ТемаИспользоватьИзбегатьОсторожноПодробнее
Модель коробки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 для всего макетаОсновные стили
Порядок блоковПорядок в HTML; order только для визуалаorder, меняющий смысловой порядок для скринридеровflex-direction: column-reverse без проверки a11yFlex и Grid
Фиксированные панелиposition: sticky для шапки при прокруткеМного position: fixed слоёвfixed без учёта safe-area на iPhoneОсновные стили, Справочник
Компонент в контейнере@container для карточек в sidebarТолько @media по ширине окна для внутренних блоков@container без container-typeАдаптивность, Логические свойства
RTL и многоязычностьmargin-inline, padding-inline, inset-inlineТолько left / right в интерфейсах с RTLСмешение физических и логических свойств в одном блокеЛогические свойства

Размеры, 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Адаптивность
Высота экрана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 для перебивки цветовПеременные, Подключение
Тёмная тема@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-паттерныТиповые элементы интерфейса
Итоги разделаИтоги

В подборках

Статья входит в тематические маршруты из меню Подборки и блока «С чего начать?» на главной. Соседние шаги того же маршрута:

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


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).