Pull to refresh

Comments 74

вообще чаще всего начинается такое не тогда, когда БЭМ плохо применим, а когда дизайн «кто в лес кто по дрова».

откуда берутся нестандартные отступы? От неконсистентного дизайна, и пискель-перфекта без права настучать дизайнеру по голове чтоб сам следовал своим отступам.
Иногда бывают задачи сделать пачку сайтов, абсолютно идентичных функционально, вплоть до общего бэкенда, но разные по дизайну.
Разные семантически или только косметически-визуально?

Если это разные лендинги — так для них одноразовое наговнякивание штучной CSSки идеальный вариант.
Если это разные стилизации под разные особенности — специфические CSS модификаторы протянутые через один глобальный класс на body.

Если же они семантически разные совсем, то не факт что общий бэкенд (если только он не глупый сырой API) справится без костылей, то есть это по сути разные сайты, где реюз не всегда возможен — и только создаёт мощные стяжки из спагетти.
А в чем, собственно, проблема? Если вы возьмете готовые популярные движки типа wordpress то там как правило уже свои шаблонизаторы т.е функции которые вставляются в любую разметку. Более того, дочерние темы перекрыващие родительские функции по вкусу.

У вас задача слышится скорее так: Как можно меньше сделать но чтобы визуально было так, как-будто бы пахали разные команды.
В этом случае не вижу проблем больших при переопределении css, брать копию scss файлов в новый дизайн и не изменяя его структуры долбить параметры. Правда придется отслеживанием новых изменений родительской темы самостоятельно. Все еще зависит от того, на сколько считается дизайн сайта переделанным «достаточно»
А в чем, собственно, проблема? Если вы возьмете готовые популярные движки типа wordpress то там как правило уже свои шаблонизаторы т.е функции которые вставляются в любую разметку. Более того, дочерние темы перекрыващие родительские функции по вкусу.
В этом собственно и проблема. Шаблон должен быть шаблоном, а стили стилями. И этого не должно быть «где-то там в функции», или что еще хуже в «админке» с помощью какого-нибудь плагина, и хранится все это в базе данных. Ну и на конец, если брать конкретно wp, то на нем не надо делать что-либо сложнее личного блога…
Шаблон должен быть шаблоном, а стили стилями.
А что по вашему входит в понятие «шаблон»? Набор дивов с перемеными, оформление которые запрещено менять кроме как через css? Если задача стоит только перекраска кнопочек да разный радиус уголков, то вопросов конечно нет.

если брать конкретно wp, то на нем не надо делать что-либо сложнее личного блога…

У wp самая развитая система темизации. Ей позавидовать можно. Возможность модифицировать REST API через файлы темы. Или модифицировать саму админку. Админка переходит на реакт. плагины под wp перестают писаться в ноутпадах без знания современного js. На нем как-то работает css-tricks.com
wp сам устал от своего legacy, поэтому разрабы дружно ударились во фронтенд.
А что по вашему входит в понятие «шаблон»? Набор дивов с перемеными, оформление которые запрещено менять кроме как через css? Если задача стоит только перекраска кнопочек да разный радиус уголков, то вопросов конечно нет.
На мой взгляд, пользователь совсем не должен в эти вещи лезть. Хотят конструктор, пусть идут на тильду. Когда из wp делают конструктор, то это получается дикий ад для разработчика. Так что да, для меня шаблон это вьюха с разметкой, и стили в css файле. А логика должна быть там, где ей положено быть — в контроллерах
У wp самая развитая система темизации. Возможность модифицировать REST API через файлы темы. Админка переходит на реакт. плагины под wp перестают писаться в ноутпадах без знания современного js. На нем как-то работает css-tricks.com
только потому что у wp удобная админка, или привычная. В СНГ по этой причине все хотят битрикс. На css-triks wp наверное уже больше как фронтенд работает…
ду. Когда из wp делают конструктор, то это получается дикий ад для разработчика.

это увы коммерция. Они последние 5 лет пилили возможности, чтобы купив тему у тебя открывалась эта самая тильда по настройке приобретенной темы. Мне тоже это было чуждо, но они работали конткретно на спрос, отказать в этом тут (удовлетворении спроса) им сложно.

