Ниже приводится краткий отрывок из предстоящей книги Тиффани «Мастер CSS», второе издание, которое будет доступно в ближайшее время.
Теперь мы рассмотрим две методологии для именования вещей в CSS. Оба метода были созданы для улучшения процесса разработки для крупных сайтов и крупных команд; тем не менее, они работают так же хорошо для команд одного. Независимо от того, выбираете ли вы один или другой, ни один, ни сочетание обоих не зависит от вас. Цель их внедрения — помочь вам продумать подходы к написанию собственного CSS.
BEM, или Block-Element-Modifier, представляет собой методологию, систему именования и набор связанных инструментов. Созданный в Яндексе, BEM был разработан для быстрого развития значительными командами разработчиков. В этом разделе мы рассмотрим концепцию и систему именования.
Методология BEM побуждает дизайнеров и разработчиков думать о веб-сайте как о наборе блоков многократного использования которые можно смешивать и сопоставлять для создания интерфейсов. Блок — это просто раздел документа, например, заголовок, нижний колонтитул или боковая панель, как показано ниже. Возможно, смутно, «блок» здесь относится к сегментам HTML, которые составляют страницу или приложение.
Блоки могут содержать другие блоки. Например, блок заголовка может также содержать блоки логотипа, навигации и поисковой формы, как показано ниже. Блок нижнего колонтитула может содержать блок карты сайта.
Вариант этой формы с темным фоном может использовать следующую разметку:
В обеих наших разметках и CSS поиск - обратный и search__label - inverse — дополнительные имена классов . Они не являются заменой для поиска и search__label . Названия классов — это единственный тип селектора, используемый в системе BEM. Селекторы детей и потомков могут использоваться, но потомки также должны быть именами классов. Селекторы элементов и идентификаторов являются verboten. Обеспечение уникальности уникальности блоков и элементов также предотвращает коллизии имен, что может стать проблемой среди команд.
Существует несколько преимуществ такого подхода:
новым членам команды легко прочитать разметку и CSS и понять ее поведение
добавление большего количества разработчиков повышает производительность группы
последовательное присвоение имен уменьшает вероятность столкновений с классом имен и побочных эффектов
CSS не зависит от разметки
CSS очень многоразовый
В BEM есть намного больше, чем удобно разместить в разделе главы. Сайт BEM описывает эту методологию гораздо более подробно, а также содержит инструменты и руководства для начала работы. Чтобы узнать больше об аспекте соглашения об именах BEM, еще одним фантастическим ресурсом является Get BEM.
Atomic CSS
Если BEM — любитель индустрии, Atomic CSS — его непослушный maverick. Названный и объясненный Тьерри Кобленцем из Yahoo в его статье 2013 года, «Оспаривая лучшие рекомендации CSS», Atomic CSS использует плотную библиотеку имен классов. Эти имена классов часто сокращаются и оторваны от содержимого, которое они затрагивают. В системе Atomic CSS вы можете указать, что такое имя класса, но нет никакой связи между именами классов (по крайней мере, не теми, которые используются в таблице стилей) и типами контента.
Давайте проиллюстрируем пример. Ниже приведен набор правил, которые мы могли бы назвать обычной архитектурой CSS. В этих наборах правил используются имена классов, которые описывают контент, к которому они применяются, — глобальное поле сообщения и стили для сообщений об ошибках «успех», «предупреждение» и «ошибка»:
Это намного больше CSS. Давайте теперь воссоздаем наш компонент сообщения об ошибке. Используя Atomic CSS, наша разметка становится:
Произошла ошибка.
Наша разметка также более многословна. Но что происходит, когда мы создаем компонент предупреждающего сообщения?
Внимание: цена на этот предмет изменилась.
Два названия классов были изменены: bg-d и bc-d были заменены на bg-c и bc-c . Мы повторно использовали пять наборов правил. Теперь давайте создадим кнопку:
Эй сейчас! Здесь мы повторно использовали четыре набора правил и избегали добавления каких-либо правил в нашу таблицу стилей. В надежной атомной архитектуре CSS добавление нового HTML-компонента, такого как боковая панель статьи, не потребует добавления большего количества CSS (хотя на самом деле может потребоваться добавить немного больше).
Atomic CSS немного напоминает использование служебных классов в вашем CSS, но доведено до крайности. В частности, это:
сохраняет CSS-обрезку, создавая очень гранулированные, многократно используемые стили, а не набор правил для каждого компонента
значительно уменьшает конфликты специфичности с помощью системы селекторов низкой специфичности
позволяет быстро разрабатывать HTML-компонент после определения исходных наборов правил
Однако Atomic CSS не без споров.
Дело против атомного CSS
Atomic CSS противоречит всему, чему нас учили писать CSS. Он чувствует себя почти так же плохо, как приклеивание style атрибутов во всем мире. Действительно, одна из главных критических замечаний по методологии Atomic CSS заключается в том, что она размывает границы между контентом и презентацией. Если class = "fl m-1x" плавает элемент слева и добавляет десятикратный край, что мы будем делать, когда мы больше не хотим, чтобы этот элемент оставался слева?
Один из ответов, конечно, состоит в том, чтобы удалить класс fl из нашего элемента. Но теперь мы меняем HTML. Вся причина использования CSS заключается в том, что разметка не подвержена влиянию презентации и наоборот. (Мы также можем решить эту проблему, удалив правило .fl {float: left;} из нашей таблицы стилей, хотя это повлияет на каждый элемент с именем класса fl .) , обновление HTML может быть небольшой ценой за триммер CSS.
В оригинальном посте Кобленца он использовал названия классов, такие как .M-10 для поля : 10px и .P-10 для дополнения : 10px . Проблема с таким соглашением об именах должна быть очевидной. Изменение на 5 или 20 пикселей означает, что нам необходимо обновить наш CSS и наш HTML-код или риск иметь имена классов, которые не могут точно описать их эффект.
Использование имен классов, таких как p-1x как это сделано в этом разделе, решает эту проблему. Часть 1x имени класса указывает отношение, а не определенное количество пикселей. Если базовое дополнение составляет пять пикселей (то есть .p-1x {padding: 5px;} ), тогда .p-2x установит десять пикселей отступов. Да, это меньше описать, что такое имя класса, но это также означает, что мы можем изменить наш CSS без обновления нашего HTML-кода и без создания вводящего в заблуждение имени класса.
Атомная архитектура CSS не мешает нам использовать имена классов, которые описывают контент в нашей разметке . Вы можете добавить к вашему коду .button-close или .accordion-trigger . Такие имена классов на самом деле предпочтительны для манипуляций JavaScript и DOM.
BEM против Atomic CSS
BEM работает лучше всего, когда у вас есть большое количество разработчиков, которые строят CSS и HTML-модули параллельно. Это помогает предотвратить ошибки и ошибки, которые создаются значительными командами. Он хорошо масштабируется, отчасти потому, что соглашение об именах является описательным и предсказуемым. BEM не только для больших команд, но он отлично работает для больших команд.
Atomic CSS работает лучше, когда есть небольшая команда или один инженер, ответственный за разработку набора правил CSS, с полными компонентами HTML, построенными более крупной командой. С помощью Atomic CSS разработчики могут просто взглянуть на руководство по стилю — или на источник CSS — определить, какой набор имен классов потребуется для определенного модуля.
Знайте, когда идти своим путем
На практике ваш CSS может включать сочетание подходов. У вас могут быть имена классов, которые описывают контент или компоненты в дополнение к именам классов утилит, которые влияют на макет. Если у вас нет полного контроля над разметкой, как с CMS, то ни один из этих подходов не может быть полезен. Возможно, вам даже понадобится использовать длинные и специальные селектора, чтобы достичь желаемого.