CSS (Cascading Style Sheets)
CSS (Cascading Style Sheets)
CSS — это язык описания внешнего вида документа, написанного на HTML или XML. Он отделяет «что» (структура) от «как» (оформление): шрифты, цвета, отступы, расположение блоков, анимации.
История
Идея отделить оформление от содержания витала в воздухе с самого появления веба. Изначально, в 1991 году, HTML Тима Бернерса-Ли был чисто структурным: заголовок, абзац, ссылка, список — и всё, без указания шрифтов и цветов. Браузер сам решал, как это нарисовать.
Уже к 1993 году стало понятно: дизайнерам этого недостаточно. Появился Mosaic, чуть позже Netscape, начался браузерный бум, и вместе с ним — гонка собственных HTML-тегов: <font>, <center>, <bgcolor>. Каждый браузер тянул HTML в свою сторону, страницы превращались в кашу из вёрстки и стилей.
В октябре 1994 года норвежец Хокон Виум Ли (Håkon Wium Lie), работавший тогда в CERN под началом того же Бернерса-Ли, опубликовал предложение под названием Cascading HTML Style Sheets. Слово «cascading» (каскадный) было ключевым: Хокон предложил систему, где несколько источников стилей (от автора страницы, от пользователя, от браузера) могли мирно сосуществовать и накладываться друг на друга по понятным правилам приоритета. Это был концептуальный прорыв — раньше стили из разных мест просто конфликтовали.
В декабре 1996 года консорциум W3C выпустил рекомендацию CSS Level 1 — первый официальный стандарт. Хокон и швед Берт Бос (Bert Bos) стали соавторами. CSS1 умел немного: шрифты, цвета, отступы, выравнивание, фон.
Дальше — десятилетия мучительного развития:
- CSS 2 (1998) — добавил абсолютное позиционирование, z-index, медиатипы (печать vs экран), таблицы. Браузеры реализовывали его лет десять, и нестандартно.
- CSS 2.1 (2011) — формальное приведение реальности в соответствие с тем, что браузеры умели на самом деле. Тут начался относительный мир.
- CSS 3 (с 2012 и далее) — больше не один документ, а набор отдельных модулей: Selectors, Flexbox, Grid, Animations, Transitions, Transforms, Media Queries, Custom Properties. Каждый модуль развивается отдельно, имеет свой уровень зрелости. С этого момента термин «CSS3» условен — на практике это «современный CSS».
- CSS 4 как версии не существует — по решению W3C, нумерация остаётся на уровне модулей: Selectors Level 4, Grid Level 2 и так далее.
С 2017 года CSS получил по-настоящему мощные инструменты: Grid Layout (раскладка сеткой), Custom Properties (переменные), clamp(), calc(), контейнерные запросы. Сегодня на чистом CSS делают то, для чего двадцать лет назад требовался JavaScript и три библиотеки.
Хокон Виум Ли, кстати, потом много лет работал главным техническим директором Opera Software. Берт Бос до сих пор активен в W3C.
Что это такое
CSS — это декларативный язык. Ты не пишешь алгоритм «как нарисовать кнопку», ты описываешь желаемый результат: «у всех кнопок класса .primary фон должен быть синим, текст — белым, отступы — 12 пикселей сверху и снизу, 24 слева и справа». Браузер сам разбирается, как это реализовать.
Структура у CSS-правила минимальная: селектор, который указывает, к каким элементам применить стиль, и блок объявлений — список свойств и их значений, разделённых точкой с запятой:
.primary {
background: #1a73e8;
color: white;
padding: 12px 24px;
}
В этом примере .primary — селектор (все элементы с CSS-классом primary), а внутри фигурных скобок — три свойства.
Главная сила CSS — в трёх механизмах:
Каскад (cascade) — система приоритетов, когда к одному элементу применяются несколько правил. Правила собираются из разных источников (браузерные дефолты, авторские стили, пользовательские настройки), сортируются по специфичности и порядку, и побеждает «самое сильное» объявление для каждого свойства.
Наследование (inheritance) — некоторые свойства (шрифт, цвет, высота строки) автоматически передаются от родителя к потомкам. Объявил font-family на <body> — и она применилась ко всему, кроме элементов, у которых явно задано своё значение.
Бокс-модель (box model) — каждый HTML-элемент представляется прямоугольником из четырёх слоёв: content (содержимое), padding (внутренние отступы), border (рамка), margin (внешние отступы). Это базовая ментальная модель: всё на странице — это прямоугольники, вложенные в прямоугольники.
CSS отличается от других похожих штук:
- CSS vs inline-стили (
<div style="color: red">). Inline — это тот же CSS, но прибитый гвоздями к элементу. Не переиспользуется, перебивает почти всё остальное, ломает идею «отделить оформление от содержания». - CSS vs JavaScript для оформления. JS может менять стили динамически, но если ты хочешь просто «при наведении кнопка темнеет» — это делается одной строкой CSS (
:hover) без всякого JavaScript. - CSS vs препроцессоры (Sass, Less, Stylus). Препроцессоры — это надстройки над CSS с переменными, вложенностью, миксинами. Они компилируются в обычный CSS. С появлением Custom Properties и nesting прямо в браузере необходимость в них упала, но Sass всё ещё в ходу.
Аналогии из жизни
CSS — это как форма школьной одежды. В уставе школы (HTML) написано: «у класса есть ученики». А в правилах формы (CSS) — «у всех учеников нашей школы синие пиджаки, у пятиклассников ещё и галстук». Меняешь правила — переодевается вся школа, не нужно бегать к каждому. Где ломается: в школе ребёнок один к одному наследует форму. В CSS наследуются только некоторые свойства (цвет шрифта — да, размеры блока — нет), и это правило путает почти всех новичков.
Каскад — это как очередь решений в семье. Бабушка говорит «сладкое перед обедом нельзя», мама говорит «можно одну конфету», ребёнок говорит «я сам решу». Чья команда сработает, зависит от негласной иерархии: чем «специфичнее» источник (родитель важнее бабушки), тем выше приоритет. Где ломается: в семье иерархия мутная, и решение принимается через скандал. В CSS она формальная и считаемая: у каждого селектора есть числовая специфичность, и побеждает большее число. Никакого скандала.
Бокс-модель — это как товар в коробке на полке. Сам товар — content. Внутри коробки воздух и пенопласт — padding. Картон коробки — border. Расстояние до соседних коробок на полке — margin. Где ломается: в магазине пара коробок, стоящих вплотную, имеют двойной картон между собой. В CSS два margin-а у соседних блоков по вертикали схлопываются в один (margin collapse) — это поведение по умолчанию, и оно ловит всех, кто пытается рассчитать отступы арифметически.
Как это работает
Когда браузер открывает HTML-страницу, он проходит следующие этапы:
- Парсинг HTML — браузер разбирает HTML-документ и строит DOM (Document Object Model) — дерево элементов в памяти.
- Парсинг CSS — параллельно собирает все стили: встроенные (
<style>), внешние (<link rel="stylesheet">), inline (style="..."), браузерные дефолты. Строит CSSOM — дерево CSS-правил. - Render tree — соединяет DOM и CSSOM в render-дерево, где у каждого видимого элемента уже посчитаны итоговые стили.
- Layout (reflow) — считает геометрию: где какой блок будет на странице, какие у него размеры.
- Paint — закрашивает пиксели: цвета, фоны, тени, текст.
- Composite — собирает финальную картинку из слоёв и отдаёт видеокарте.
Самое интересное — на шаге 3. Как браузер решает, какой стиль применить к каждому элементу, если правил много и они конфликтуют?
Используется формула приоритета — specificity (специфичность). Это четырёхкомпонентный счётчик (a, b, c, d):
a— встретился лиstyle=""inline (0 или 1).b— количество ID-селекторов (#header).c— количество класс-, атрибут- и псевдо-классов (.btn,[type="text"],:hover).d— количество тег- и псевдо-элементов (div,::before).
Сравниваются как четырёхзначные числа: (0,1,0,0) сильнее, чем (0,0,9,9). Поэтому один ID-селектор перебивает девять классов.
Поверх специфичности есть «модификаторы»:
!important— флаг «применить во что бы то ни стало». Перебивает почти всё, кроме другого!importantс более высокой специфичностью.- Порядок — при равной специфичности побеждает то правило, которое в исходном коде идёт позже.
- Источник — пользовательские
!importantсильнее авторских!important, но авторские обычные стили сильнее пользовательских обычных.
Это и есть тот самый каскад, в честь которого CSS назван.
Пример. Есть элемент <button class="primary" id="cta">. К нему применимы три правила:
button { color: gray; } /* (0,0,0,1) */
.primary { color: blue; } /* (0,0,1,0) */
#cta { color: red; } /* (0,1,0,0) */
Победит красный, потому что у ID-селектора специфичность (0,1,0,0) — выше всех.
Раскладка (layout) делается одним из нескольких механизмов:
- Normal flow — блоки идут сверху вниз, строчные элементы слева направо.
- Float — обтекание текстом, изначально для картинок с подписями, в 2010-х использовалось для колонок (тёмные времена).
- Flexbox — одномерная раскладка (строка или столбец). Идеально для меню, кнопок, карточек в ряд.
- Grid — двумерная сетка строк и колонок. Для сложных макетов.
- Position absolute/fixed — точное позиционирование относительно ближайшего позиционированного родителя или окна.
Современная мантра: «Grid для общего макета, Flexbox для деталей внутри».
Где встречается в обычной жизни
- Открываешь любой сайт — то, как он выглядит (а не только что на нём написано), это CSS. От шрифтов «Госуслуг» до анимации лайков в Telegram-вебе.
- Темная тема в браузере или приложении — переключение в большинстве случаев это пара CSS-переменных, меняющих палитру.
- Адаптивная вёрстка — когда сайт открывается на телефоне и колонки складываются в одну. Это CSS Media Queries: «если экран уже 768 пикселей — показать так-то».
- Подсветка ссылки при наведении мыши — псевдо-класс
:hover. - Письмо в почте с фирменным дизайном — внутри письма HTML и CSS, только сильно урезанные (Gmail и Outlook поддерживают не всё).
Где встречается в IT и бизнесе
- Сайты и веб-приложения — основной носитель. Без CSS нет современного веба.
- Email-маркетинг — вёрстка писем. Особый ад: каждый почтовый клиент поддерживает свой огрызок CSS, иногда приходится возвращаться к табличной вёрстке из 2000-х.
- PDF-генерация из HTML — инструменты вроде wkhtmltopdf или Puppeteer берут HTML+CSS и отдают PDF. Так делают счета, отчёты, билеты, чеки.
- Электронные книги (EPUB) — внутри это HTML+CSS, упакованный в zip.
- Десктоп-приложения на Electron — VS Code, Slack, Discord, Notion. Внутри — Chrome-движок и веб-стек. Половина оформления — CSS.
- Мобильные кросс-платформенные фреймворки — React Native, Flutter, Ionic. У них либо CSS-подобный синтаксис, либо буквальный CSS.
Нужен когда…
…нужно описать оформление декларативно, чтобы потом легко менять глобально. Если ты пишешь скрипт, который при каждом изменении кнопки вручную меняет 20 свойств — ты пишешь то, что должно быть в CSS.
Кто пользуется
CSS используют все, кто делает что-либо для веба. По данным W3Techs (2025), CSS — самый распространённый стандарт оформления в интернете: его поддерживают 100% сайтов из топ-10 миллионов. Браузеры Chrome, Safari, Firefox, Edge реализуют CSS-стандарты W3C, но с разной скоростью и иногда с собственными префиксами (-webkit-, -moz-).
Крупные компании, которые активно влияют на CSS-стандарты:
- Google — главный двигатель новых модулей через команду Chrome.
- Apple — Safari, который часто отстаёт от Chrome, но при этом задаёт направление для мобильного веба.
- Mozilla — Firefox, исторический энтузиаст стандартов.
- Microsoft — Edge (теперь на движке Chromium), сильное влияние на CSS Grid (изначально Grid придумала команда IE).
- Adobe — мощно вкладывалась в CSS Regions, Custom Paint API.
Дизайн-системы крупных компаний (Material UI от Google, Carbon от IBM, Polaris от Shopify) — это, по сути, упакованные библиотеки CSS-классов и компонентов.
Альтернативы и конкуренты
- Tailwind CSS — фреймворк утилитарных CSS-классов. Вместо
class="card"и отдельного CSS-файла пишешьclass="bg-white p-4 rounded shadow"прямо в HTML. Плюсы: быстрая разработка, не надо придумывать имена классов, готовая дизайн-система. Минусы: HTML становится визуально шумным, требует tooling (сборка). - CSS-in-JS (styled-components, Emotion) — стили пишутся прямо в JavaScript-компонентах. Плюсы: динамические стили на пропсах, изоляция компонентов, удобно в React-экосистеме. Минусы: рантайм-стоимость, привязка к JS-фреймворку.
- Sass / SCSS / Less — препроцессоры над CSS. Плюсы: переменные, миксины, вложенность, функции. Минусы: лишний шаг сборки, переменные и nesting теперь есть в чистом CSS.
- Системы дизайна на токенах (Style Dictionary, Tokens Studio) — определяешь цвета/шрифты/отступы один раз в JSON, генерируешь под разные платформы (CSS, iOS, Android). Плюсы: одна правда для дизайна. Минусы: оверкилл для маленького проекта.
Когда НЕ стоит использовать
- Сложная анимация с физикой или 3D — лучше WebGL, Canvas или Lottie. CSS-анимации хороши для UI-движений (hover, появление), но физический симулятор не построишь.
- Полностью изолированные компоненты в большом приложении — каскад превращается из преимущества в проблему: один автор пишет правило, другой ломает им стили чужого компонента. Тут спасают CSS-in-JS, CSS Modules или Shadow DOM.
- Печать сложных PDF с табличной вёрсткой — формально CSS Print Module существует, но реальная поддержка слабая. Для серьёзных PDF лучше LaTeX или специализированные библиотеки (ReportLab, WeasyPrint).
Главный антипаттерн
Использовать !important для решения конфликта специфичности. Это как взять кувалду, чтобы прибить гвоздь. Через полгода в проекте окажется 50 правил с !important, которые перебивают друг друга, и никто не сможет ничего поменять. Лучше — поднять специфичность нужного селектора или переписать архитектуру стилей.
Связанные понятия
- HTML — язык разметки, на котором описывается структура страницы; CSS его оформляет.
- DOM (Document Object Model) — дерево объектов страницы в памяти браузера; CSS применяется к узлам DOM.
- Селектор — правило, описывающее, к каким элементам применить стили (
.btn,#header,a:hover). - Специфичность (specificity) — числовой приоритет селектора, определяющий, чьё правило победит в каскаде.
- Бокс-модель (box model) — представление любого элемента как прямоугольника из content/padding/border/margin.
- Flexbox и Grid — современные системы раскладки внутри CSS, отдельные модули спецификации.
Литература и источники
- MDN Web Docs —
developer.mozilla.org/ru/docs/Web/CSS. Эталонный справочник по каждому свойству, с примерами и таблицей поддержки браузерами. Бесплатно, на русском. - CSS Snapshot 2024 —
www.w3.org/TR/css-2024/. Официальный «отпечаток» всех актуальных модулей CSS от W3C. Сухо, но если нужна правда — она тут. - «CSS Master» — Tiffany Brown, 2021, en. Хорошая книга «не для начинающих»: каскад, спецификость, новые модули. Издаётся в SitePoint.
- «Каскадные таблицы стилей. Подробное руководство» — Eric Meyer, перевод 2019, ru. Классика жанра, регулярно переиздаётся. Меер — один из старейших евангелистов CSS.
- CSS-Tricks —
css-tricks.com. Сайт-блог с гигантской коллекцией рецептов: «как сделать вертикальное центрирование», «как анимировать чек-бокс». Поиск по сайту полезнее, чем гугл. - Web.dev Learn CSS —
web.dev/learn/css. Бесплатный курс от команды Chrome, актуальный. Хорошо структурирован, маленькие уроки с интерактивом.
Где встретилось у меня
Вчера я разбирался с офсайтом ЖК: на странице ехал блок с маркерами (hero-strip), а карусель в галерее работала странно. Пришлось залезть в CSS-токены проекта, разобраться с правилом для min-height, поменять CSS галереи с тайлов на карусель и пересинхронизировать видимость элементов в шапке. Без понимания, как именно каскад выбирает «победителя» среди конфликтующих правил, ковыряться в чужих стилях бесполезно — поэтому понятие настолько фундаментальное, что обходить его в этом блоге было нечестно.
Краткое резюме
- CSS — это декларативный язык оформления HTML/XML, отделяющий «как выглядит» от «что внутри».
- Создан Хоконом Виум Ли в 1994 году, первый стандарт CSS 1 — декабрь 1996, дальше развивается модулями.
- Три ключевых механизма: каскад (приоритеты), наследование (передача от родителя), бокс-модель (прямоугольники).
- Спецификация селекторов считается формулой
(a, b, c, d): inline > id > класс > тег. - Современный стек — Grid для макета, Flexbox для деталей, Custom Properties для переменных, Media Queries для адаптива.
- Главное правило выживания: не злоупотреблять
!important, иначе через полгода стили станут неуправляемыми.