А логика должна быть там, где ей положено быть — в контроллерах

Это спорно, когда вопрос касается cms. В cms логика лежит в ядре. (Ядро у wp мягко сказать с запашком.) Поэтому логика в файлах темы не такая уж прямо офигеть какая важная. Более значительный функционал для сайта оформляется виде плагина, так как независимо от смены темы должен оставаться. Но да, хотелось бы более серьезноо подхода чем куча хуков. Однако, имеем что имеем.
только потому что у wp удобная админка, или привычная.

Они сделали реклактор как у medium. Мне не знакомы никакие продукты, которые столько сил вкладывают в админку. Для меня у wp абстракция от говноядра достаточная, при работе с которым особо не пачкаешься. Бесит дико только у wp работа с ресайзами изображений. Но у учиться у wp другим есть чему.
это увы коммерция. Они последние 5 лет пилили возможности, чтобы купив тему у тебя открывалась эта самая тильда по настройке приобретенной темы. Мне тоже это было чуждо, но они работали конткретно на спрос, отказать в этом тут (удовлетворении спроса) им сложно.
Я не против конструкторов. Но если его делать, то делать отлично, а не как плагины для wp. Но если будет конструктор из wp, то зачем сам wp? и возвращаемся к тому, что есть тильда, юкоз, и прочее, которые в этом плане обошло плагины для wp на порядки
Они сделали реклактор как у medium. Мне не знакомы никакие продукты, которые столько сил вкладывают в админку. Для меня у wp абстракция от говноядра достаточная, при работе с которым особо не пачкаешься. Бесит дико только у wp работа с ресайзами изображений. Но у учиться у wp другим есть чему.
Мне у wp только визивиг-редактор нравится. Работа со структурой не понравилась, но это мое мнение. Но сути не меняет, на крупных проектах wp берут только ради админки, а дальше скрещивают с чем угодно. Лично наблюдал прикрученный blade от ларавеля в wp, и скажу что с таким «покемоном» было намного удобней работать, нежели в его чистом виде.

Ну и я останусь при своем мнении. Пользователь не должен иметь доступ редактированию файлов шаблона, никогда, ни при каких условиях, в любой системе. А в админке должно быть ровно то, что задумывалось разработчиками. Не должно быть разметки в редакторах, и прочего. Но все это попахивает фантастикой…
то зачем сам wp?

Я имел ввиду, что продаются темы, которые позволяют настраивать сами себя как tilda. Это не плагины, а функционал ядра который позволяет продавцам тем встраивать в свои темы редактор. Тут можно визуально поменять бекграунд или выбрать из коллекции. Поменять размер и цвет шрифта и т.п именно так как это заложил разраб темы. Я это не люблю так как я не продаван тем, а люди большие бабки делают на этом…
Работа со структурой не понравилась, но это мое мнение.

Ну она по своему чокнутая.
developer.wordpress.org/files/2014/10/Screenshot-2019-01-23-00.20.04.png
Но ведь именно его структура — посты(кастомные типы постов), а дальше связи между ними (теги, или теже теги с боку — категории) по сути и родят эту структуру. Это же не фреймворк. Но по этой жесткой структуре оазывается может лечь дофига чего.
было намного удобней работать, нежели в его чистом виде.

wordpress.org/plugins/blade
разве это не гибкость ядра, который может плагином запулить блейд?)
Ну по факту многие не понимают чем шаблонизатор лучше обычного php который сам шаблонизатор. Вобщем, не суть. У wp есть своя терминология не плохая и не хорошая, просто своя.

Пользователь не должен иметь доступ редактированию файлов шаблона, никогда, ни при каких условиях, в любой системе.

ну я и не утверждал этого. Можно в аминке отключить доступ к редактированию шаблонов. И будет все как говорите у wp если этого не захочет разраб.

define( 'DISALLOW_FILE_EDIT', true );

Не получается перекрывать стили в БЭМ? Ну БЭМ тут не причем.

Мыши плакали, кололись, но продолжали грызть кактус. Сами загоняете себя в рамки, а когда становится в них тесно, пытаетесь выкрасить другой краской, вместо того, чтобы подумать о том как сделать то же но на чистом css

БЭМ — это и есть чистый цсс. Если вы уверены в другом, то вас кто-то обманул.
БЭМ — это CSS без каскада — я бы не сказал, что отказавшись от главного, ради чего создавался CSS — Cascading Style Sheets, это можно было бы называть чистым CSS :D
Вы, как и многие, путаете понятия каскада и вложенных селекторов.
Каскад — это свод правил, по которым определяется конечный стиль элемента.
В БЭМ существует понятие уровней (или слоёв) переопределения, когда стили меняются или дополняются.
Таким образом БЭМ не отказывается «от главного, ради чего создавался CSS». С каскадом там всё в порядке.
Вы, как и многие, путаете понятия каскада и вложенных селекторов.
Rly? Я понимаю под каскадом это, вложенные селекторы — это наследование, которое является одним из важнейших методов для определения стиля конечного элемента в CSS и не смотря на то, что кроме него есть еще методы, участвующие в каскаде, наследование является основой каскадирования в CSS. Жду от Вас разъяснений, где я ошибаюсь.
В БЭМ существует понятие уровней
Существует, но это — не CSS-каскад.
С каскадом там всё в порядке.
Использование CSS-каскада в БЭМ противоречит главному в этой методологии — полной независимости и отсутствия конфликтов в пространстве имен.

Но речь, естественно, шла про CSS-каскад (масло-масляное), использование в БЭМ модификаторов и примесей вполне возможно, но ничего общего с каскадом CSS оно не имеет.

Давай-те, чтобы говорить предметно, Вы приведете пример использования именно CSS-каскада в БЭМ, и чтобы это не противоречило правилам БЭМ?

Еще раз — если под каскадом понимать свод правил, по которому определяется стиль элемента — то, да — можно сказать, что в БЭМ есть каскад, но это БЭМ-каскад, сильно отличающийся от CSS-каскада именно своим сводом правил.
Окей, каскад мы с вами понимаем одинаково. Я видимо неправильно интерпретировал вас изначально.

Но почему уровни переопределения — это не использование каскада?
Возьмите, чтобы далеко не ходить, пример из документации по БЭМу с кнопкой.
Вначале стиль определен на уровне библиотеки, потом он доопределен/переопределен на уровне блоков проекта. Таким образом у кнопки есть два стиля, по правилам каскадирования браузер применит нужный. Что это, если не каскад?
Я сразу не заметил, или вы дописали последний абзац. Придется ответить на него, иначе в моем первом предложение возникает неточность =)

Еще раз — если под каскадом понимать свод правил

Это нужно понимать не «если», а именно так.

Приведу цитату с MDN:
The cascade is a fundamental feature of CSS. It is an algorithm defining how to combine properties values originating from different sources. It lies at the core of CSS as stressed by its name: Cascading Style Sheets.


CSS создавался не ради каскада, а ради описания стилей элементов на странице, где каскад — один из вариантов реализации этого описания.

Это все равно что утверждать, что ООП-языки создавались ради классов, а не программ, которые на них были написаны.

А БЭМ — это другой вариант реазлиции описания стилей на странице. И если вспомнить когда создавался CSS, то вполне очевидно, что он может не удовлетворять современным требованиям.
UFO just landed and posted this here
А как указанные в статье проблемы решаются на «чистом» css? Например, переиспользуемость кода?

*Спойлер*. Никак. Хотя многие характерны и для css.

БЭМ — отличная вещь, которая добавляет, как минимум, компонентность и инкапсуляцию. И при использовании методологии, плюсов больше, чем минусов разработки на «чистом» css.

