Добрый день.
Я недавно начал изучать БЭМ, и один вопрос не дает мне покоя.
В FAQ написано, что:
- Если фрагмент кода может использоваться повторно и не зависит от реализации других компонентов страницы, необходимо создавать блок.
- Если фрагмент кода не может использоваться самостоятельно, без родительской сущности (блока), в большинстве случаев создается элемент.
Допустим, есть три разных блока, но у них есть заголовки с одинаковым внешним видом. С одной стороны, эти заголовки встречаются в нескольких местах, и, возможно, на нескольких страницах. Это наводит на мысль, что они независимы, и их следует делать вложенными блоками:
http://plnkr.co/edit/rCWCk3yGJJzAWpHqzpHa?p=preview
С другой стороны, эти заголовки всегда находятся внутри своего родителя в определенном месте, что наводит на мысль, что это элементы.
http://plnkr.co/edit/nxh0ObqXDSRKg3N4zAKc?p=preview
Есть ли более развернутые и подробные рекомендации по поводу того, что считать блоком, а что - элементом, и что значит "независимость" в БЭМ?
В БЭМ также есть понятие миксов. В вашем случае заголовок определённо элемент, но он может иметь микс в виде блока
<h4 class="up-content__header header">upper</h4>
. Таким образомheader
будет содержать общие свойства для заголовков, аup-content__header
сможет содержать доопределения для заголовков блокаup-content
Спасибо.
Да, а это нормально, что в хтмл останется класс up-content__header, который, возможно, вообще не будет использован?
Просто, как видите, все нужные правила берет на себя класс header, а доопределений может и не быть. Таким образом, класс up-content__header будет иметь чисто номинальное значение.
До тех пор, пока заголовки не обладают богатым внутренним миром и в 100% случаев используются внутри одного родителя, можно обойтись элементом. В целом понимание, как разбить интерфейс на блоки и элементы приходит с опытом, однозначного ответа на все случаи жизни не существует.
Я тоже больше склонен считать, что здесь нужны элементы, но смущает постоянное дублирование одинакового набора правил для разных классов.
Попробую теперь использовать миксы.