Ответ 1
BEM запрещает поместить элементы в элементы CSS!
Вы делаете наиболее типичную ошибку в разметке BEM - записываете block__element__element
.
Вы должны создавать новые блоки, а не копировать DOM-дерево.
Например:
Правильный HTML:
<div class='block'>
<div class='block__elem1'>
<div class='block__elem2'></div>
</div>
<div class='block__elem3'></div>
</div>
Правый CSS:
.block {}
.block__elem1 {}
.block__elem2 {}
.block__elem3 {}
Если вам нужно создать элемент элемента, то вам нужно сделать новый блок или сделать ваше bem-tree одним вложенным элементом!
НЕПРАВИЛЬНО:
<div class='block'>
<div class='block__elem1'>
<div class='block__elem1__elem2'></div>
</div>
</div>
ВПРАВО # 1: создать новый блок
<div class='block1'>
<div class='block2'>
<div class='block2__elem'></div>
</div>
</div>
RIGHT # 2: Создайте свое bem-tree с одним вложенным элементом
<div class='block'>
<div class='block__elem1'>
<div class='block__elem2'></div>
</div>
</div>
Обратите внимание - вы не можете поместить элементы в элементы в css, но вы можете и должны помещать элементы в элементы в html! DOM-дерево и дерево BEM могут быть разными.
Не записывайте странные имена, помещая имя элемента в имя блока!
НЕПРАВИЛЬНО:
.block {}
.block-elem1 {}
.block-elem1__elem2 {}
Поскольку при попытке переместить блок возникает проблема с нечетными именами:
<div class='other-block'>
<div class='block-elem1'></div>
</div>
Вложенные html-элементы - это DOM-дерево.
Имена классов, которые вы пишете, являются деревом BEM.
Почувствуйте разницу!
DOM-дерево:
<ul>
<li>
<a>
<span></span>
</a>
</li>
</ul>
.ul {}
.ul > li {}
.ul > li > a {}
.ul > li > a > span {}
BEM-дерево:
<ul class="menu">
<li class="menu__item">
<a class="menu__link">
<span class="menu__text"></span>
</a>
</li>
</ul>
.menu {}
.menu__item {}
.menu__link {}
.menu__text {}
Ссылки:
"Элемент является составной частью блока, который нельзя использовать за его пределами". https://en.bem.info/methodology/key-concepts/#element
Элемент является частью блока! Не часть элемента! Читайте Виталий Харисов, автор BEM-методологии: https://twitter.com/harisov/status/403421669974618112
Имя класса, подобное "block__elem__elem___elem", означает, что кодер ничего не понял в BEM.
Читайте также:
- https://en.bem.info/methodology/faq/#why-does-bem-not-recommend-using-elements-within-elements-block__elem1__elem2
- http://getbem.com/faq/#css-nested-elements
На веб-конференции есть отчет (на русском языке) Веб-камера: Front-End Developers Day об этой теме: https://www.youtube.com/watch?v=kBgHdSOj33A + слайды: http://ihorzenich.github.io/talks/2015/frontendweekend-bem/