А, как вы выразились, рамки — они необходимы. Паттерны проетирования, фреймворки, методологии — это все рамки и призваны они структурировать код, абстрагируясь на определенном уровне, где цель — написать код, который ты и другие разработчики смогут понять сейчас и успешно поддерживать в дальнейшем.
UFO just landed and posted this here
Я со временем пришел к модели ЭБМ. Мне так удобнее. Я требую, чтобы все элементы просто размещенные на странице сразу выглядели в стиле сайта. Если требуется особое поведение элемента, то этим должен заниматься его блок и более верхний блок в иерархии. Ну и последний уровень — ручные модификаторы. Таким образом я могу доверстывать к сайту любые новые страницы практически не меняя css.
Я требую, чтобы все элементы просто размещенные на странице сразу выглядели в стиле сайта.

А можно пример противоположный?
Элемент, брошенный на странице сайта выглядит дефолтно, если он не обрамлен в какой-то задизайненный уже блок.
Кто и по какой причине в качестве основного символа именования классов предложил нижнее подчёркивание? Ну это же просто жуть как неудобно. Кол-во дефисов считывается глазом на автомате. Чтобы написать нужное кол-во нижних подчёркиваний — мне придётся постоянно копипастить такие элементарные куски кода.

Ну а по поводу БЭМ в целом, скажу что тут основная проблема не в работе фронтэндера, а в работе дизайнера. Надо чтобы дизайнер соответствовал предлагаемой методологии. Чтобы он проектировал свои интерфейсы отталкиваясь от этой концепции переиспользования блоков.
Яндексу хорошо — у них дизайнеры интерфейсов по сути и есть разработчики. Когда всё делается по единому условному брэндбуку. Вот им и кажется что это панацея.
В обычной жизни вы столкнётесь с кучей однотипных блоков, одни из которых будут идентичны, другие будут отличаться цветом, третьи внутренней разметкой и т.д.
Чтобы применять этот подход — надо кучу времени потратить просто на анализ макета. Анализируя и вычленяя переиспользуемые свойства. Но извините, при таком кропотливом анализе любой подход к вёрстке будет одинаково эффективен.
Ну не взлетает БЭМ на разовых проектах.
у Николаса Галлахера был подход, где он заменил _ на — и выглядит вполне сносно, пока стили не начинают расти и ты такой:
.my-awesome-new-component_element

Ой, но ведь я не пользуюсь нижним подчеркиванием
.my-awesome-new-component-element // не то
.myAwesomeNewComponent-element // и вот тут ты понимаешь, что что-то пошло не так
А что не так? Сепараторы между блоками / элементами / модификаторами могут быть любые, пока можно программно определить, что есть что в переданной строке.
ИМХО, но все несколько проще чем кажется. Хотя тоже не идеально.
Пришел к следующей схеме:
Разделяем все наши поделки на две категории компоненты и представления.
— Компонент (кнопки, инпуты, тул/таб-бары и т.д.) — часто мигрирует из проекта в проект, часто меняются стили.
— Представление (реализации форм, сайдбаров и т.д.) — нужны только в конкретном проекте.
Для первых SMACSS или его подобие. Для вторых БЭМ. Полгода. Полет нормальный.
ЗЫ: Не знаю как это зайдет для сайтов ибо занимаюсь SPA.
1. «Одноразовый блок» вообще не стоит считать блоком. Это элемент вышестоящего блока. Если у вас форма действительно намертво связана со страницей и вы понимаете, что она не повторится нигде, то перед вами не столько .form, сколько .mypage__form. А вот блоки, ее составляющие (кнопки, инпуты, лейблы) свободно переиспользуются. Да, там может появиться каскад, но если ваш псевдоблок действительно одноразовый, то каскад в нем не может создать проблем.

.input {}
.my-page__form .input { /* margin, position, width, ... */ }
.my-another-page__form .input { /* margin, position, width, ... */ }


2. Само возникновение «одноразовых блоков» может быть следствием сырого дизайна, как выше справедливо заметили. То же самое, если часто возникает потребность в чисто декоративных модификаторах. На практике они по большей части функциональные, связанные с состояниями (_disabled, _collapsed, _invalid — такого плана). И как следствие, по большей части булевы. Если у вас много модификаторов вида «_ключ_значение», то есть смысл еще раз подумать над всей дизайн-системой, почти наверняка там не всё хорошо.

