Всем привет. Подскажите, пожалуйста, как переопределить стили блока select через модификатор или киньте пример, в документации ничего не нашел, кроме общего описания, что это возможно https://ru.bem.info/method/key-concepts/#Переопределение-блока .
мне нужно переопределить два свойства: Первое:
.menu-item_theme_islands.menu-item_checked {
/* background: url("data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%…h d%3D%22M13.5.5l-8 12L1.7 8l-1 1.6L5.6 15l9.1-13.4z%22%2F%3E%3C%2Fsvg%3E") 0 50% no-repeat; */
}
заменить на
.menu-item_theme_islands.menu-item_checked {
background-color: #fc0;
}
Второе:
.menu_size_m .menu__group-title~.menu-item_theme_islands, .menu_size_m[class*=menu_mode] .menu-item_theme_islands {
padding: 0 30px;
}
заменить на
.menu_size_m .menu__group-title~.menu-item_theme_islands, .menu_size_m[class*=menu_mode] .menu-item_theme_islands {
padding: 0;
}
В итоге, вместо http://i.imgur.com/HYTWPsN.jpg должно получиться так: http://i.imgur.com/hxGDcse.jpg
Что я сделал:
Добавил модификатор к блоку select ( without : 'tick' )
mods : { mode : 'radio-check', theme : 'islands', size : 'm', without : 'tick' },
- В папке common.blocks/select/_without создал файл select_without_tick.deps.js
({
})mustDeps : { block: 'menu-item', mods: { without: 'tick' } }
В папке common.blocks/menu-item/_without создал файл menu-item_without_tick.styl
.menu-item_without_tick { padding: 0;
&.menu-item_checked {
background: none; background-color: #fc0; } }
Где у меня ошибка?
В целом выглядит вполне правдоподобно, разве что семантика модификатора
without
несколько странная. Предположу, что проблема лишь в весе селекторов (например, вbem-components
стили, завязанные на дизайн, используют каскад от класса темы). Это должно быть видно в веб-инспекторе.В веб инспекторе вообще нет класса menu-item_without_tick
Как вы решаете подобные задачи (переопределение свойств, поведения по модификатору )? Есть ли примеры в документации? Не могу найти.
Посмотрел внимательнее на описание вопроса — действительно, ему неоткуда там взяться, т.к. нет шаблонов про пробрасывание
_without_tick
отselect
кmenu-item
.Но на самом деле и смысла в этом особого нет, вполне можно обойтись каскадом в данном случае.
Если брать в качестве примера
bem-components
, то там есть примеры переопределения уровнями (common.blocks -> desktop.blocks -> design/common.blocks -> design/desktop.blocks) и модификаторами практически у каждого блока.Схема в целом очень простая:
level1/block1/block1.css
окажется раньше, чемlevel2/block1/block1.css
и т.о. код со второго уровня перекроет код первого.Вот, собственно, и вся история про переопределения.
Мне не совсем понятно как пробросить _without_tick от select к menu-item. Можно на примере показать? Спасибо.
В шаблоне
select_without_tick
выставляем флаг, создаем шаблон наmenu-item
с предикатом от этого флага и добавляем модификатор.Что-то примерно такое (псевдокод):
это сейчас так модно, молодежно?)))
@voischev
я выше писал, что мне семантика модификатора
without
не нравится, а в данном случае я бы вообще вместо проброса модификатора менял стили каскадом отselect
, но хозяин — барин.@tadatuta поддерживаю, тут я тоже за каскад. В умах некоторых почему то если БЭМ то вообще никаких каскадов. ((( приходится с этим бороться, и кстати успешно сделются люди после убеждений (что надоело уже сильно) ))) Но хозяин — барин, да!
Так как тему создал я, то отвечу, что я сделал каскад, а про пробросывание модификатора спросил, так как в доках примеров не нашел. А это обязательно мне потребуется.
@tadatuta, кстати, что Вы понимаете под семантикой? Так как я лингвист по образованию, а в лингвистике это раздел, изучающий значения слов и выражений, поэтому мне не очень понятно применение данного термина к моему модификатору without. Буду признателен, если вы объясните, что "семантика" означает в программировании. Спасибо.
@Sergei-b84 Коллега! Я — переводчик :)
«Семантика» в программировании имеет ту же семантику, что и в лингвистике ;)
Мой комментарий был о том, что
_without
читается как «модификатор без», что мало говорит о его смысле и потенциально может принимать разные взаимоисключающие значения. Хотя по логике здесь должен флаг:{ 'without-tick': true }
(читается это «без галки» и может быть либо включенным, либо отсутствовать).Спасибо.