Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Elements, attributes, and attribute values in HTML are defined (by this specification) to have certain meanings (semantics).
http://www.w3.org/TR/html5/elements.html#semantics-0
Некоторые атрибуты тегов тоже туда относятся, но не id, class, или data-*
b-popupa b-popupa__without-padding b-popupa_theme_ffffff b-popupa_direction_down b-popupa_is-bem_yes i-bem b-dropdowna__popup b-dropdowna__menu b-popupa_js_inited
.По БЭМ-именованию с исключеним множества вложенностей в именовании вполне себе можно понять что это за блок и даже какое иерархическое положение он имеет.
b-popupa_theme_ffffff
Да, но сомнительно, что для попапа будут семантичными классы b-popupa b-popupa__without-padding b-popupa_theme_ffffff b-popupa_direction_down b-popupa_is-bem_yes i-bem b-dropdowna__popup b-dropdowna__menu b-popupa_js_initedДа, будут семантичны. Объяснить каждый класс отдельно?
В статье же «Нет вложенных селекторов — т.е. никаких .class1 .class2{ display: none; }, всё определяется 1 (одним) селектором класса (плоская/одноуровневая структура стилей/селекторов).»В статье ошибка, я ниже про это написал: habrahabr.ru/post/151931/#comment_5165248
.menu__item__link
.menu__item__link_active
Может быть только один уровень вложенности (поправьте меня примером с bem.info, если я не прав).Да, всё верно, только один уровень вложенности, может быть только блок__элемент.
Т.е., м.б. только отношения блок__элемент, но никак не блок__элемент__элемент.
А как тогда быть с модификаторами? Их нельзя применять к элементу, только к блоку, или я ошибаюсь?Модификторы могут быть как у блоков, так и у элементов:
Я понял, в чем у нас с вами основа непонимания. Я считаю less и sass такими же костылями, как и БЭМ, а вы нет.Я с вами полностью согласен. Вообще, HTML/CSS не предназначался для современного их использования, для создания web-приложений. Если бы они дизайнились сейчас с нуля именно для этого современный web был бы другим. И делать web-приложения было бы существенно проще.
двойным подчеркиванием в именах, от которого нынешних программистов отучала пользоваться почти каждая книга по программированию.БЭМ-методология не навязывает использование подчёркиваний для отделения одних сущностей от других, мы можете использовать любые другие сепараторы для отделения имени блока от имени элемента, и модификатора от блока/элемента.
.main-menu > .main-menu__item > .main-menu__link,
.ico.ico_size_16.ico_map
Главные принципы хорошей вёрстки — это её семантичность, последовательность и читабельность.А главные принципы поточной разработки — хорошая поддерживаемость кода, возможность быстрого внесения изменений, простота передачи кода от одного человека другому и быстрый вход нового человека в команду и проект.
<table style="list-style-type: circle; border: solid 1px #ffffff">
<tr>
<td style="display: table-cell;">Привет</td>
<td style="display: table-cell;">Пока</td>
</tr>
</table>
То есть продукт, в котором не учтена природа html и css, долгие годы их эволюции.Поверьте, там учтена природа HTML/CSS и годы их эволюции.
<div class="b-popupa b-popupa__without-padding b-popupa_theme_ffffff b-popupa_direction_down b-popupa_is-bem_yes i-bem b-dropdowna__popup b-dropdowna__menu b-popupa_js_inited">
...
</div>
b-popupa__without-padding вместо paddind:0Почему вы думаете, что without-padding это padding: 0? И theme_ffffff вполне может быть с градиентами и фоновыми картинками.
То что яндекс чудачит таким образом оставляя имена в чистом виде, либо недоработка, либо продукт все еще находится в стадии отладки.Мы минимизировали классы в выдаче поиска: clubs.ya.ru/company/replies.xml?item_no=23106
У них там и организация файлов проекта, и представление блоков в JSON/XML, из которого потом автоматом генерируется HTML, и привязка к жаваскрипту, и даже инструменты для работы с этим.Почитайте историю развития БЭМ: clubs.ya.ru/bem/replies.xml?item_no=1398
Да ну вы же должны понимать, что элементы с такими классами вроде приведённого выше яндексковского нельзя верстать и поддерживать руками и никто в здравом уме этим заниматься не будет.И верстали, и поддерживали. От того оно всё развивалось и совершенствовалось.
Вы меняете часть работающей системы, и ожидаете, что все будет работать также, как и прежде?Да, именно так.
.nav{}
.nav__item {}
.nav__item-link {}
.nav {}
.nav__item {}
.nav__item__link {}
<div class="news">
<div class="news__tabs">
<div class="news__tabs__item">
</div>
<div class="news__list">
<div class="news__list__item">…</div>
<div class="news__list__item news__list__item_hiddable">…</div>
<div class="news__list__item news__list__item_hiddable">…</div>
<div class="w-news__list__item_project">
<div class="news__list__item">…</div>
<div class="news__list__item">…</div>
<div class="news__list__item">…</div>
</div>
</div>
</div>
.news {}
.news__tabs {}
.news__tabs__item {}
.news__list {}
.news__list__item {}
.news__list__item_hiddable {}
.w-news__list__item_project {}
.news .list .item.hiddable
просто без пробелов…list
элемент и item
элемент а list-item
элемент, как и положено… К тому же если иерархия плоская, а стили независимы — совершенно не нужно описывать оную иерархию в имени класса. Как я это вижу…<div class="news">
<div class="list">
<div class="item">…</div>
</div>
</div>
К тому же если иерархия плоская, а стили независимы — …
<div class="b-news">
<div class="b-news__list">
<div class="b-news__item">...</div>
<div class="b-news__item">...</div>
<div class="b-news__item">
<div class="b-news__list">
<div class="b-news__item">...</div>
</div>
</div>
</div>
</div>
news — блок, list — элемент блока, а item — элемент блока, вложенный в другой элемент блока.Да, элементы вкладываются один в другой при использовании, но при описании этих элементов проще использовать плоский список, не вкладывая их в коде и на файловой системе один в другой. Это позволяет не менять код, когда между list и item появится ещё один элемент.
Вы в имени элемента так или иначе используете ту же самую иерархию именования, что я описал выше, только в качестве разделителя пишете абсолютно нелогичный с моей точки зрения символ дефиса.Дефис отделяет слова в составных именах, вне зависимости от того, блок это, элемент или модификатор.
Так при чем здесь тогда дефис? И, интересно, как бы вы написали такое — «news__list__item__link__image»?
Именование модификаторов как "_ключ_значение", на мой взгляд, излишне. На практике для нормального понимания абсолютно всегда достаточно написать только "_значение". Или кому-то в строке "*_disabled *_hidden *_big" будет непонятно, что "_disabled" — это о состоянии, "_hidden" — о видимости, а "_big" о размерах? Зачем писать лишние "_state", "_visibility" и "_size", когда все и без них очевидно?Мы тоже так думали, пока не начали писать много JS, который работает с модификаторами и меняет их значения.
К примеру, у нас на проекте мы с коллегами отказались от всяческих предлагаемых яндексом префиксов, но добавили свой — префикс «w-», который мы добавляем к элементам-оберткам (так называемые wrappers, отсюда и название префикса).У нас был префикс h- (holster) ровно для этого, но потом мы от него отказались. Вообще отказались от всех префиксов, кроме b- и i- и то, используем их сейчас из-за большого количества кода с ними. Нельзя просто так взять и отказаться от префиксов :)
А вы внутри имени ставите разделитель «блок-элемент».
Я ставлю разделитель "__элемент-блока", вложенный в "__другой-элемент-блока", так как в данном случае они неотделимы.В том-то и дело, что отделимы и в любой момент между ними может встать другой элемент. Лучше делать набор независимых, не цепляющихся друг за друга элементов и делать их них финальный сендвич только в HTML, а не при написании кода.
Если вы говорите о том, какие классы используют в Яндексе, то это не так: схема именования элемента не зависит от его вложенности в другие элементы.
Если вы говорите о БЭМ в целом, то это тоже не верно. БЭМ как методология не регламентирует именование классов, оставляя это за конкретной реализацией.
Вот тут я отчётливо ощутил все проблемы классических стилей. В итоге я просто стал заменять их на БЭМ по мере необходимости.
Яндекс и его верстальщики работают с горой сервисов, как следствие им требуется безболезненно тягать 100500 блоков из одного проекта в другой с минимальными напрягами (желательно — копипастой).Copypasters will burn in Hell.
Не совсем, вместо псевдоклассов лучше использовать (если возможно) JS, который будет навешивать классы виде .element__hover или типа того.Зависит от вёрстки и того, хочется ли менять программно hover, например.
Вставили что-то в старый блок. Задеплоили. QA вернул — белый текст на белом фоне! Прописали класс ссылке. Перебивается. Нашли, добавили веса именами родителей. Не хватило. Импортант. Уже вверху есть. Какой дебил… А, это я полгода назад — фичу сдавали. Попробовал убрать этот верхний импортант — ого, он вообще в инлйне. Я что через телефон фиксил, что ли…Браво!
.search_bar > .ещё_стиль
чем .search-bar__элемент
?<button> и <input type="submit">
, он сидит, чешет репу и не очень понимает как именно правильно, потом он сталкивается с тегами представления и опять в задумчивости над <b> <strong> <span class="strong">
.input
, а на класс .btn
? Я даже сначала удивился и возмутился и понаписал своих «правильных» стилей (т.е. добавил через запятую input[type=«submit»] и т.д.). Но потом я понял, что это было ошибкой. В итоге и ребята из твиттера и ребята из яндекса делают одно и тоже — избавляются от селекторов не классов… Кто правее — поживём увидим. Ни кто же не навязывает (люди просто делятся опытом), если Вас мои примеры не убеждают — ну значит это Вам не подходит, но тоже не означает, что это автоматически не подходит всем.Пытаясь весь этот цирк форсировать силами своих специалистов на различных конференциях яндекс заставляет выглядеть их просто глупо, искренне сочувствую.БЭМ в Яндексе занимается группа энтузиастов, которые его развивают и по мере своих сил распространяют вне Яндекса.
.b>._m1>._m2|bem
<div class="b">
<div class="b b_m1">
<div class="b b_m2"></div>
</div>
</div>
Я правильно понимаю, что придется при смене схемы кроме добавления одного класса для body еще и переписывать классы у всех элементов?Нет, не правильно. Можно реализовать цветовые схемы через модификатор theme у корневого блока page, задав для body классы page и page_theme_bear и указав изменения внешнего вида вложенных блоков отталкиваясь от этого модификатора.
В атких случаях, если я ничего не путаю, .scheme .block оправдано.
2, Нет вложенных селекторов — т.е. никаких .class1 .class2{ display: none; }, всё определяется 1 (одним) селектором класса (плоская/одноуровневая структура стилей/селекторов).
В случае с БЭМ мы упремся в бесконечное число классов которые придется навешивать на каждый элемент.Нет, не упрёмся.
Вкратце вся система БЭМ укладывается в 2 тезиса (принципа/правила):
Нет селектора кроме класса — т.е. никаких стилей повешанных на теги, ID и прочее, только классы.
Нет вложенных селекторов — т.е. никаких .class1 .class2{ display: none; }, всё определяется 1 (одним) селектором класса (плоская/одноуровневая структура стилей/селекторов).
Яндекс даже полез в W3C (связано это или нет — не знаю, но надеюсь, что да).Нет, это никак с БЭМ не связано.
Вот у меня сайт, вот вёрстка не по БЭМ, почему я должен всё менять?Про это был подробный рассказ на Я.Субботнике в Ебурге в прошлом году: clubs.ya.ru/bem/replies.xml?item_no=864
Нет вложенных селекторов — т.е. никаких .class1 .class2{ display: none; }, всё определяется 1 (одним) селектором класса (плоская/одноуровневая структура стилей/селекторов).Это утверждение неверно.
Примечание: согласно нотации БЭМ Модификатор отделяется от Элемента одиночным подчёркиванием.Модификатор состоит из пары ключ-значение.
Почему лучше верстать в соответствии с БЭМ — практические примеры