3. Глобальные модификации стилей (темы проектов и т.п.) вводятся через уровни переопределения на этапе сборки. Если вам нужно просто стилизовать несколько похожих проектов, не надо вводить модификаторы под каждую тему) Грубо говоря, у вас есть папка «чистых» комопонентов, где зашиты общие свойства для всех проектов, и есть папки с отдельной стилизацией для каждого проекта. При сборке конкретного проекта вы берете чистый компонент и приклеиваете к нему свойства из файлов именно этого проекта.

/* ../base/button.css */
.button {display: block; cursor: pointer; ...}
/* ../project-red/button.css */
.button {background: red; ...}
/* ../project-blue/button.css */
.button {background: blue; ...}


Никаких модификаторов тут не требуется. Индивидуальные стили проектов не надо хранить в общих компонентах. Иначе вам при 100 проектах пришлось бы в каждом блоке таскать с собой 100 модификаторов, из которых 99 не используются в текущем дизайне. Дело тут не БЭМ, а в архитектуре проектов и сборке.

Модификаторы хороши в том случае, если у вас внутри текущего проекта есть одновременно, например, несколько разновидностей кнопок. Скажем, иконические и без иконок. Или синие для безопасных действий и красные для опасных. Вот тогда у вас могут появляться модификаторы: button_iconic, button_safe,… и т.д. Это имеет смысл, потому что они нужны все сразу в текущем проекте.

P.S. Не то чтобы я был адвокатом или ярым фанатом БЭМ, но по факту 99% постов о «проблемах БЭМ» (в контексте именования и CSS) в итоге сводятся к тому, что автор упускает какой-то нюанс или не в полной мере понимает какую-то часть методологии. Поэтому, если возникает желание сделать свой особый БЭМ с преферансом и одалисками, то с очень большой долей вероятности что-то делаете не так.
автор упускает какой-то нюанс или не в полной мере понимает какую-то часть методологии

звучит как классика продаж всех методологий.
Подскажите, пожалуйста, как сделать следующее:
— Вам нужно написать мегауниверсальную кнопку состояшую из иконки, текста и метки (кол-во страниц, например).
— Иконка может быть слева/справа/вверху/внизу/нигде (наверно, модификатором придется делать).
— Метка тоже может быть слева/справа/вверху/внизу/нигде.
А завтра нужно будет написать элемент меню, который обладает теми же возможностями, но с другими стилями и дропдаун, в который нужно добавить стрелку которая тоже может находится слева/справа/вверху/внизу/нигде, да еще е поворачиваться на 90/180/270 градусов. Что делать блоком, что элементом и что писать в class?
На мой взгляд, попытка создать «мегауниверсальную» кнопку с тысячей возможных вариаций — это и есть фундаментальная ошибка. Фактически, мы пробуем затолкать в один блок несколько десятков кнопок совершенно разного вида. Здесь автоматом должны возникнуть два вопроса:

1. А нужны ли реально в проекте десять вариаций кнопки, не затрагивающих ее функциональные возможности? Нельзя ли как-то унифицировать?

2. Действительно ли всё это именно кнопки? Возможно, танцы с иконками и метками намекают, что больше подошли бы другие контролы: свитчеры, селекты и т.п. Возможно, метке вообще не место на кнопке? Возможно, ее нужно вынести в лейбл?… (Просто общую логику дизайнера иллюстрирую).

В рамках компонентной дизайн-системы нельзя из прихоти взять и переместить иконку одной из кнопок с левой стороны на правую, а у остальных оставить слева. Для этого должны быть какие-то рациональные причины. И когда эти причины начинаешь анализировать, зачастую оказывается, что нужно не иконку двигать, а менять компоновку интерфейса или использовать какие-то другие элементы управления.

По крайней мере, мне пока не доводилось сталкиваться с реальной потребностью в таких мегауниверсальных кнопках. Если это существующий проект, с интересом взглянул бы на макеты.

К слову, на хабре попадались хорошие статьи, раскрывающие суть проблемы. Например.

Плюсую. Сам проходил стадию, когда хочется делать мега-универсальные блоки, с многократным запасом возможностей по сравнению с реальными нуждами. Они обрастали тучей элементов и модифкаторов, но большая часть комбинаций никогда не использовалась. Нужно стараться находить золотую середину между гибкостью и простотой.
Вопрос был в большей степени риторический, дающий понять, что использовать БЭМ не всегда оправдано.

На мой взгляд, попытка создать «мегауниверсальную» кнопку с тысячей возможных вариаций

Так-то ничего мегауниверсального кроме названия в ней нет, всего-то иконка + текст + метка. Неужели вместо одной кнопки нужно сделать пяток разных, а потом каждую из них отдельно стилизовать (они же только положением иконки/метки отличаются)?

А нужны ли реально в проекте десять вариаций кнопки

А ситуации разные бывают. В пределах одного проекта скорее всего не нужны, но если вы хотите шарить библиотеку компонентов между проектами, да ешё эти проекты — энтерпраиз, в котором очень хорошо себя чувствуют Delfi-like подходы к построению интерфейсов, да еще они для разных заказчиков, тогда универсальность позволяет значительно сократить кол-во писанины.

Возможно, танцы с иконками и метками намекают, что больше подошли бы другие контролы: свитчеры, селекты и т.п.

Похоже на попытку подогнать задачу под методологию.
Если это возможно — не вопрос, но обычно правила диктует заказчик.

Если это существующий проект, с интересом взглянул бы на макеты.

На самом деле проекты с таким интерфейсом вы видели и скорее всего даже используете.
MS Office - Ribbon UI
image
Только в ленте огромное кол-во разнообразных кнопок. Можно конечно посчитать все вариации кнопок в приложении, но лучше не рисковать ибо вывалившиеся из орбит глаза трудно вставляются обратно :)

И это мы еще не коснулись второй части моего вопроса про MenuItem и Dropdown. С переопределение стилей вложенных элементов всё очень плохо.

Вообще всю эту писанину можно сократить до простой фразы: «БЭМ и универсальность — понятия не очень сочетаемые».

ИМХО, конечно же (ничего себе насловоблудил).
Товарищ минусатор, напиши, пожалуйста, свое экспертное мнение, мне было бы интересно его узнать.

Блин, не помню точно как называется подход, но смысл такой же как у Вас, но более логичен и менее монструозен:


  1. Блоки состоят из 2 слов, называются как в БЭМ: block_name
  2. Элементы называются всегда в 1 слово: element
  3. Модификаторы выглядят как -modifer
  4. Как было сказано "page блоки" называются как l-layout_element
  5. утилитарные настройки вроде названия темы пишутся как u-utilitary

ps Если кто-то напомнит как назывался этот стандарт, то будет вообще круто)

Что-то похожее есть в rscss:

  1. Компоненты в 2 слова: component-name
  2. Элементы в 1 слово: element
  3. Варианты того и другого начинаются с дефиса: -variant
  4. Утилиты — с подчеркивания: _helper

Если все дробить на небольшие компоненты, то получается весьма приятно в использовании.
<header class="section-header section-header_margin_select-sector">
        <h2 class="section-header__title font font_face_calibri-bold section-header__title_size_select-sectors">

Конечно, будет плохая читабельность, если так накручивать и переусложнять имена классов.
И что это за font_face_calibri-bold — это попытка скрестить БЭМ с атомарным CSS? Не надо так делать.
И последнее: настоятельно рекомендую использовать два дефиса для отделения модификатора — читаемость улучшается кардинально, потому что бОльшую ширину отступа глаз выхватывает легче, чем разницу между '-' и '_'.

И если переписать фрагмент примерно так:
<header class="section-header section-header--margin-large">
        <h2 class="section-header__title text-style--h2">
