-
Notifications
You must be signed in to change notification settings - Fork 179
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
Использовать AMCSS чтобы не валить всё в class #455
Comments
|
_2. В приведённом мной варианте блок можно рассматривать только как объединяющий элементы контекст, который как у вас написано в методологии "Имя блока задает пространство имен и обеспечивает уникальность имен элементов и модификаторов." _3. Для порядка ;) |
_3. CSS правила [атрибутов] гибче, чем просто классов. |
@viT-1 Как вот такой пример будет выглядеть в AMCSS? <div class="my-component my-component_type_normal my-component_size_l my-component_theme_islands some-other-component__elem1 yet-another-component__elem1 yet-another-component__elem2 yet-another-component__elem2_size_l yet-another-component__elem2_theme_cool yet-another-component__elem2_hovered"> |
Я подумаю над вашим примером, а пока вот вам для раздумий: http://codepen.io/viT-1/pen/VjXybd |
В вашей БЭМ-методологии у верстальщиков потому и возникает путаница, что им для вёрстки нужны элементы и их модификаторы, а не блоки. Блоки нужны лишь как ограничение namespace'ов, что мой пример и демонстрирует. |
Темы так вообще, я считаю, не должны быть реализованы через контекст модификаторов, а должны включаться/выключаться отдельными css-шкурками в конце всех css-включений, то бишь правила там должны быть прямыми. |
Нет, конечно. Множество блоков отлично работают сами по себе и вообще не имеют элементов и модификаторов.
Модификатор — это и есть такая шкурка. Включение отключение — это установка и снятие класса на DOM-узле. При этом нет никакой проблемы на одной странице иметь одновременно один и тот же блок, отрисованный в разных темах. |
Спорить о недостатках такого UX-решения не буду =) тем более что есть богатый опыт с текучкой дизайнеров, каждый из которых рисовал свой дизайн, а мы по очень большому проекту не успевали их внедрять целиком на всех страницах, из-за чего местами в нём был интерфейс с единовременной поддержкой нескольких шкурок сразу.
Не понимаю чем отличается работа блоков самих по себе от работы тех же элементов самих по себе. У вас БЭМ головного мозга, мыслите шире. |
Отвечаю на ваш вопрос о том каким может быть вариант в виде AMCSS:
Всяко больше порядка ;) и модификаторы можно теперь не громоздить, и даже использовать одинаковые. |
Я понимаю, что bemtools реализацию БЭМ'а через AMCSS пока не поддерживает и разработка станет в человекочасы и потому вы будете держаться за костыль длинных имён до последнего, но вы всё-же здраво обсудите данный реквест с коллегами ;) и как еванглеист, подумайте над удобством понимания БЭМа через AMCSS вне контекста потенциально потраченных человекочасов на реализацию... |
@viT-1 Про человекочасы:
Но на самом деле при использовании шаблонизатора HTML писать руками в принципе нет смысла. И тогда исходный вопрос теряет смысл: Если хочется задать блок, то нужно писать про блок: {
block: 'header',
mods: { type: 'main' },
mix: [{ block: 'b2' }, { block: 'b3', elem: 'e1', elemMods: { some: 'thing' } }]
} Вот как это работает: http://goo.gl/NBV9qC И вот так Более чем в 6 раз короче, чем вариант на AMCSS. Круто, да? ;) Но самое забавное, что это на самом деле не важно: при разработке время тратится не на нажатие клавиш, а на обдумывание архитектуры и поиск хитрых багов. |
В актуальном состоянии вы только документацию на английском поддерживаете, верно? Я в курсе про то, что БЭМ это методология, которая не задаёт жёстко реализацию, но многие именно из-за сложностей с пониманием неймспейсов и привычке верстать элементами в конечном счёте совершают много ошибок, разбору которых вы посвящаете много времени (в том числе и яндекс-субботниках). Именно потому, что та реализация БЭМа, которую вы приводите в примерах, назовём её "базовой", неудачна по сути, AMCSS немного приводит методологию в порядок, хотя, конечно же, и здесь никто не мешает выстрелить себе в ногу. Исходный пример реализации БЭМа в AMCSS = IAMCSS обновил, загляните туда ещё разок, он весьма выразителен. _3. Это не важно какая технология используется для рендеринга (XSLT или BEM-XJST), тред о конечном результате. Писать руками всегда есть смысл, если вы хотите "сделать всех счастливыми", то есть распространить прежде всего саму методологию вёрстки, а не инструменты. В ваш БЭМ не входят в том числе и потому, что хотят разобраться как он работает в виде нативных технологий. Чёрного ящика обвязки (инструментов и прочего) изучающий методологию человек старается избежать (он знает на данный момент HTML и CSS), набрасывая примерчики вручную.
Извините, но это в определённом смысле херня, да и не исключает bem-xjst рендеринга в AMCSS ;) |
Добавлю. Когда вы апеллируете к BEM-XJST и BEM-JSON то вам сложнее поправить то что на выходе (а там как раз методология as is, а не ворох инструментов), вы пользуетесь высокими абстракциями и настолько срастаетесь с ними, что перестаёте воспринимать проблемы "в нижних слоях", ведь у вас "сверху" всё хорошо и красиво. |
Не очень понимаю заботу о конечном коде, если есть верхний слой, где все хорошо и красиво. Браузер отлично справляется с классами. |
На самом деле очень жаль, что есть тезисы, но нет какой-либо разумной аргументации. Таким образом диалог не получится построить.
Вот с языка сняли, сударь. |
По-поводу темы: нет никаких проблем запилить движок, типа BEMHTML, для bem-xjst, который бы отрисовывал шаблоны из имеющихся библиотек (bem-core, bem-components, и других) по нужным вам правилам с атрибутами вместо классов.
Таким образом, вы не будете «в чужой монастырь со своим уставом» ходить, и получите то, что вам нужно. Относительно самого подхода в AMCSS — может быть он и хорош, но цена переезда на него настолько высока, что сообщество не может себе этого позволить. Ну и не надо забывать, что с методологической точки зрения способ размечения БЭМ-сущностей на DOM-нодах не так важен. Важен факт размечения, чтобы рантайм (i-bem.js) мог связать DOM-ноды и БЭМ-сущности между собой, и запустил процесс их инициализации. А будут ли там классы или атрибуты — дело десятое. И стоит ради этого переезжать на атрибуты? Очевидно, что это мартышкин труд, и делать его, даже платно, мало кому захочется. |
Аргументация была проста: #455 (comment) отсюда происходит вся путаница на "пороге вхождения" в БЭМ. Пример наглядный приведён, ссылка есть. Какие аргументы вам ещё нужны?
Забавно, что вы предлагаете вылить на новичка ушат из стека технологий БЭМа, в котором он будет разбираться, чтобы построить простые примеры, дабы попробовать саму методологию на вкус (стоит ли ему её использовать). Новичку будет проще оставить эту затею (верстать по БЭМу).
Собственно это и есть основной ответ. Ну что же, оставайтесь с костылями (по рендерингу в классы HTML/CSS), которые к тому же ещё и плодятся: http://csswizardry.com/2014/05/grouping-related-classes-in-your-markup/ |
Это заблуждение, а не аргумент. И уже был дан ответ: #455 (comment)
Субъективно лучше и не наглядно (я, например, честно пытался и ничего не понял).
Позвольте, если вы, говоря про новичка, имеете ввиду себя, то откуда у вас такое огромное желание со всем спорить? Изучите для начала причины эволюционного пути CSS, BEM, а потом уже предлагайте то, что с вашей точки зрения кажется лучше, и сразу аргументируйте: «Тезис такой-то в таком-то виде не является верным потому что то-то и то-то». Я вот привел ряд ваших заявлений, и они мало того, что не имеют ничего общего с действительностью, так еще и являются набросами на вентилятор. Что вы хотите добиться таким образом? Если всё-таки конструктива, то нужно срочно менять способ ведения дискуссии.
Опять за своё ;-) |
Как же вы не хотите понять, что всех, кто приходит попробовать БЭМ, вы встречаете жуткой одёжкой html-атрибута class?! Понятно, что дальше, если закрыть глаза на эту громаду "имён фэнтезийного короля", то можно дойти и до BEM-XJST и ощутить всю прелесть абстрагирования до уровня блоков. Но до использования стека БЭМ-технологий будет доходить лишь малый процент, и всё только оттого, что ложка БЭМа (BEMCSS) слишком горька, вкусное раздаёте только неделимым целым. |
Себя образца 2012-го года =) Опираясь на те воспоминания, сейчас переживаю за других верстальщиков. Нынче до БЭМа я дорос, но пожалуй пока что буду использовать лишь его методологию. |
Ну я человек не далекий, но если всех это вообще всех, и меня тоже, то это сразу не так. Меня это ни разу не смутило, когда я изучал БЭМ, потому что мне лично монопенисуально каким образом информация о связи сущности попадает в runtime JS в браузере. Кроме того, стили во всём мире принято вешать на классы — это ли не повод писать классы и навешивать на них стили?
Я готов помочь, но не готов делать сам. |
Это вы зря так. Про проблемы с каскадом и т.п. я в курсе, на своей шкуре испытал. |
2016-й год на дворе, CSS3, aria-атрибуты и прочие плюшки для современных браузеров. |
Действительно, 2016 год на дворе, есть Однако БЭМ далеко не только про это. И вот на следующем шаге становится понятно, что разница между записью сущностей в атрибуте Если кто-то пишет разметку руками и использует БЭМ нейминг для обеспечения скоупинга — прекрасно, он может смело использовать AMCSS, хотя HTML в результате будет невалидным, а в CSS-селекторах потребуется чуть больше букв. Если этот кто-то разметку генерирует, то он опять-таки может генерировать ее как ему больше нравится, чуть подкрутив шаблонизатор. Можно генерировать хоть кастомные двух-трехбуквенные теги для каждого сочетания миксов, если уж гнаться за минималистичным кодом на выходе. Только для первых это сэкономит несколько лишних нажатий по клавишам (с учетом автокомплита и амперсандов в пре- и постпроцессорах), а вторым в принципе ничего, т.к. после gzip-а чиселки практически не будут отличаться. Главное, в чем я совершенно убежден — использование классов VS атрибутов крайне слабо связано с порогом входа в БЭМ. |
data-атрибуты вроде как валидны, не?
Подумайте ещё... В строку класса можно навертеть чего угодно, тогда как разделение на class, attribute, attribute value здорово ограничит верстальщика и уменьшит шанс выстрела в ногу. Когда народ костылит в class способы группировки классов при помощи скобок, это уже означает, что то, что вы породили (и что народ старается причесать у себя в своих реализациях БЭМа) нуждается в принципиальном рефакторинге. В данном случае AMCSS предлагает эту группировку это раз. IAMCSS предлагает вешать стили на элементы и ни в коем случае не на блоки, что приводит к более стройным мыслям про неймспейсы и реализации накопленной привычки верстать элементами, а не блоками это два. Элемент (атрибут), он всегда есть, даже в DOM'е, а вот блоки и модификаторы это уже абстракции, и могут отсутствовать (в примере выше такие css-правила присутствуют). Таким образом верстальщику проще перейти с его привычками на БЭМ, и он не будет ваять конструкции типа block1_block2_el1 и block1_el1_el2, и в миксинах будет придерживаться атомарности по классам. Соответственно и с наименованием классов разберётся и первый порог вхождения будет преодолён. Но если вам это совершенно неинтересно, поскольку дорого в реализации, то я вас понимаю... БЭМ останется уделом избранных. |
Я до сих пор не могу понять, зачем сводить обсуждение к угрозам? |
Извините. Видимо принимаю слишком близко к сердцу. |
Да, то так будет не менее громоздко, чем с классами: <div class="block1 block2__elem"> VS <div data-block1 data-block2__elem>
БЭМ на том уровне, когда важно разобраться с неймингом, уже да-а-авно не удел избранных. Это легко проверить. |
Вы почему-то забываете про группировку модификаторов, имена которых вместе с блоками просто очень громадны. И это при том, что ваш пример мы уже разбирали: #455 (comment) |
Я некорректно выразился, извините. А мысль заключается вот в чём: разобравшись с неймингом народ либо переходит к стеку технологий и его всё это наше обсуждение не беспокоит уже по определению (это в основном те, кто в frontend перешёл из js-программистов), либо колется но продолжает есть кактус, выдумывая группировку классов в атрибуте class (это в основном те, кто в frontend пришёл из верстальщиков), либо разобравшись они (верстальщики) разворачиваются и уходят (на bootstrap и прочие свои велосипеды). В данном случае "избранные" это те, кто готов терпеть "фэнтезийные имена" или кому на них пофиг. |
Вот такая разница на несколько вырожденном примере точно того стоит? <div data-my-component="type_normal size_l theme_islands" data-some-other-component__elem1 data-yet-another-component__elem1 yet-another-component__elem2="size_l theme_cool hovered"></div> VS <div class="my-component my-component_type_normal my-component_size_l my-component_theme_islands some-other-component__elem1 yet-another-component__elem1 yet-another-component__elem2 yet-another-component__elem2_size_l yet-another-component__elem2_theme_cool yet-another-component__elem2_hovered"> Ну и за это придется заплатить тем, что вместо .my-component {
&_type_normal {}
&_size_l {}
&_theme_islands {}
}
.some-other-component__elem1 {}
.yet-another-component {
&__elem1 {}
&__elem2 {
&_size_l {}
&_theme_cool {}
&_hovered {}
}
} Потребуется либо явно писать [data-my-component~="type_normal"] {}
[data-my-component~="size_l"] {}
[data-my-component~="theme_islands"] {}
[data-some-other-component__elem1] {}
[data-yet-another-component__elem1] {}
[yet-another-component__elem2~="size_l"] {}
[yet-another-component__elem2~="theme_cool"] {}
[yet-another-component__elem2~="hovered"] {} либо сочинять какой-то свой инструментарий. |
Зачем вы меня грузите проблемами реализации BEM-tools? ;) |
Звучит примерно как «не хотят разбираться с паттернами проектирования и уходят на Wordpress и прочие свои велосипеды». Да, действительно, подход к разработке (скажем, ООП) предполагает разработку, а не только использование готовых библиотек. Если кому-то сейчас хватает кнопочек из Бутстрапа, значит, он столкнется с потребностью в чем-то более универсальном на следующем проекте.
Я же уже писал выше, что |
Сорри, в пылу жаркого разговора не распознал сразу. Без использования препроцессоров нынче действительно никуда. Это всё же проигрышная позиция отстаивать удобство вхождения в БЭМ вёрстку на уровне порога "байт-кода" (просмотра исходного кода страниц на сайтах внедривших БЭМ, и прочих примеров, там ведь не препроцессорный код). В этом смысле я не верю, что входящий в БЭМ сразу пишет такой препроцессорный код, но это, возможно, моё заблуждение. |
в IAMCSS чуть по другому |
И вот когда такое счастье оказалось на одном DOM-узле, как из JS определить, что |
А какую практическую задачу вы решаете? Зачем вам нужно определять принадлежность атрибутов к конкретному блоку/интерфейсу? Инициализируете абстракцию блока автоматически и собираете до кучи все его свойства, вдруг пригодятся? Ваш вопрос и мой ответ напоминает анекдот про пьяного мужа вернувшегося домой поздно - "... ты же умная, придумай что-нибудь сама" =) В JS структуру блока вы например можете декларировать JSON'ом, и никто не запретит вам использовать одни и те же атрибуты для разных интерфейсов (активно пользуетесь mixin'ами - значит понимаете что делаете). Проведите аналогию с множественным наследованием. На Яндекс субботнике 2012-го года https://events.yandex.ru/lib/talks/327/ на 18-й минуте я задавал вопрос про то, как вы определяете иерархию родительских блоков, и был дан ответ, что в BEMе для этого используется декларативный конфиг. Не сомневаюсь, что и здесь для каждого блока информацию об используемых им атрибутах вы можете подобным образом задекларировать. |
Ага, удобно будет ;) |
Не пойму вас. Сарказм? Вы придираетесь только к количеству символов, я же помимо этого пытаюсь донести мысль о том, что по IAMCSS, (который в данном случае лишь нижний порог вхождения или "байт-код") чёткая связь блока как нэймспейса чьё имя декларируется в атрибуте class (и повторяется для каждого элемента блока), элемент блока как пользовательский data-атрибут и модификатор как значение этого data-атрибута, упорядочит решения о том, как должен называться вложенный блок, где ставить модификатор к блоку или к элементу и т. п. Что даст возможность новичку легче переступить первый порог вхождения: bem-site/bem-forum-content-ru#1090 (comment) |
@viT-1 Прочитал весь топик... Всё крутится "за" и "против". Я тоже был новичком и тоже использовал разные подходы, чтобы облегчить жизнь. Теперь мои аргументы на зацепившие меня высказывания.
А минификацией JS или CSS ты занимаешься (с BEM или без BEM, без разницы)? Хоть раз ты правил эти файлы? Там вопросов не возникает. Ты знаешь, что ты написал. И тебе по-барабану как оно дальше выглядит. Надо что-то править - правят исходники. По поводу примеров с IAMCSS - они ужасны, прошу прощения за резкость. Когда я начинал знакомство с BEM использовал следующую нотацию в HTML <div class="block --mod--val --mod2--val"> в CSS .block.--mod--val {}
.block.--mod2--val {} дабы избегать длинных классов. Не помню как такая нотация называется (shorts syntax BEM или как-то иначе), не я её выдумал. но в конечном итоге перешёл на классический BEM. До изучения BEMВыбор делал между несколькими методологиями
Все они (кроме BEM) вносили путаницу в мою голову о реализации, о том как нужно писать CSS. На то, чтобы начать писать (а не пробовать) CSS и HTML по BEM у меня ушло около недели. И с того времени я больше ничего не использую, т.к. BEM решил мои проблемы на ~95%. Я был 0 в BEM и смог его использовать уже через неделю (или меньше, точно не помню). После изучения BEMЯ писал простые классы (состоящие из 1-4 селекторов). Ответ получился длинный, но думаю содержательный. П.Н. BEM вертят как хотят, но есть хорошая база (платформа). Нужно просто показать как эту базу внедрять в проекты и ВСЁ. |
На всякий случай оставлю это здесь: |
Я бы не утверждал, что там до этого был БЭМ ;) * {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
body {
text-align: center;
margin: 0;
padding: 0;
}
a img {
border-style: none;
display: inline-block;
}
menu
, menu li {
list-style: none;
display: block;
margin: 0;
padding: 0;
}
ul
, ol {
margin: 0;
padding: 0 0 1em 15px;
} |
Это что-то типа reset.css, странно что вы к этому придрались, наверное кроме БЭМа уже всё позабыли или даже и не знали. Код касающийся БЭМа указан в ревизиях (см. изменения). Сразу буду переводить на IAMCSS. Внедряю его и это отделение класса iBlock таким образом, что прямо на него нельзя вешать селекторы мне очень нравится! Плюс необязательно заводить свои элементы/атрибуты, в некоторых случаях можно воспользоваться и существующими (как в iAnchor). |
Ещё нравится то, по IAMCSS нету модификаторов блока типа iBlock-mod, поскольку модификатор по сути относится к элементу, а не блоку. Например viT-1/larinayoga@83e8f82 |
При переводе на IAMCSS обнаружил баг IE8: сложные селекторы перечисленные через запятую он не обрабатывает! (base.css viT-1/larinayoga@265c7dd#diff-7e524e0d055c017b2f549b72c2e87879) CSS-минимайзеры могут сыграть злую шутку. |
@belozyorcev А вам отвечу, что решение из коробки это всегда удобно. В контексте же данного топика идёт речь в том числе и о том, чтобы БЭМ'овцы смогли увидеть развитие своей методологии (следующую версию коробки для вас): вместо мешанины блок-элемент с нэймспейсом, строже отделяли неймспейс и фокусировались на элементе с модификатором (чему и следует IAMCSS). |
А вы пробовали для своей методологии воспользоваться AMCSS?
Например в таком виде: .block[elem_='mod'] и .block[mixelem_='mod']
The text was updated successfully, but these errors were encountered: