Как правильно реализовать наследование с BEM?
Предположим, у меня есть блок list
.list {
font-size: 14px
}
и есть блок teaser, где этот list используется с размером шрифта 18px.
Чисто по логике, я бы сделал наверное как-то так:
.teaser__list {
font-size: 18px
}
Но мои коллеги категорически не приемлют такого решения и утверждают, что мне нужно сделать модификатор от list, увеличивающий размер шрифта:
.list__text-size_18 {
font-size: 18px
}
Так как правильно?
Оба варианта ок.
В случае обвешивания красотами элемента list у teaser вы описываете внешние особенности блока teaser и его элемента. В случае создания модификатора у блока list — рюшечки для блока list.
Тут надо понять что именно вам хочется, и тогда будет понятно какой способ лучше для вашего конкретного случая ;-)
upd: честно говоря,
list__text-size_18
выглядит не очень. если уж на то пошло — то лучше намиксовать туда какой-нибудьtext
с модификаторомtext_font-size_18
.Отличный вопрос @ogonkov :+1:
Есть пара моментов, я не то что бы придираюсь, просто хочу понять тонкости момента.
Условие такое есть блок
list
иteaser
:Задача использовать
list
вteaser
с размером шрифта размером шрифта 18px.Первый вариант, если я правильно понял, использовать
list
в элементеteaser__list
, я знаю два варианта микс и обертка:Учитывая то что блок независимая сущность в случае обертки у
list
размер шрифта останется без изменений и изменится в при миксе.Если мы хотим использовать обертку надо добавить модификацию блока
list
и чтобы остаться на светлой стороне и не болеть классянкой (list__text-size_18
,text_font-size_18
), надо ответить себе на вопрос зачем, вот пара из множества вариантов:Необходимо иметь реализацию блока
list
где все будет больше, БЭМ:Исключительно для блока
teaser
надо дляlist
увеличить шрифт, БЭМ:Методология не запрещает делать каскад, если знаешь что делаешь и зачем.
Получается вопрос наследования CSS правил это вопрос не к БЭМ, а к CSS.
Еще пара моментов, по классическому наименованию
list__text-size_18
={ block : 'list', content : { elem: 'text', elemMods: { 18: true } content: 'bar' } }
булев модификатор18
элементаtext-size
блокаlist
...мм ... получается как то неаккуратненько.Для себя понял надо научится думать интерфейсом, а не стилем чтобы извлечь максимум из методологии БЭМ.
@zxqfox скажи, ты серьезно думаешь это лучше?
@ilyar я помню было время люди делали так:
list_text-size_18 такое же, оно не описывает стилей в рамках семантики, и не отличается от
attrs: { style: "color: red; font-size: 15px; }
, но еще и привязано к лист — это значит у нас будет по классу для каждого блока/элемента. Это разве хорошо? явно нет.@zxqfox тогда я тебя не понял совсем
@ilyar я о том, что list__teaser намного лучше, чем list_font-size_15px ;-)
Представь на секунду, что у тебя будут шаблоны собираться под ios и андроид с разными экранами. И тогда твой экран, который собирается и под браузеры, и под приложения, будет содержать
mods: { 'font-size': '15px' }
вbemjson
. Каким образом надо будет стили описывать? Получится как-то так:_font-size_15px { font-size: 2rem; }
. А логику поведения как к этому цеплять? Тоже непонятно.На сайте GetBEM как раз появился ответ на вопрос, чем плохо модификаторы типа
font-size_18
. http://getbem.com/faq/#css-modifier-names