Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class="b-link b-link_white b-link_block b-link_undecorate" (из примера в статье).style="color: #fff; display: block; text-decoration: none;"?div.b-footer__logo
div.&__img
<div class="b-footer__logo">
<div class="b-footer__logo__img">
....
</div>
</div>
БЭМ предполагает уход от каскадных стилей (типа div .someClass li)
.block:hover .block__element { /* ... */ }
.block .block__text {}
.block .link {}
или .block .block__content .block__item .block__text {}
.menu {
> a {
&.active {
background: blue;
}
}
}
.b-menu-link-active
{
background: blue;
}
a {
text-decoration: none;
}
— нормально (если вы хотите отказаться от подчёркиваний ссылок во всём проекте… ну и «порадовать» сами_знаете_кого),a {
text-decoration: none;
padding: 40px;
background-color: black;
color: white;
}
— плохо, т.к. существует почти 100%-ная вероятность, что вам понадобятся обычные текстовые ссылки без паддингов и фонов..panel {
display: block;
}
.panel-sm {
font-size: 12px;
padding: 20px;
}
.panel-md {
font-size: 14px;
}
.panel-dark {
background-color: #444;
color: #ccc;
}
.panel-dark a {
color: #fff;
}
<div class="panel panel-sm panel-dark">...</div>
.b-menu {
margin: 10px;
position: relative;
transition: all .5s;
color: green;
&-link {
position: relative;
transition: all .5s;
color: green;
&-active {
position: relative;
transition: all .5s;
color: green;
}
}
}
.b-menu
margin: 10px;
position: relative;
transition: all .5s;
color: green;
&__link
position: relative;
transition: all .5s;
color: green;
&_active
position: relative;
transition: all .5s;
color: green;
<div class="b-networks__icon b-networks__icon_small b-networks__icon_instagram"></div>
Проблема одноимённых пространств имён есть всегда.
a, у него есть элемент header. И ещё блок b, у него тоже есть элемент header..a {}
.a__header {}
.b {}
.b__header {}
header может выглядеть абсолютно по-разному, но иметь одинаковое название..a .header {}
header, который вложен в блок a. Но так писать не стоит, потому что теряется смысл независимости блоков.В том-то и дело, что БЭМ, добавляя каждому тегу много презентационных классов и усложняя их названия, не дает никаких преимуществ и независимости блоку.Где вы увидели в БЭМ рекомендацию добавлять презентационные классы?
b-slide-list__item
b-slide-list__item_active
.slider-item
.slider-item-active
<div id="dm_page">
<div class="dm_layout">
<div class="dm_area dm_layout_top" id="dm_area_19"><div class="dm_zones clearfix"><div class="dm_zone"><div class="dm_widgets"><div class="dm_widget main_header"><div class="dm_widget_inner">
.....
<div class="b-networks__icon b-networks__icon_small b-networks__icon_rss"></div>.b-networks__icon_small.b-networks__icon_size_smallМы используем одно подчёркивание для отделение имени модификатора от имени блока и ещё одно подчёркивание для отделения значения модификатора от его имени.
meta написан в коротком html5-стиле, а link по-старому..b-page кажется фейл: background-color не применится к этому блоку, так как идущий дальше background вернет это свойство к значению по-умолчанию. Пример на jsfiddle. Уже писал про использование общего свойства background и font в комментарии к посту Mirantus form.ul>li.js- (JavaScript) префикс для выделения элементов для селекторов jsТак делать не нужно. По БЭМ js это одна из технологий блока и скрипты пишутся в рамках уже имеющихся блоков, а не плодятся другие.
.block > .element { }
?.block > .subblock { }
.subblock > .subelement { }
или.block > .subblock {
> .subelement { }
}
?<div class="first-block__element"></div>
<div class="first-block"></div>
<div class="second-block">
<div class="second-block__first-element">
<div class="second-block__second-element"></div>
<div class="some-another-block"></div>
</div>
</div>
<a href=""></a> настолько спецефична и неприменима ни в чем другом, кроме как в ссылках, и по факту вы не сможете без нее организовать ссылки (не стоит только умничать про обработку любого элемента JS'ом) и поэтому вы предлагаете к крайне спецефичной конструкции применить супермегаспецифичный стиль, на случай «Вдруг в будущем откажутся от использования ссылок, а мы будем на коне». ({
block: 'menu',
content: [
{
elem: 'item',
content: {
elem: 'link',
content: 'test',
url: '#'
}
},
{
elem: 'item',
mods: { active: true },
content: {
elem: 'link',
content: 'test',
url: '#'
}
},
{
elem: 'item',
content: {
elem: 'link',
content: 'test',
url: '#'
}
},
{
elem: 'item',
content: {
elem: 'link',
content: 'test',
url: '#'
}
}
]
})
/**
* Общий шаблон для блока 'menu'
*/
block('menu')(
tag()('ul'),
elem('item')(
tag()('li')
),
elem('link')(
tag()('a'),
attrs()(
{
href: this.ctx.url
}
)
)
)
/** Шаблон для блока 'menu' с учетом модификатора "активный" у вложенного элемента :
*
* "если блок содержит элемент 'item' с модификатором 'active',
* то установить у блока свойство '_active_item'
*
* @predicate block('menu').elem('item').elemMod('active', true)
*
*/
block('menu').elem('item').elemMod('active', true)(
/* в моде def (не путать с модификатором, мода -- правило генерации html)
* applyNext:
* установить свойство шаблона для блока _active_item равное true и
* применить следующий шаблон
*
* */
def()(
applyNext({_active_item: true}
)
)
)
/** Шаблон для блока 'menu' с установленным свойством '_active_item':
* для блока со свойством '_active_item' элемент 'link' генерировать через тег 'span'
*
* @predicate block('menu').match(this._active_item).elem('link').tag()
*/
block('menu').match(this._active_item).elem('link').tag()('span')
.menu>.__item*5>.__link, но поддерживать потом всё равно придется полную версию, конечно.<div class="block">
<div class="block__element">
<div class="block2">Text</div>
</div>
</div>
block_select_on, что он выделен:<div class="block block_select_on">
<div class="block__element">
<div class="block2">Text</div>
</div>
</div>
.block_select_on .block2{} Где писать этот каскад, в css первого, второго блока или в css проекта? Ладно, на уровне css/html получается лаконично. Но где желаемая независимость блоков? Разработчик первого блока ещё может догадаться, что в его блок будут добавлять другие блоки, и им нужно менять оформление, но неизвестно что именно менять (структура блоков неизвестна). Разработчик второго блока даже и не думал об особенностях отображения внутри неопределенных им блоков.
Верстка для самых маленьких. Верстаем страницу по БЭМу