Всем добрый день!
Есть такой кейс:
<!-- Тема «default» -->
<button class="button button_theme_default">
<div class="button__text">Отправить</div>
</button>
<!-- Тема «outline» -->
<button class="button button_theme_outline">
<div class="button__text">Отправить</div>
</button>
Так же есть, например, модификатор button_size_small
который меняет размер button__text
. Проблема/вопрос заключается в том, что есть необходимость при разных значениях модификатора button_theme_{name}
менять поведение модификатора button_size_small
, другими словами их связать. Итого при default
и размере small
хочется у button__text
размер, например, 12px
, а при outline
и размере small
хочется у button__text
размер 14px
.
Какие я вижу варианты:
- переименовать блок, например, вместо
button
→button-outline
. - связывать модификаторы
.button_theme_outline.button_size_small
. - добавить размер к названию темы, например,
.button_theme_outline-small
.
Более привлекательным (для меня) является 2-ой вариант. Но какой путь более правильный по БЭМ?
Спасибо!
Второй. Каскад от темы вполне здоровая практика, можно найти примеры и в самих bem-components.
Спасибо за ответ!
В подтверждение ваших слов приложу ссылку на исходный код:
https://github.com/bem/bem-components/blob/c40c5f271401326a80bfdc1fd9924d56c68628f6/design/common.blocks/button/_theme/button_theme_simple.post.css#L33
Получается, если я правильно понял синтаксис, то связывание так и работает:
И, таким образом, вполне правильным (по методологии БЭМ) является кейс:
Когда один модификатор может зависеть от другого (или нескольких?):
👌 👍
Да, допустима. По сути, вы описываете правило «Если у блока
button
установлен модификаторtheme
в значенииoutline
и модификаторsize
в значенииsmall
и модификаторhas-shadow
, назначить ему следующие стили: …», т. е. это «уточняющий» каскад, а не просто ради «перебивки» специфичности. По сути вы описали одно из ключевых правил БЭМ — не запрет каскада, а обдуманное его использование там, где это необходимо. Вроде и просто и очевидно, но теперь я, например, работая с вашим проектом, с большей вероятностью не «наделаю делов».