Всё выглядит гораздо приятнее.
font_face_calibri-bold дает возможность использовать шрифт calibri жирного начертания. Как можно сделать лучше и почему это плохо?
Тем, что это несемантично. И дело тут не в какой-то абстрактной семантической теории, вопрос абсолютно практический. Сегодня у вас все заголовки набраны жирным Калибри. Завтра приходит дизайнер или заказчик и говорит — мне что-то не нравится, хочу изменить шрифт заголовков на %font-name% (ситуация ни разу не гипотетическая, всё из жизни).
Вы будете ползать по 30 страницам переименовывать класс? Ну ок, у вас есть условный WebStorm, который будет ползать за вас, но зачем решать проблему, если ее можно просто не создавать.
Что вы можете сказать о таких проектах — это плохо или хорошо?
Я не знаю. Я походил по репозиторию и не уловил какой-то конкретной концепции. А документация в проекте отсутствует, к сожалению. Ну ок, набор каких-то кирпичей. Но почему они именно такие, зачем, какова архитектура, какую задачу хотел решить автор?..
Возможно, задумка автора и хороша, но без описания её трудно понять, не тратя на изучение много времени.

Если разбирать пример автора статьи, то вместо придумывания осмысленного названия класса (семантического), конструирование конечного вида элемента перенесли в CSS классы (признак — наличие font_face_calibri-bold ничем не лучше держать стили в атрибуте style). Если по названиям CSS классов понятно как выглядит элемент (шрифт, размер, цвет, отступы, и подобные...), то это означает, что название выбрано не правильно, да и сам человек не понимает что такое семантика. Личное мнение, что лучше использовать SCSS @include для копирования стилей в нужный блок. В осмысленно названных (семантических) селекторах гораздо проще ориентироваться, например section-header--primary, section-header--secondary, section-header--subheader.

Личное мнение, что лучше использовать SCSS include для копирования стилей в нужный блок.
Да, в большинстве случаев лучше именно так и поступать. Но классы-утилиты всё равно иметь приходится, иногда они тоже нужны.
.payments-header--primary {
    @include section-header;
    @include margin-bottom-large;
}

Например есть .section-header--primary (general class) и специфичное контексту место .payments-header--primary, где добавлен дополнительный отступ, добавленный миксиной (в целях демонстрации ничего не сокращал). Мое личное мнение, что классы не могут создаваться и болтаться без контекста — это происходит из-за спешки или не понимания предметной области (или не желания в ней разбираться).


