БЭМ рекомендует писать
. Зачем это нужно? Почему нельзя просто сделать
, ведь есть селектор .block.mod, можно на него повесить все классы.
Не могу найти поиска по Форуму. Если уже обсуждалось — дайте, пожалуйста, ссылку. Или научите искать по Форуму, если это возможно.
Отвечу сама, одна из причин:
Из записи
<div class="block block_mod">
отчетливо видно структуру блока. То есть здесь мы видим блок и модификатор, нет никаких разночтений. Когда как взгляд на код<div class="block mod">
не дает информации: это блок с модификатором или 2 смиксованный блока. Имя модификатора не всегда может сообщить от этом, тем более что можно использовать сокращения. А такое мгновенное получение информации от структуре очень ценно, ведь это сразу отсылает к правильным файлам. То есть одного взгляда на код достаточно, чтобы понять, где редактировать.Но напишите, пожалуйста, другие причины тоже.
Помимо удобства определения принадлежности модификатора сводится к нулю вероятность совпадения модификаторов при миксе. Например,
.Menu.Btn.active
делает активными сразу два блока, а.Menu.Btn.Btn_active
только.Btn
. Также, специфичность селектора.Btn_active
меньше чем у.Btn.active
, что удобно при переопределении.Аргумент из области "вам это ничего не стоит": В CSS записи
.block.mod
и.block_mod
различаются одним символом. Даже работу с пре-процессорами это не аффектит, ведь с тех пор как они стали поддерживать БЭМ, можно писать&_mod
. То есть всё перечисленные плюсы вы получаете "бесплатно", всего лишь изменив один символ в описании селектора.миксы
@veged Спасибо, про миксы уже выше написали. Но также же могли бы помочь реальные примеры, кроме приведенного выше. И, что насчет аргумента про скорость матчинга селекторов? Браузеры уже научились это оптимизировать настолько?
Аргумент про выражение структуры через классы — очень правильный. Но настоящие плюсы модификаторов с именем блока в классе выявляются, когда нужно делать рефакторинг!! :)) Глобальный поиск по модификатору, к которому не привязано имени блока — это ад. То же самое касается имён элементов, хотя с элементами намного очевиднее аргумент про структуру, и про это спорят меньше.
Сочетание модификаторов разных блоков также может привести к коллизиям стилей, если нет "неймспейсинга".
А вот аргумент про неотличимость класса блока и класса модификатора — не до конца верен, при использовании префиксов вида
.b-
классы блоков видно сразу.