layout | title | description |
---|---|---|
default |
MCSS |
Многослойная система организации CSS |
Basic [English]({{ site.baseurl }}/en), [Chinese]({{ site.baseurl }}/cn) and [Japanese]({{ site.baseurl }}/ja) translation
Многослойная система организации CSS основана на принципах OOCSS и БЭМ. Методология родилась и развивается в команде разработчиков OK.ru и рекомендуется к использованию как основа для собственного свода правил и документаций.
Несмотря на то, что MCSS изначально был создан для организации большого количества стилей, данная методология рекомендуется и веб сайтам среднего размера.
Документация постоянно обновляется и развивается, в том числе и в сопровождении вспомогательных инструментов, таких как движок документирования верстки Source.
Корневые правила методологии описаны на этой странице, для более глубокого ознакомления советуем посмотреть видео запись презентации методологии и почитать подробней об отдельных правилах можно в [модулях документации]({{ site.baseurl }}/modules/README.html).
Всегда будем рады ответить на ваши вопросы в разделе Issues на Github или в комментариях на страницах сайта проекта.
- Основные правила
- Компоновка модулей
- Первый слой — базовый
- Второй слой — проектный
- Третий слой — косметический
- Контекст
- Примеры использования
- Рекомендации
Методология MCSS максимально абстрагирована и не акцентирует внимание на конкретном стиле написания кода, организации файлов и обязательных инструментах для работы с ней. [Модули документации]({{ site.baseurl }}/modules/README.html) самостоятельны и подходят для использования вне основных правил методологии.
Блоки вёрстки делятся на модули, каждый из которых сам по себе независим и максимально абстрагирован от фиксированных размеров.
В свою очередь модули распределяются по слоям, каждый из которых имеет свой свод правил использования и взаимодействия с другими модулями.
![image]({{ site.baseurl }}/images/modules.jpg)
Фундамент включает в себя ресеты и мало изменяемые стили, которые закладываются в основу вёрстки и применяются на все страницы.
Стили фундамента, как и все ресеты, подключаются с самого начала, либо в отдельном файле, либо в начале единого CSS файла.
![image]({{ site.baseurl }}/images/layers.jpg)
Что бы сохранить вес и приоритетность каждого слоя, стили разных слоев подключаются в определенном порядке:
0_layer_foundation
reset.css
1_layer_base
base_modules.css
2_layer_project
project_modules.css
cosmetic.css
Первый слой — это портальный фреймворк, ядро интерфейса, которое состоит из наиболее переиспользуемых и абстрактных конструкций, например:
- формы
- кнопки
- блоки навигации и пр.
- и другие
Разметка модулей первого слоя тесно завязана на общем стиле портала (веб сайта) и на дизайнерских гайдлайнах. Так как модули первого слоя являются часто реиспользуемыми они должны легко вписыватся в большинство интерфейсов вашего проекта без больших изменений.
Внедряя методологию MCSS в рабочий проект, первое, с чего стоит начинать, - создать базу переиспользуемых стандартов.
Как часть первого слоя можно смело использовать такие популярные фреймворки, как Bootstrap, 960gs, inuit.css и пр.
Основное правило первого слоя — абстрактность как в [названиях]({{ site.baseurl }}/modules/naming.html), так и в разметке:
- Названия классов этого слоя не должны выглядеть чужеродно в любом месте на портале.
- Блоки модуля должны иметь стиль по умолчанию, но должны оставаться простыми и легко модифицируемыми под задачи различных проектных модулей.
Стили первого слоя могут быть модифицированы каскадом от других модулей этого же слоя и 2-го слоя. Это связано с правилом расположения смежных стилей в одном месте, подробней в [отдельном модуле документации]({{ site.baseurl }}/modules/css_placement.html).
Ядро (1-й слой) должно быть абстрагировано от модулей 2ого слоя, пример:
Стандарт форм:
{% highlight css %} .input-field { } .input-field_text { } {% endhighlight %}
Взаимодействия стандарта форм со стандартом кнопок - модифицирование каскадом от 1-го слоя:
{% highlight css %} .input-field { } .input-field .button { } {% endhighlight %}
Взаимодействие проектного модуля со стандартом во 2-м слое:
{% highlight css %} .project-module { } .project-module .input-field { } {% endhighlight %}
Модификация 2-го слоя, от 1-го запрещена! В такой ситуации слои смешиваются, вызывая беспорядок:
{% highlight css %} .input-field .project-module { } {% endhighlight %}
Базовые стили подключаются сразу после фундамента, перед 2-м слоем, для поддержания низкого уровня приоритета по весу селекторов.
Переиспользуемые, продуманные модули первого слоя позволяют сэкономить время на поддержке популярных конструкций, избавляя от необходимости поддерживать сразу несколько похожих модулей. Переиспользуемость также хорошо сказывается на итоговом размере CSS-файлов и на времени рендеринга страницы.
Имея разработанную базу, легко на её основе создавать новые интерфейсы, большая часть которых состоит из стандартных элементов.
Наработки стандартных конструкций можно переиспользовать из проекта в проект для ускорения разработки вёрстки и завязанного на ней бэкэнд функционала.
Второй слой включает в себя изолированные, проектные модули, из которых в дальнейшем собирается страница:
- форма регистрации
- блок логина
- корзина товаров
- и другие
В конструкциях второго слоя рекомендуется использовать как можно больше уникальных классов, даже если в конкретном дизайне блок не нуждается в стилизации, лучше заранее присвоить ему уникальный класс. Такой подход улучшает доступность каждой отдельной части конструкции, что в дальнейшем позволит легко изменять стили, не трогая HTML-конструкцию.
Каждый модуль должен быть максимально изолирован и существовать как отдельная, независимая единица интерфейса, которая общается только с базовым слоем.
Чтобы в проектном модуле использовать конструкцию из первого слоя, нужно просто добавить рядом CSS-класс:
{% highlight html %}
{% endhighlight %}В примере описан модуль второго слоя .toolbar, который использует стандарт первого слоя .umenu. Чтобы модифицированиевать стандарт под проектные нужды, используется каскад в CSS:
{% highlight css %} /* Toolbar -------------------------------------------------- */ .toolbar { }
.toolbar_dropdown_ul { } .toolbar_dropdown_ul .umenu_li { } /* /Toolbar */ {% endhighlight %}
Стили второго слоя могут быть модифицированы каскадом только от других модулей этого слоя.
Можно:
{% highlight css %} .project-module .other-project-module { } {% endhighlight %}
Нельзя:
{% highlight css %} .base-module .project-module { } {% endhighlight %}
Изолированность модулей позволяет легко работать с их стилями, не боясь задеть отдельные части веб сайта. Работая в команде, каждый может взяться за разработку отдельного модуля, не мешая другим разработчикам.
Стили каждого модуля можно подключать по отдельности только на те страницы, где они необходимы.
Если какой-то функционал исчезнет с веб сайта, избавиться от стилей будет очень просто: достаточно лишь избавиться от файла или от секции с его стилями.
Третий слой состоит из простых, мало влияющих стилей:
- цвета ссылок
- Простые OOCSS селекторы — пара свойств на класс (.font-size_XL, .margin-t_L)
- глобальные модификаторы
Слой может не существовать в некоторых вариациях использования методологии, но на больших проектах стили этого слоя позволяют решить проблему с дубликацией стилей и позволяют описывать редкие, непроектные ситуации, не плодя лишнюю разметку.
Стили третьего слоя должны быть построены так, чтобы при их удалении вёрстка не ломалась. Максимум могут теряться какие-то незначительные стили — цвета, отступы и пр.
Позволяется использовать простые OOCSS-классы, не больше трёх на блок, для редких, не проектных ситуаций:
{% highlight html %}
{% endhighlight %}Стили косметического слоя нельзя модифицировать каскадом от других слоёв, кроме контекста.
Косметические стили подключаются в самом конце, так же допускается использование !important.
Стиль мало влияет на общую вёрстку веб сайта, при этом решая проблемы дублированного кода и избавляя от необходимости плодить маленькие проектные и базовые модули.
Простые селекторы позволяют быстро справляться с редкими случаями, когда нужно повесить всего пару свойств на не проектный модуль.
Слой включает в себя стили высшего контекста и @media-правила, которые могут использоваться для изменения стандартных стилей под особенности различного контекста:
- .ie8, .ie9 — браузеры
- .touch — особенности устройства
- .logged-in — высший контекст в рамках веб сайта
- Media queries
Слой контекста является исключением в правилах [расположения стилей]({{ site.baseurl }}/modules/css_placement.html). Стили этого слоя располагаются по всем слоям, рядом с селекторами, которые каскадом модифицируются от контекста.
{% highlight css %} /* Module name -------------------------------------------------- */
.module { }
.module_list { } .touch .module_list { } .ie9 .module_list { }
@media screen and (max-width: 1000px) { .module { } }
/* /Module name */ {% endhighlight %}
Посмотреть взаимодействие слоёв на практике можно на [этой странице]({{ site.baseurl }}/examples/layers/). В примере, все слои поделены на секции в одном [CSS файле]({{ site.baseurl }}/examples/layers/css/style.css), таким же образом можно делить содержание секций на отдельные файлы:
![image]({{ site.baseurl }}/images/file-system.png)
Во [втором примере]({{ site.baseurl }}/examples/mcss_with_bootstrap/), изображено взаимодействие MCSS с Bootstrap, в качестве первого (базового) слоя.
Сайт проекта тоже сверстан по методологии MCSS, не стесняйтесь [заглянуть в исходники]({{ site.baseurl }}/theme/stylesheets/stylesheet.css).
Более комплексный пример использования методологии в действии, с видео записью процесса разработки можно найти тут.
Вместе с методологией советуем использовать следующие полезные практики для улучшения своего кода:
- Idiomatic CSS - принципы написания однородного CSS-кода
- Google HTML/CSS style guide - стайл-гайд по оформлению HTML и CSS кода
- CSScomb - инструмент для сортировки CSS-свойств в рамках селектора
- Как можно больше комментируйте CSS, любые нестандартные свойства, конструкции, магические числа — это пригодится не только членам вашей команды, но и вам, когда вы через пару месяцев вернётесь к коду (правила комментирования кода, скоро в отдельном модуле MCSS)