Если понадобится сменить отступ или поправить стили заголовку — редактированию будет подвержен только SCSS файл. В случае с утилитарными классами изменения отвечающие за внешний вид будут применены к шаблону и очень вероятно к SCSS файлу, что повышает вероятность возникновения конфликта (зона ответственности backend-focused разработчика может быть backend, "frontend шаблон", а frontend-focused "frontend шаблон" и scss. Снесение всего, что отвечает за стилизацию (раскрашивание элементов) в одно место — может снизить вероятность, что оба разработчика будут править одину и ту же строку шаблона.

Не, утилитарных классов типа .section-header конечно же быть не должно. Шапка секции это вполне самостоятельная сущность, чтобы болтаться не пойми как.
Утилитарные классы обычно нужны для добавления от одного до нескольких простых свойств — шрифт, или цвет, или отступ.

Классический (для меня) пример: это стили заголовков — шрифт, кегль, интерлиньяж, трекинг. Делаются утилитарные классы-миксины, которые потом подмешиваются куда нужно — например, шрифт в тайтле (но не блок хедера в целом!) этого блочка должен выглядеть как h3. Но иногда эти классы могут использоваться и самостоятельно.

Еще случай — утилитарный класс, инвертирующий блок. Меняющий фон на темный, текст на светлый и тд. Что он делает? На самом деле он просто меняет значения нескольких css-переменных. Разумеется, это решение работает не в любом контексте.

Нормальный дизайн, переиспользуемые классы:


<form class="form">
    <h2 class="form__title text--left">Some title</h2>
    <textarea class="form__input" placeholder="Some placeholder"></textarea>
    <button type="submit" class="form__submit float--right">Some action</button>
</form>

Я не вижу проблем в вёрстке формы представленной выше, у вас разве на всех страницах кнопка разная? На одной маленькая зелёная, на другой синяя огромная, на третьей… Разве что модификаторы вроде float--right, без них не куда. Не понял а почему отступ от заголовка больше чем от поля ввода? Кто дизайн делал? Надо ещё с дизайнером пообщаться, дабы вёрстка была красивее.

Откуда у вас появился text--left (модификатор) без элемента или блока, что за бред.
как и float--right, видимо это утилиты, аля «это мой бутстрап, бейби» с ними жесть начинается при адаптиве)
В бутстрапе не плохо это реализовано там 100500 классов для каждого брекпоинта
100500 классов для утилит это и есть ад
Имхо, дело привычки. Мне вот удобно
ок,
<h2 class="form__title text text--left">Some title</h2>
теперь это трушный бем
Вопрос к автору. У вас на превью-картинке кусок кода с десятками тегов … вы это так серьёзно подключаете стили? Или сделали специально для статьи?
В dev-версии страницы стили подключаются именно так, при сборке все, конечно, скомпонуется в один файл. Вас не устраивает, то что, это не автоматизировано через gulp/grunt?
И как по ощущениям, оправдывает себя политика выноса всего (вплоть до модификаторов) в отдельные файлы?
Как по мне, это адская дробность. У меня большинство таких файлов содержали бы всего несколько строк кода. Имхо, правило «1 блок == 1 файл» это хороший компромисс между объемом файла и их количеством. Но правда, я стараюсь делать декомпозицию блоков насколько это возможно в рамках здравого смысла.
С официального сайта БЭМ «Код модификаторов и элементов также хранится в отдельных файлах блока. Такой подход позволяет подключать только те модификаторы и элементы, которые необходимы для данной реализации блока». Я всего лишь следую методологии. Но вообще, мне это тоже не нравиться, плодить десятки файлов. Хотя теоретически это полезно.
В отдельные файлы можно выносить не все элементы/модификаторы, а только то, что опционально. Или вообще ничего не выносить и писать всё в одном файле. Это не противоречит методологии.
Ужасный подход. Гораздо правильнее это сделать в scss и использовать sourcemaps.
Что значит «правильнее»? Можно по существу, конкретные плюсы по сравнению с компоновкой через gulp? Семантичнее через препроцессор? Может быть
Ужасный подход. Гораздо правильнее это сделать в scss и использовать sourcemaps.
А чем правильней-то? Тем что вам так больше нравится? Какая вообще разница что происходит в dev-версии если это всех устраивает?
Первый пункт.
Как вам такой вариант:
<form class="form">
  <div class="form__title"
    <h2 class="subtitle">Some title</h2>
  </div>
  <div class="form__elem">
    <textarea class="textarea"></textarea>
  </div>
  <div class="form__elem">
    <button class="button"></button>
  </div>
</form>

Есть блок form со своими элементами, которым мы задаем отступы. Внутри каждого элемента можно расположить любые другие блоки, но можно и замиксовать, это допустимо документацией, просто я так стараюсь не делать.

Пункт второй.
Длинные имена классов !== большое количество классов. А большое количество классов зачастую получается при попытке использования атомарного CSS. Лично мне, как правило, достаточно трех классов: собственно сам класс, модификатор (если нужен), класс — селектор для JS (опять же, если нужен). Если необходимо несколько модификаторов, то следует изучить возможность объединения всех необходимых в один новый.

Третий пункт для меня не понятен.
БЭМ — это методология, позволяющая использовать CSS/HTML/JS много раз

а SSI не позволял этого делать?

> П.1 Слой модулей и слой страницы

Сделайте уровень переопределения (https://ru.bem.info/methodology/key-concepts/#Уровень-переопределения) «страница» и кладите туда блоки про эту страницу (about-title, about-layout, etc). Не нужно будет изобретать отдельные правила, как вы сделали в первом пункте манифеста.

Вот пример отдельных блоков для промо раздела сайта:

github.com/bem-site/bem.info/tree/master/blocks/promo

Они имеют отдельный префикс и не мешаются с остальными блоками сайта.

На конкретных страницах они доопределяются:

github.com/bem-site/bem.info/tree/master/blocks/methodology-index

Нет ничего плохого в том, что блок используется в одном месте сайта, блоки не обязательно должны повторно использоваться где-то ещё.
Sign up to leave a comment.

Articles