-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Комментарий #1
Comments
Оригинальный синтаксис .block__element_mod-type_mod-value мне нравится больше. Знаки подчёркивания хорошо выглядят. Их проблема только в выделении по даблклику на слове. Я не видел ни одного редактора или IDE, который бы правильно установил выделения. Поделюсь ссылкой ещё на одну статью про вёрстку независимыми блоками. БЭМ — это совсем не страшно. Да, больше букв, но зато меньше проблем с обслуживанием. Кстати, в таких статьях, чаще всего, вообще не затрагивается вопрос БЭМ-ификации пользовательского контента. Мне нравится, когда и контент, написанный пользователем, оформляется с помощью простых селекторов. Тут без автоматических фильтров не обойтись. Но это совсем не проблема, я считаю. После WYSIWYG-редакторов разметку всё равно нужно валидировать. Markdown, Wiki, BBCode и другие разметки и так проходят пост-обработку. В этот цикл можно встроить добавление простых селекторов тегам. И нейминг у них можно организовать в стиле БЭМ. |
Допустимо ли использование подобных селекторов: «.person--female__hand»? Я не встречал ни в одной статье про концепцию незвисимых блоков. На сколько я знаю используются подобные каскадные конструкции: «.person--female .person__hand» |
P.S. Отдельное спасибо вашему редактору разметки у комментариев, который хотел превратить двойное подчеркивание в начало полужирного текста, но потом передумал. |
Мои извинения. Разные интерпретаторы разметки на сервере и клиенте. Исправим и сведем поведение к единообразному. |
Оригинальная BEM-методология нравится больше. Насколько я помню, модификатор не может отдельно существовать от модифицируемого блока или элемента. А в этих примерах может class="media__img--rev". |
Тогда это не модификатор. Это абстрактный класс (g-, i- префиксы в БЭМе). |
У оригинального формата модификаторов есть несколько плюсов:
|
mistakster, да с выделением в редакторах проблема :/ Вебшторм, например, разбивает слово по дефисам. Omgovich, Yvelious, да, тоже очень удивили эти моменты. Противоречат же самой сути системы. |
Сам метод БЭМ достаточно противоречив. Авторы, которые восхваляют данный стиль именования CSS классов зачастую оперируют такими абстрактными понятиями, как изящный, прозрачный и так далее. Понять какой код изящней, а какой нет - пожалуй можно только увидев код, на порядок изящней текущего. И что я скажу: мне кажется, что код записанный традиционными классами + оперируя традиционным наследованием выглядит гораздо изящней, чем код написанный с применением БЭМ. Конечно же это мое субъективное мнение. Но допустим, автор статьи пытается показать наглядно: чем отличается традиционный стиль именования от БЭМ, мол обычные классы плохо передают контекст. Хорошо, но это не проблема лежит не в плоскости классов - это проблема лежит в плоскости понимания программистом контекста. Да и допустим, чем не понятна следующая конструкция: .person .hand {} .person .female{} .person .female-hand{} .person .left-hand{} Собственно главный аргумент, что обычный CSS не передает контекст - здесь просто не уместен. Я склоняюсь к использованию lessCss, который призван решать подобные проблемы, а не пробовать заставить программистов тащить контекст в каждом селекторе. |
@jmas БЭМ решает в том числе (или, может, и в первую очередь) и проблему независимости стилей — если вложить руку мужчины в руку женщины, то при написании стилей каскадом обе руки станут женскими — так как и к мужской руке применятся соответствующие стили. |
<div class="a">
<div class="b"></div>
</div>
<div class="c">
<div class="b"></div>
</div> .a .b { } <div class="a">
<div class="b of-a"></div>
<div class="c">
<div class="b of-c"></div>
</div>
</div> .a .b.of-a { } Почему нельзя разруливать таким образом? |
@jmas еще важный момент — БЭМ не только про CSS, он весь проект целиком: js, шаблоны и даже серверный код. |
@tadatuta Я готов поддержать дискуссию, так как хочу вывести истину. Привязываться к классам в JS? А как насчет привязки к [data-param], так мы вообще избавляемся в JS от CSS-зависимостей. Насчет шаблонов ничего не слышал - подскажите в чем суть. |
Потому что в этом случае вы и получаете лишние классы, только вместо одного длинного вы получаете два класса: и короткий и длинный :) БЭМ рассчитан на высокую поддерживаемость стилей, проименовав класс один раз в последствии не нужно будет ни править html, ни править css для того, чтобы вложить один блок в другой. |
@kizu Хорошо, что мешает изначально писать: <div class="something-list">
<div class="item of-something"></div>
</div> Подчеркиваю, изначально. Я понял, что суть БЭМ - просто заставить людей писать изначально длинные имена, описывающие контекст, но сама запись получается совсем не-элегантная, ИМХО. |
@jmas Немного из рубрики «Срываем покровы». На самом деле БЭМ полне может обходится вообще без классов. Например, опираясь на кастомные теги.
Про шаблоны в БЭМ-терминах можно подробно прочитать тут: http://ru.bem.info/articles/bemhtml-rationale/ |
@jmas Во-первых, я не вижу чем Мультиклассы типа
|
Да, я понимаю, что на больших проектах часто люди бывают с различным уровнем, и как мне кажется БЭМ появился именно как что то помогающее привести весь общий опыт под один знаменатель. Так сказать чтобы и браузеры работали, блоки не конфликтовали, и люди понимали. Хорошо, есть такие вещи как lessCss или промежуточные процессоры, которые перегоняют "расширенный CSS" в валидный и браузероугодный CSS. Не подскажите почему было принято взваливать проблему на плечи программистов (верстальщиков) (учить дополнительный синтаксис, отслеживать зависимости, прописывать контекст), а не на плечи программе (программа самостоятельно разруливала и перегоняла в БЭМ-синтаксис определенные блоки)? |
Less и ему подобные не решают эту проблему (хотя я бы тут поспорил с тем, что это проблема — написание длинных классов может быть упрощено тысячей способов, начиная от фильтра в Emmet, который там есть из коробки, заканчивая любыми кастомными рещениями). Независимые компоненты будут в любом случае перекликаться, потому надо в имя элемента закладывать имя блока. Использование вложенности для препроцессоров часто добавляют лишних проблем — как с читаемостью кода, так и с его нахождением. Частично эту проблему решают source maps, но не целиком (поиском и грепом сложнее будет найти нужный селектор). Ещё раз: я не вижу проблемы в длинных именах классов и даже работая над промо-страницами и «домашними сайтами для котиков» я всегда видел только плюсы от БЭМ-нотации и АНБ-подхода. Все отступления от них сразу же вызывали те или иные проблемы с поддержкой. Да, они могут быть незначительны, вроде переименования классов или изменения структуры CSS, но они будут. К длинным классам легко привыкнуть, при этом если не нравятся конкретный синтаксис, то его легко подогнать под себя — хотя использовать кемелкейс для названий блоков, а элементы писать через дефис, это не важно. |
Я так понимаю использование препроцессоров при с БЭМ теряет эффективность. Т.е. нельзя использовать вложенные классы |
Суть препроцессоров не в вложенных селекторах, а в облегчении рутины и тут они выполняют свою миссию вполне хорошо, и также они вполне отлично уживаются с БЭМ. PS. Каскад не следует использовать безотносительно БЭМ и препроцессоров в любом случае |
Почему нельзя использовать data атрибуты для модификаторов: |
кто сказал, что нельзя? можно. почему это не предложено в концепции, это уже другая история, имеющая некоторые причины:
|
А что там со скоростью рендеринга дата-атрибутов относительно классов? |
Не думаю это самая актуальная проблема для современных браузеров. 18 декабря 2013 г., 14:22 пользователь Stas Levyshev <
Отправлено с Dendy |
@matmuchrapna вторая причина не критична: обычно модификатор и так должен перекрывать дефолтные стили. Зато доступ в js из коробки есть (jQuery тут помогает). Пока вижу только плюсы. |
всё верно, покуда у тебя не возникнет потребность перекрыть модификатор селектором из одного класса на другом уровне переопределения. Допустим, ты подключил библиотеку блоков со всеми их модификаторами в начало таблицы стилей, а затем хочешь переопределить этот блок на какой-то определённой странице — в этом случае ты не сможешь использовать в переопределении селектор из одного класса, так как специфичность селектора модификаторов будет ставить тебе палки в колёса. В итоге, специфичность — зло и предложенная модель для модификаторов это бомба замедленного действия для самого себя |
В голову пока пришло два примера:
Здесь вроде все не так плохо. Все, что будет в
Тут уже в разы хуже: скорее всего нужно будет перекрывать стили. Так же всплыла другая проблема - конфликт модификаторов. Непонятно к какому блоку отноститься Еще одна проблема с этим подходом - меньшая производительность селекторов. |
увеличилась специфичность — что-нибудь взорвётся а второй аргумент я не понял |
Попробуй |
Поставьте, пожалуйста, точку в конце предложения. |
Удобство БЭМ (на русский манер) очевидно. Но есть вопрос, именно в контексте данного решения: может ли блок содержать в себе другие блоки, но относящиеся к своему родительскому? Если да, так им присваивать названия? |
Блоки, в общем случае, должны быть независимыми. Их названия выбираются исключительно исходя логической структуры. Например, есть список.
Элементы, которые относятся к блоку Я не исключаю вариант, когда |
Я немного не так выразился наверное, сейчас на примере.
Вот header-top и header-bottom - это блоки внутри блока или элементы этого блока? |
Чтобы ответить на этот вопрос, нужно ещё посмотреть на дизайн. Скорее всего, блоки уже не будут повторяться на странице. Поэтому можно их разметить как элементы. А вот менюшки явно просятся быть блоками. |
По вашей записи получается, что отдельные блоки. В данном примере, чтобы не плодить лишние сущности, я все привязывал бы к хедеру. А менюшки, действительно, если сложны, то для удобства делаются отдельными блоками. // jade
header.header
div.header__top
div.header__logo
div.header__top-menu
ul.top-menu // или ul.header-top-menu если хочется логически привязать к хедеру
div.header__bottom
div.header__phone
div.header__bottom-menu
ul.navigation |
Пролапатив весь топ выдачи гугла по БЭМ, не смог полюбить его и тем более понять. Помогите мне, пожалуйста. Насколько я понял одной из целей БЭМ, создание независимых блоков. Значит ли это, что для блока с текстом нужно задавать все стили для текста. Его начертание, цвет, размер, чтобы блок был поистине независимым? |
Бем — дитя яндекс. Он хорош для больших проектов и не нужен для малых. Как вы думаете?
The text was updated successfully, but these errors were encountered: