И снова популярный вопрос про вспомогательные классы, на этот раз его задает @life_maniac.
«Я правильно понимаю, что по БЭМу я не могу добавлять общие вспомогательные классы ко всем блокам? Например, есть класс center
, который центрирует содержимое по обеим осям. Хочется иметь его в шапке и еще в паре блоков.»
Да, но нет :)
С одной стороны, БЭМ утверждает: «Не может быть классов вне блоков». С другой стороны, в БЭМ есть понятие миксов — нескольких блоков на одном DOM-узле.
Этот случай — наш.
Предлагаю рассмотреть класс center
как универсальный блок, который можно подмешивать к любым другим блокам, чтобы центрировать их содержимое.
Примером такого блока в bem-core может служить clearfix, а в bem-components — z-index-group.
Важно помнить, что миксы можно использовать не только в CSS, но и в JavaScript.
Подробнее об этом можно узнать из доклада «Миксы во вселенной БЭМ».
Я так и не понял как смешивать Javascript блоков. Можно примеров?
@KlonD90 Зависит от качества смешения. Можно наследоваться, можно примешивать. Какой случай интересует?
Есть 2+ вариантов.
Пример использования можно найти в bem-componentsОшибсяthis.findBlocksOn()
для доступа к примешанному блоку.Кроме того есть наследование, но это уже не совсем микс.
@zxqfox Спасиб, глянул на оба, ну мне скорее взять button и на него еще какой-то функционал повесить, сделав его элементом моего составного блока, а эту задачу как-то не решает ни 1 из этих методов. @Guria Круто, вариант 2 мне подойдет. А как это организовать? Для этого я так понимаю у одного из блоков должен отсутствовать собственный шаблон?
@KlonD90 Присутсвовать он может, но использоваться при замесе не будет. Про это даже есть обсуждение (про примешивание еще и шаблонов), но там все неоднозначно получается, поэтому вот так.
@KlonD90 Всё верно. Если вам нужна своя особенная разметка, то вы можете реализовать её в своём блоке, а от
button
взять только js реализацию, например, примиксовав его на DOM ноду элемента вашего блока. Затем:@zxqfox а можно ссылку? @Guria а как это в bemjson прописать?
@KlonD90 с
button
я немного погорячился. Он унаследован от блокаcontrol
, который подразумевает наличие элементаcontrol
у блокаbutton
. Проще сделать наоборот: замиксовать элемент вашего блока на блокbutton
:@Guria Круто спасибо :)
@KlonD90 ;-)
Пока писал вы уже все порешали. В общем, можно и с элементами это делать, но там есть немножко магии.
https://github.com/aristov/elem-instances/blob/master/README.md
Нужно их добавить в deps
Ну и в путь ;-)
@zxqfox Зачем
elem-instances
? Я поначалу (3 дня назад) тоже через них сделал, пока не нашёл (вчера :smile:)this.findBlocksOn('my-elem', 'button')
. А свой блок объявлять стандартным образом.@Guria Связность другая у кода ;-) Мало ли какой я там блок подсуну, а мой элемент сможет порулить. Например, есть 20 библиотек, в каждой свой интерфейс, я хочу использовать компонент из библиотеки XXX миксую элемент контрол с модификатором XXX-proxy и туда говорю имя компонента, элемент с этим модификатором знает, как работают компоненты из XXX и дергают нужные методы у их блоков, в это же время я не вношу никакого кода ни в сам блок, ни в элемент контрол моего блока, который занимается общением с формой. Связность минимальная.
Но это удобно, когда у вас есть много разных библиотек, и в них во всех есть какие-то компоненты, которые вам нужны, и которые решать примерно одинаковую задачу — и.их становится можно заменять, или дополнять одни другими, без доработок в исходных библиотеках.
Но elem-instances @tadatuta не рекомендует использовать, потому что они сыроватые. На мой взгляд, да, но жить можно. Доки мало.
Ну и в обычной жизни elem-instances можно вполне заменить «приватными» блоками типа menu-item для menu. Тут уже дело вкуса.
Ну тогда тем более для @KlonD90
elem-instances
из разряда полезно знать на вырост, а не начинать с лишней абстракцией и зависимостью от "сыроватой" фичи.Согласен ;-)