Разработчик Бен Фрейн (Ben Frain) однажды заметил: "Писать CSS-код легко. Масшабировать и поддерживать его - нет".
К счастью, на просторах интернета можно найти множество решений этой проблемы. В данной статье рассмотрены основные киты структуры CSS-кода, а также интересные рыбы/млекопитающие поменьше.
Итак, начнем.
БЭМ
Автор: Яндекс
Пожалуй, самая популярная сейчас методология в мире. Название означает "Блок, элемент, модификатор".
Эти категории играют следующие роли в коде:
Из этих категорий строятся классы для непосредственного использования в CSS. При этом не следует использовать селекторы тэгов (это потенциально может помешать использовать блок/элемент в каком-то нестандартном месте на сайте, т.е. привязывает сущность к контексту); рекомендуется также избегать каскадных селекторов, т.к. получившийся класс сам по себе достаточно точно (специфично) выбирает соответствующий элемент.
Такой подход позволяет избавиться от непредсказуемых последствий каскада и изолирует отдельные модули друг от друга.
Пример кода в стиле БЭМ:
.block_element {...} .block_element-modifier {...}
Для удобства используются разные разделители между блоком и элементом и между блоком/элементом и модификатором; при этом можно использовать любые разделители, однако они должны быть одинаковыми в рамках одного проекта.
А теперь о бочках меда и ложках дегтя:
Кстати, для написания кода в таком стиле раньше часто рекомендовали препроцессор Stylus, так как он позволяет писать код так:
.block { &-element {...} }
Сейчас так можно писать, используя как SASS, так и LESS.
И еще одно замечание - в оригинальной методологии БЭМ используются названия модификаторов, содержащие саму модифицируемую величину, например, button--sizeLarge. Сейчас в небольших проектах многие разработчики не указывают ее для лаконичности: button--large.
OOCSS
Автор: Николь Салливан (Nicole Sullivan)
OOCSS означает объектно-ориентированный CSS (Object-Oriented CSS). В этот подход заложены две основные идеи:
Итак, "разделяй и властвуй". С помощью такой структуры разработчик получает общие классы, которые можно использовать в разных местах.
А теперь - две новости (как водится, хорошая и плохая):
Кроме того, сам подход OOCSS предлагает не конкретные правила, а абстрактные рекомендации, поэтому метод достаточно сложен для применения на практике.
Зато, как это иногда случается, некоторые идеи OOCSS вдохновили авторов на создание своих, более конкретных способов структурирования кода - своеобразных форков OOCSS.
SMACSS
Автор: Джонатан Снук (Jonathan Snook)
SMACSS расшифровывается как "масштабируемая и модульная архитектура для CSS" (Scalable and Modular Architecture for CSS).
Основная цель подхода - уменьшение количества кода и на упрощение поддержки кода.
Итак, Джонатан предложил разделить стили на 5 частей (в порядке включения их в документ):
Также рекомендуется вводить неймспейсы для классов, принадлежащих к определенной группе, а также использовать отдельный неймспейс для классов, используемых в JavaScript.
Этот подход действительно позволяет упростить написание и поддержку кода и в последнее время привлекает достаточно большое количество разработчиков.
Atomic CSS
Автор: Тьерри Коблентц (Thierry Koblentz) - Yahoo
Atomic CSS, редко также ACSS - атомарный CSS. В некотором роде этот подход представляет собой OOCSS, возведенный в абсолют.
При использовании такого подхода для каждого повторно используемого свойства должен быть сформирован отдельный класс. Пример: стиль "margin-top: 1px" предполагает создание класса "mt-1", стиль "width: 200px" создание класса "w-200".
Такой стиль позволяет минимизировать объем CSS-кода за счет повторного использования деклараций, а также сравнительно легко вводить изменения в модули, к примеру, при изменении технического задания.
Однако у этого подхода есть существенные недостатки! Вот они:
В связи с этими недостатками, подход был встречен существенным объемом критики. Тем не менее, подход может оказаться эффективным для очень больших проектов - кажется, Yahoo! вполне довольны использованием ACSS. Кроме того, атомарный CSS используется в различных фреймворках для задания корректирующих стилей элементов и в некоторых слоях других методологий.
MCSS
Автор: Роберт Харитонов - Одноклассники
MCSS - многослойный CSS (Multilayer CSS). Этот стиль написания кода, зародившийся в компании "Одноклассники", предлагает разделить стили на несколько частей, называемых слоями.
Очень важна иерархия взаимодействия слоев:
AMCSS
Автор: Глен Маддерн (Glen Maddern)
Название подхода означает "Модули атрибутов для CSS" (Attribute Modules for CSS). Это достаточно необычный подход, упоминания которого, тем не менее, все чаще встречаются в блогах гуру разработки.
Если обобщить, этот способ является несколько более человеко-читаемым представлением БЭМ-структуры. Давайте рассмотрим пример:
<div class="button button--large button--blue">Кнопка</div>
Такая цепочка классов не очень приятна для глаз, поэтому давайте сгруппируем эти значения по атрибутам.
Вот что получится:
<div button="large blue">Кнопка</div>
Во избежание коллизий имен неплохо бы добавить атрибутам неймспейсы, не так ли? Тогда код нашей кнопки примет следующий вид:
<div am-button="large blue">Кнопка</div>
Если вы используете валидатор для проверки кода на корректность, не забывайте также добавить приставку "data-" перед названием атрибута.
Для записи CSS-кода используется малоизвестный селектор "~=" (IE7+), который работает как атрибут класса: выбирает элементы, значения атрибутов которых содержат указанные слова, разделенные пробелами. Так, селектор вида a[class~="link"][class~="button"] аналогичен селектору a.class.button (даже по специфичности, так как специфичности селекторов по классу и по атрибуту равны друг другу!).
Соответственно, CSS-код:
.button {...} .button--large {...} .button--blue{...}
Преобразуется в:
[am-button] {...} [am-button~="large"] {...} [am-button~="blue"] {...}
Ну как? Если вы считаете такой код слишком оригинальным, для вас существует менее радикальная форма использования AMCSS:
<div am-button am-button-large am-button-blue></div>
FUN
Автор: Бен Фрейн (Ben Frain)
FUN означает "плоская иерархия селекторов, служебные стили, компоненты с неймспейсами" (Flat hierarchy of selectors, Utility styles, Name-spaced components). Ну или веселье.
За каждой буквой названия стоит определенный принцип:
Некоторые разработчики отмечают, что код, написанный с использованием этих принципов достаточно удобно писать и поддерживать; в некотором роде автор взял лучшее от БЭМ и SMACSS и изложил эти техники в простой и лаконичной форме.
Такой подход накладывает достаточно мало требований по структуре кода и проекта, он лишь устанавливает предпочтительную форму записи селекторов и способ их использования в разметке. Но в небольших проектах этих правил может быть вполне достаточно для создания качественного кода.