Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<abbr title="" ></abbr>
<acronym title="" ></acronym>
/*Widget.css*/
.widget {...}
.button {...}
//Widget.js
import styles from './Widget.css'
export const template = `
<div class="${style.widget}">
<div class="${style.button}"/>
</div>`
<div class="2B-wp">
<div class="sVK0p">
<div class="Tz7_C">Output</div>
<div class="2_vnF">
<div class="16yOh">
<p class="1hOhe">Scoped Selectors</p></div>
- var styles = require('Component.css')
div(class=styles.container)
div(class=styles.button) йа кнопко
- var styles = require('Component.css')
component-container(class=styles.container)
multi-button(class=styles.button) йа кнопко
С поправкой на то, что это именование классов для отладки, а по факту именование классов можно сделать любым, какой-нибудь другой фреймворк будет выдавать в сборке продакшна«Какой-нибудь другой фреймворк» и БЭМ-классы может выдавать в таком же минимальном виде, разницы нет.
но адепты БЭМ, мне кажется, не подумают даже хотя бы попробовать
А что делать когда на одной странице огромное количество элементов с одинаковыми тэгами и их нужно по разному стилизовать
никто не мешает использовать одни из существующих или собственные правила именования классов, которые решат эту проблему.
body > div .content .row div.article .title > p span > a {
/* и это далеко не худший пример */
}хочется плакать.БЭМ – это жесткий и очень топорный свод правилЛибо вы говорите про конкретную реализацию БЭМ, либо одно из двух.
Когда вижу css типа такого… хочется плакать.
<a class="link link__control menu-list__link menu-list__link_type_simple menu-list__link_size_small i-bem"></a>
body > div .content .row div.article .title > p span > a то, чтобы у этой ссылки для какого-нибудь случая поменять цвет, вам придётся либо повторять весь этот селектор, либо использовать !important.то, чтобы у этой ссылки для какого-нибудь случая поменять цвет, вам придётся либо повторять весь этот селекторА в БЭМ не придется? Там класс это и есть повторение селектора со всеми вложенностями. Просто точка и пробел заменены на двойное подчеркивание.
либо использовать !important.В вашем примере да, потому что его писал дилетант. Опытный верстальщик такого не напишет.
Опытный верстальщик такого не напишет.Для продолжения предметной дискуссии, приведите ваш пример для следующего кода:
<body>
<div>
<div class="content">
<div class="row">
<div class="article">
<div class="title">
<p><span><a href=""></a></span></p>
<div class="subtitle"><p></p></div>
</div>
<div class="body">
<h2></h2>
<p>
<a href=""></a>
</p>
</div>
</div>
</div>
</div>
</div>
</body>.title a { ... }
.article-author a {...}
.article-subtitle a {...}
абсолютно ненужное перечисление селектора начиная от bodyК сожалению, на практике приходится постоянно сталкиваться с подобным подходом. Не обязательно от body, это не принципиально. Но длинные каскады встречаются очень часто.
Имя класса в БЭМ семантическое и отображает суть элемента.Любое имя класса должно отображать суть элемента.
<body>
<div class="page-wrapper">
<div class="page-content">
<div class="row">
<div class="article">
<div class="article-title">
<div class="article-author"><span><a href="">Name</a></span></div>
<div class="article-subtitle"><p></p></div>
</div>
<div class="article-body">
<h2></h2>
<p>
<a href=""></a>
</p>
</div>
</div>
</div>
</div>
</div>
</body>
Поздравляю, вы написали имена классов, соответствующие БЭМ-методологии!Здесь есть некоторые «идеи БЭМ». Точнее обошлось без жестких правил БЭМ, но с теми же положительными качествами. Поэтому я и писал выше «В БЭМ есть не плохие идеи, но всё хорошо в меру».
А если ссылок внутри author будет две, разных?Вот тут как раз начнется самое интересное :) По БЭМу мне нужно будет делать примерно так:
<span class="article__link-author-wrapper"><a class="article__link-author_blue" href="">Name</a></span>
<span><a class="blue" href="">Name</a></span>
.blue { color: blue; }
.article-author a.blue { font-style: italic; font-weight: bold; }
.item
{
padding: 4px 10px;
color: black;
}
.active
{
font-weight: bold;
background: #ffc7c7;
}
А потом вы в него добавите какой-нибудь ещё стиль для ссылки – и его автоматически (и обычно – незаметно) подхватит то самое «где-нибудь ещё».В моем примере класс .blue описывает только цвет, пихать в него какие-то дополнительные стили будет лишним. Всё зависит от конкретного случая.
<div class="article-author">
<span><a class="name" href="">Name</a></span>
<span><a class="site blue" href="">Name</a></span>
</div>
.blue { color: blue; } /* будем использовать повторно в разных блоках */
.article-author a.name,
.article-author a.site { font-weight: bold; }
.article-author a.site { font-style: italic; }
Как вы собираетесь гарантировать, то что классы .name и .site не окажутся внутри других классов .name и .site?Точно так же как ваша команда следует каким-то правилам, так и моя команда следует правилу: CSS классы с общими именами (без конкретики) допустимы только на последнем уровне вложенности. И описывать их надо внутри родителя.
Как будете решать какое из CSS правил для .name и .site сейчас должно примениться, а какое нет?Не совсем понял вопроса. По-моему ответ есть в процитированном вами куске моего комментария.
CSS классы с общими именами (без конкретики) допустимы только на последнем уровне вложенностиВот есть у вас компонента menu, а ней логично есть item. А рядом есть navigation, а в нм логично тоже есть item.
И всё прекрасно работает, пока в какой-то из дней (обычно в пятницу перед сдачей проекта заказчику) меню не понадобится вложить в navigation. И вот тут начинается самое интересное.
<ul class="menu">
<li class="menu__item">Item 1</li>
<li class="menu__item">
Item 2
<ul class="navigation">
<li class="navigation__item">>Item 1</li>
<li class="navigation__item">>Item 2</li>
</ul>
</li>
</ul>
А как вы переверстаете? Как положено?Извиняюсь, выше я ошибся. В этом случае всё хорошо, Вы правы.
<ul class="main-menu">
<li class="main-menu-item">
<a>Item 1</a>
</li>
<li class="main-menu-item">
<a class="active">Item 1</a>
</li>
<li class="main-menu-item">
Item 2
<ul class="dropdown-menu">
<li class="dropdown-menu-item">
<a>Item 1</a>
</li>
<li class="dropdown-menu-item">
<a class="active">Item 2</a>
</li>
</ul>
</li>
</ul>
.main-menu-item > a.active { color: #007FFF; font-weight: bold; }
.dropdown-menu-item > a.active { color: #FF9000; font-style: italic; }
малейшее изменение разметки — и стили перестают работатьА что мне мешает немного подправить стили? Вы же меняете HTML, почему стили нельзя? Зато у меня будет всё чистенько, без нагромождений модификаторов.
.menu > .item {}
.nevigation > .item {}
.menu лежат .item. А если вдруг, не пойми зачем, мне понадобится влепить что-либо между ними я просто добавлю один уровень в SCSS и будет не.menu{
& > .item{}
}
.menu{
& > .some_shitty_block > .item{}
}
.menu{
& > .some_shitty_block {
& > .item{}
}
}
.form>.wrapper input{}, а именно так я в большинстве случаев и сделаю, то ничто мне не помешает вкорячить вокруг инпутов визард, раскидав так же копипастом нужные инпуты по разным страницам..wizard>.wrapper который ну никак не будет аффекститься .form>.wrapper<div class="title">
<p><span><a href=""></a></span></p>
<div class="subtitle"><p></p></div>
</div>
<header>
<h1><a></a></h1>
<p></p>
</header>
{
block: 'link',
elem: 'control'
// и т.д.
}
<a class="something-special"></a>
? Если да, то чем?{
block: 'link',
mix: [
{
block: 'link',
elem: 'control'
},
{
block: 'menu-list',
elem: 'link',
mods: {
type: 'simple',
size: 'small'
}
}
],
js: true
}
<a class="link link__control menu-list__link menu-list__link_type_simple menu-list__link_size_small i-bem"></a>
<a class="menu-link"></a>
<a class="link menu-list__link menu-list__link_type_simple menu-list__link_size_small"></a>
<a class="link"></a>
<div class="menu-list__link menu-list__link_type_simple menu-list__link_size_small"></div>
<a class="menu-link"></a>
<a class="link link_theme_one"></a>
<a class="link link_theme_two"></a>
<nav class="menu">
<a class="link menu__item"></a>
</nav>
<a class="menu-link"></a>
@HugoGiraudel Most common misspelling is “SMACCS”. I should just rename it to BEM.— Snook (@snookca) 5 июня 2015
<div class="myLib-superInput">
тут что то еще
</div>
.myLib-superInput {
...
}
.myLib-superInput input {
...
}
.myLib-superInput inputвот это не соответствует БЭМ, на мой взгляд.
БЭМ предлагают от него отказаться.Что ж поделать, если для сложной вёрстки каскады создают больше проблем, чем пользы.
если люди грамотныеНу естественно! Если люди грамотные, то ни ТЗ, ни таск-трекеры, вообще никакие формальности не нужны будут – грамотные люди и так сделают всё хорошо.
.title div aбраузер сначала выбирал все элементы «a», потом среди них искал те, у которых родитель «div», и, наконец, те, в которых у «div» родитель .title
браузер сначала выбирал все элементы «a», потом среди них искал те, у которых родитель «div», и, наконец, те, в которых у «div» родитель .title
Количество же классов на производительность не влияло (как минимум, на порядках тысяч разных имён классов).
Странная логика выборки селекторовну как я и сказал, это относилось к тем временам (если не ошибаюсь, 2008-9гг). Но далеко не только к ИЕ, насколько я помню, все браузеры так работали. Не знаю насчёт современных движков, так глубоко не копал.
Например, используя 3rd пати стиль или каскад где-то as is Вы рискуете получить тотже самый глюк, ради отсутствия которого Вы и начали использовать БЭМНе рискую, потому что оно никак не будет пересекаться с моими именами классов (т.к. они уникальные и совпадение крайне маловероятно, в отличие от использования общеупотребимых слов).
Это технология тотальна для всего сайта — либо Вы используете только ее — и тогда получаете все ее плюсы, либо нет.Это касается BEM-tools, но никак не методологии.
Не рискую, потому что оно никак не будет пересекаться с моими именами классов
чем сверстанное с головой на CSSКак показали комментаторы выше, «свёрстанное с головой», по-сути, подходит под БЭМ-методологию. Просто те, кто «верстает с головой» без БЭМ, делают это неосознанно, за счёт чего могут быть накладки.
либо Вы ей точно следуете и получаете БЭМ, либо у Вас не БЭМ
Фишка CSS — это каскады (он даже расшифровывается как Cascading Style Sheets), а в БЭМ предлагают от него отказаться.
Господа, чего Вы ссоритесь?
Просто же все.

.block {
.element { color: red; }
}
.other-block {
.element {
color: blue;
// если хотим миксин - .block .element;
}
}
<div class="block">
<div class="element">Красный цвет</div>
</div>
<div class="other-block">
<div class="element">Синий цвет</div>
</div>
.element {
font-family: "Comic Sans";
}
<div class="block">
<div class="element">Красный цвет</div>
<div class="other-block">
<div class="element">Синий цвет</div>
</div>
</div>
.message {
&--warning {
color: yellow;
}
}
<div block="message" mods="warning" />
А вотhttp://habrahabr.ru/post/270075/#comment_8641817
".block .element {}" и ".other-block .element {}" хотя и имеют совпадающий класс element, но они разные и стили не пересекаются.
а в случае BEM было бы что-то вроде block__element--color-red и block__element--color-blue,В случае БЭМ это было бы
<div class="block">
<div class="block__element">Красный цвет</div>
</div>
<div class="other-block">
<div class="other-block__element">Синий цвет</div>
</div>
.block__.element { color: red; }
.other-block__element { color: blue; }
Например если есть .fancy-button, у которого внутри .fancy-button__label — не надо делать штуки типа ".my_panel .fancy-button__label { color: red }". Надо идти в fancy-button.css, и делать там модификатор fancy-button--important.Лучше использовать миксы (https://ru.bem.info/method/definitions/#Микс), чем плодить модификаторы. В данном случае лучше сделать ".my-panel__button-label {color: red}" и использовать как «class='my-panel__button-label fancy-button__label'.»
<input class="big_red_button">
<input class="order-button">
<input class="order-button discount-checkout__submit">
<div class="media user premium">
<img class="img photo avatar" src="" />
<p class="body bio">...</p>
</div>
<div class="media user--premium">
<img class="media__img user__photo avatar" src="" />
<p class="media__body user__bio">...</p>
</div>
There are only two hard things in computer science: cache invalidation and naming things.
То, как именованы конкретные переменные — не проблема методологии, а проблема конкретного именующего.
.menu-list__full-article-link_size_small {
font-size: 7px;
}
@mixin small-font {
font-size: 7px;
}
.menu-list__full-article-link_secondary {
@include small-font;
// что-то еще
}
.menu-list
.menu-list__link
....
%hr
.menu-list__link
....
|
.menu-list__link
....
|
.menu-list__link
...
Да зачем мне на что-то смотреть? В моей предметной области в ближайшие несколько лет даже не предвидится проектов, которым нужны сборщики, модные шаблонизаторы и прочее…
Я же не ору на каждом углу что так, как я должен работать каждый, и как-то по-другому — это лажа и отстой.
А если проекта на конкретной машине нет и работаешь из дома, а форму кровь из носа надо сверстать девочке до понедельника, потому что у нее KPI и всё такое?
Если сверстать страничку таблицами, как это было во времена IE6, то улучшения от перехода на БЭМ с такой верстки определенно будут.«Плохая аналогия как банан в лифте». Вёрстка таблицами и использование правил именования БЭМ в HTML/CSS — ортогональны друг другу и ни как не пересекаются.
Есть хорошие готовые практики, которые давно решают все задачи сопровождаемости.Приведите их, мне правда очень интересно узнать практики которые прям «давно» и «решают».
Если бы БЭМ был так прекрасен, как описывают авторы, не было бы срача.Если у чего-то нет хэйтеров — это что-то абсолютно никому не нужно.
БЭМ — это жесткий и очень топорный свод правил, который не несет никакой практической пользыПрактическая польза от правил в БЭМ примерно такая же, как от полиморфизма, инкапсуляции и наследования в ООП. Правила задают систему, система позволяет быстрее разбираться в чужом и своём коде.
Не создают они (каскады) проблем при сложной верстке.Рекомендую почитать историю создания БЭМ (https://ru.bem.info/method/history/). Если вам каскад в вёрстке не создаёт проблем и не хочется ограничивать область видимости и область применимости селектора — я вам очень завидую, у вас впереди ещё много открытий чудных.
Единственное, мне больше нравится «западная» модификация БЭМа, где модификаторы имеют сокращенный синтаксис.В «официальном» БЭМ тоже есть сокращённый синтаксис модификаторов:
У меня от БЭМ сильное чувство, что ребята как-то недопоняли CSS, не осилели LESS и в итоге налепили велосипедов.Спецификации HTML4 и CSS2.1 были мной прочитаны раза 4 за всё время работы от начала и до конца. Думаю, что это сильно больше, чем их прочитало 99% веб-разработчиков.

БЭМ — методология развешивания костылей