Привет,
Нигде не нашел точного описания, да и в твиттере все не очень уверенно отвечали, поэтому дублирую вопросы сюда:
1. При миксе блоков, каждый микс должен быть самостоятельной сущностью? Или микс к блоку может только дополнять его? 1.1. Нужно ли дублировать стили примиксованному блоку?
2. В каких случаях разрешен каскад? Насколько православно каскадом можно стилизовать вложенные блоки?
2.1. Пример: У нас на сайте есть стандартные линки, допустим `.action-link`, везде они оранжевые, но в режме просмотра фотографий - белые http://d.pr/i/zW0, в таком случае я могу от блока фото-леера их переопределить каскадом?
2.2. Второй пример: Когда не только ссылки меняют цвет, а группа блоков http://d.pr/i/nd4R, но только в одном месте, из за чего не хочется и не удобно делать каждому блоку модификаторы.
3. На http://bem.info http://d.pr/i/Yj2M - такое количество классов, это нормальная практика? Есть .menu-list__item и .menu-list__item_size_normal, почему в самом часто встречающемся случае не используется знаениче по умолчани, зачем везде модификаторы? Я думал модификаторы только в редких случаях.
Привет.
Для справки.
Первые посты в клубе полезны для ознакомления с историей вопроса: http://clubs.ya.ru/bem/posts.xml?tb=520 — тут основные мысли про блоки, АНБ и вообще. http://clubs.ya.ru/bem/replies.xml?item_no=580 — тут про каскад и отказ от префиксов и т.п.
Немного о себе.
В Яндексе я не работаю, тулзами для сборки на рабочем проекте попробовал пользоваться только 4 месяца назад, а до этого использовал идеи БЭМ для написания стилей и html, так же пользовался самодельным велосипедом .
Далее отвечу на вопросы так, как я это понимаю сам, без претензий на объективность.
1. При миксе блоков, каждый микс должен быть самостоятельной сущностью? Или микс к блоку может только дополнять его?
Дополнять блок должен модификатор блока. Микс же, как правило, является самостоятельной сущностью, в идеале абсолютно независимым блоком. Т.е. мы можем свободно примиксовать к элементу статьи .b-article__social блок .b-share. Тем самым мы сэкономим на стилях для элемента статьи.
1.1. Нужно ли дублировать стили примиксованному блоку?
Нет, по возможности избегайте этого.
2. В каких случаях разрешен каскад? Насколько православно каскадом можно стилизовать вложенные блоки?
"Каскад — зло". Но это не правило, это просто рекомендация. Как рекомендуют не оставлять заряженным оружие, чтобы случайно не выстрелить себе в ногу. Т.е. если ты опытный ковбой и знаешь что делаешь — делай на здоровье. Мы с как-то пришли к выводу, что каскад допустим внутри блока, но за межблочный каскад нужно бить, бить сильно и методично.
Касательно пунктов 2.1 и 2.2 понятно, что плодить модификаторы почем зря не нужно, если ну 100% уверены что каскад не выльется в будущем в проблемы (а вероятность проблем чертовски велика).
3. На http://bem.info http://d.pr/i/Yj2M - такое количество классов, это нормальная практика? Есть .menu-list__item и .menu-list__item_size_normal, почему в самом часто встречающемся случае не используется знаениче по умолчани, зачем везде модификаторы? Я думал модификаторы только в редких случаях.
Тут ничего сказать не могу, скорее всего следствие использования шаблонизатора . А так все мои рабочие проекты, написанные вроде бы по БЭМу, тоже красотой не блещут. Всегда есть legacy, ошибки в именовании (sic!), планировании и т.п.
БЭМ как методология для меня не является набором строгих правил для вёрстки, он просто содержит ряд рекомендаций, позволяющих структурировать код в голове и на файловой системе, вводит простые и понятные термины и т.п., о чём написано почти во всех статьях на данную тему (напомню, я говорю про методологию).
1. При миксе блоков, каждый микс должен быть самостоятельной сущностью? Или микс к блоку может только дополнять его?
Да. Пример неправильной вспомогательной сущности для миксования: .is-disabled - явно выражает свойства без указания объекта.
1.1. Нужно ли дублировать стили примиксованному блоку?
Тут надо просто голову включать и понимать, что каскад = большая связность.
Не очень понятно зачем такое дублирование может быть нужно.
Сущности могут пересекаться по отдельным CSS-правилам, тогда, конечно, эти правила нужно указать для микса, поскольку надеться на правильный порядок подключения сущностей мы не можем.
2. В каких случаях разрешен каскад? Насколько православно каскадом можно стилизовать вложенные блоки?
Каскад не запрещен строго, но использовать его не рекомендуется
2.1. Пример: У нас на сайте есть стандартные линки, допустим `.action-link`, везде они оранжевые, но в режме просмотра фотографий - белые http://d.pr/i/zW0, в таком случае я могу от блока фото-леера их переопределить каскадом?
Опять же, каскад допустим, но надо понимать, что это модификация от контекста, т.е. не АНБ. Православный способ – модификатор.
2.2. Второй пример: Когда не только ссылки меняют цвет, а группа блоков http://d.pr/i/nd4R, но только в одном месте, из за чего не хочется и не удобно делать каждому блоку модификаторы.
В этом случае хочется использовать каскад намного больше, чем в предыдущем, поскольку каскад не запрещен, то каждый сам решает когда переступить черту
3. На http://bem.info http://d.pr/i/Yj2M - такое количество классов, это нормальная практика?
Да, это далеко не рекорд
подписываюсь под каждым пунктом)
Это всем нужно прочитать
1. К миксу лучше относится как к инструменту или фиче, которая просто позволяет смешивать БЭМ-сущности, причем нет абсолютни никаких ограничений на то, какие сущности захочется смешать, будь то блоки, элементы одного или разных блоков, блок и его модификатор и т.д. все возможные варианты.
Отвечая на вопрос, про самостоятельность миксуемых сущностей, могу сказать, что тут всё как всегда зависит от конкретных задач и в каждом конкретном случае придется подумать мозгом, чтобы найти хорошее решение. Нужно понимать, что БЭМ предостовляет возможность выразить мир в виде определеных сущностях, и воспользоваться "инструментом" миксы, чтобы упростить себе жизнь (например, чтобы не дублировать код, или чтобы обеспечить большую независимость). Если же по какой-то причине для конкретной задачи смешать блок с элементом (элемент тут как пример не самостоятельной сущности, блок наборот) другого блока настолько профитно, что не жалко усложнить код добавив зависимостей между блоками, то, никто не запрещает дерзать
Еще, чтобы не бояться миксов, лучше понимать, что проще смешивать более атомарные сущности, т.к. предсказать результат их микса будет проще. Это я к тому, что получив непонятный результат, не стоит сетовать на миксы, а стоит подумать, зачем же захотелось оперировать сложными сущностями, и подумать не стоит ли их упростить. Скажем если у нас есть блок "мальчик" и блок "девочка" и мы захотим их смешать, что получится в результате я не смогу представить, знаю лишь, что префикс «би» будет в тему
1.1 Дублировать что либо, наверное, всегда и везде считалось плохим тоном
2. Каскад плох как минимум из-за того, что создают дополнительных зависимостей между сущностями, еще проблемы с производительностью, но про них и так все знают
Поэтому каскад православен в тех случаях, когда подобных проблем он не создаст. Например, каскад по классу на элемент:
.block_red .block__elem { color: red }
2.1. Тут я, конечно, огромной попаболи от использования каскада не вижу, но если есть возможность выразить ссылки внутри в виде элементов блока просмотра фотографий лучше выразить, если нет - то не страшно.
2.2. Имхо, тут каскад принесет больше проблем. Что можно сделать? Например, для блока просмотра фотографий можно написать элементов, которые будут миксовать к себе блоки и задавать им нужные модификаторы. Конечно, это все может быть удобно, только если такая логика будет выражена в шаблонах. Если в шаблонах выразить подобное не получится — думать, что страшнее: жить с большим колличесвом неявных зависимостей или возиться с элементами и модификаторами блоков, есть еще третий вариант - заиспользовать шаблонизаторов, в которых можно выразить подобную логику без особых мучений
3. Да, это нормально
Решение об использовании значений по умолчанию или не использовании всегда лежит на плечах разработчика.
Использовать значения по умолчанию может быть удобно, потому что в результате получаем меньше сущностей.
Но это может быть не удобно, потому что в модификаторах придется очень много чего переопределять.
В итоге приходится искать наиболее балансный вариант, чтобы удобных случаев было больше. И опять же, никто не запрещает добавлять модификаторы по умолчанию в шаблонизаторах если очень хочется.
Отличный ответ
Еще можно сделать блок описывающий в себе только каскад на ссылки, для изменеия их вида. Сделать микс на родителя группбы блоков для которых нужно изменить внешний вид ссылок. Таким образом этот каскад будет описан в одном месте с однообразной струкрутой
Каскад о каскад
1) Как уже сказали ниже, по замыслу каскад использовать можно, но только внутри блока
2) Комментарий от Витали Харисова c хабра:
http://habrahabr.ru/post/151931/#comment_5165248