Comments 74
откуда берутся нестандартные отступы? От неконсистентного дизайна, и пискель-перфекта без права настучать дизайнеру по голове чтоб сам следовал своим отступам.
Если это разные лендинги — так для них одноразовое наговнякивание штучной CSSки идеальный вариант.
Если это разные стилизации под разные особенности — специфические CSS модификаторы протянутые через один глобальный класс на body.
Если же они семантически разные совсем, то не факт что общий бэкенд (если только он не глупый сырой API) справится без костылей, то есть это по сути разные сайты, где реюз не всегда возможен — и только создаёт мощные стяжки из спагетти.
У вас задача слышится скорее так: Как можно меньше сделать но чтобы визуально было так, как-будто бы пахали разные команды.
В этом случае не вижу проблем больших при переопределении 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». С каскадом там всё в порядке.
Вы, как и многие, путаете понятия каскада и вложенных селекторов.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.
БЭМ — отличная вещь, которая добавляет, как минимум, компонентность и инкапсуляцию. И при использовании методологии, плюсов больше, чем минусов разработки на «чистом» css.
А, как вы выразились, рамки — они необходимы. Паттерны проетирования, фреймворки, методологии — это все рамки и призваны они структурировать код, абстрагируясь на определенном уровне, где цель — написать код, который ты и другие разработчики смогут понять сейчас и успешно поддерживать в дальнейшем.
Ну а по поводу БЭМ в целом, скажу что тут основная проблема не в работе фронтэндера, а в работе дизайнера. Надо чтобы дизайнер соответствовал предлагаемой методологии. Чтобы он проектировал свои интерфейсы отталкиваясь от этой концепции переиспользования блоков.
Яндексу хорошо — у них дизайнеры интерфейсов по сути и есть разработчики. Когда всё делается по единому условному брэндбуку. Вот им и кажется что это панацея.
В обычной жизни вы столкнётесь с кучей однотипных блоков, одни из которых будут идентичны, другие будут отличаться цветом, третьи внутренней разметкой и т.д.
Чтобы применять этот подход — надо кучу времени потратить просто на анализ макета. Анализируя и вычленяя переиспользуемые свойства. Но извините, при таком кропотливом анализе любой подход к вёрстке будет одинаково эффективен.
Ну не взлетает БЭМ на разовых проектах.
.my-awesome-new-component_element
Ой, но ведь я не пользуюсь нижним подчеркиванием
.my-awesome-new-component-element // не то
.myAwesomeNewComponent-element // и вот тут ты понимаешь, что что-то пошло не так
Пришел к следующей схеме:
Разделяем все наши поделки на две категории компоненты и представления.
— Компонент (кнопки, инпуты, тул/таб-бары и т.д.) — часто мигрирует из проекта в проект, часто меняются стили.
— Представление (реализации форм, сайдбаров и т.д.) — нужны только в конкретном проекте.
Для первых SMACSS или его подобие. Для вторых БЭМ. Полгода. Полет нормальный.
ЗЫ: Не знаю как это зайдет для сайтов ибо занимаюсь SPA.
.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 подходы к построению интерфейсов, да еще они для разных заказчиков, тогда универсальность позволяет значительно сократить кол-во писанины.
Возможно, танцы с иконками и метками намекают, что больше подошли бы другие контролы: свитчеры, селекты и т.п.
Похоже на попытку подогнать задачу под методологию.
Если это возможно — не вопрос, но обычно правила диктует заказчик.
Если это существующий проект, с интересом взглянул бы на макеты.
На самом деле проекты с таким интерфейсом вы видели и скорее всего даже используете.
И это мы еще не коснулись второй части моего вопроса про MenuItem и Dropdown. С переопределение стилей вложенных элементов всё очень плохо.
Вообще всю эту писанину можно сократить до простой фразы: «БЭМ и универсальность — понятия не очень сочетаемые».
ИМХО, конечно же (ничего себе насловоблудил).
Блин, не помню точно как называется подход, но смысл такой же как у Вас, но более логичен и менее монструозен:
- Блоки состоят из 2 слов, называются как в БЭМ:
block_name
- Элементы называются всегда в 1 слово:
element
- Модификаторы выглядят как
-modifer
- Как было сказано "page блоки" называются как
l-layout_element
- утилитарные настройки вроде названия темы пишутся как
u-utilitary
ps Если кто-то напомнит как назывался этот стандарт, то будет вообще круто)
<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 жирного начертания. Как можно сделать лучше и почему это плохо?Вы будете ползать по 30 страницам переименовывать класс? Ну ок, у вас есть условный WebStorm, который будет ползать за вас, но зачем решать проблему, если ее можно просто не создавать.
Возможно, задумка автора и хороша, но без описания её трудно понять, не тратя на изучение много времени.
Если разбирать пример автора статьи, то вместо придумывания осмысленного названия класса (семантического), конструирование конечного вида элемента перенесли в CSS классы (признак — наличие font_face_calibri-bold
ничем не лучше держать стили в атрибуте style
). Если по названиям CSS классов понятно как выглядит элемент (шрифт, размер, цвет, отступы, и подобные...), то это означает, что название выбрано не правильно, да и сам человек не понимает что такое семантика. Личное мнение, что лучше использовать SCSS @include
для копирования стилей в нужный блок. В осмысленно названных (семантических) селекторах гораздо проще ориентироваться, например section-header--primary
, section-header--secondary
, section-header--subheader
.
.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
, без них не куда. Не понял а почему отступ от заголовка больше чем от поля ввода? Кто дизайн делал? Надо ещё с дизайнером пообщаться, дабы вёрстка была красивее.
Как по мне, это адская дробность. У меня большинство таких файлов содержали бы всего несколько строк кода. Имхо, правило «1 блок == 1 файл» это хороший компромисс между объемом файла и их количеством. Но правда, я стараюсь делать декомпозицию блоков насколько это возможно в рамках здравого смысла.
Ужасный подход. Гораздо правильнее это сделать в 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 не позволял этого делать?
Сделайте уровень переопределения (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
Нет ничего плохого в том, что блок используется в одном месте сайта, блоки не обязательно должны повторно использоваться где-то ещё.
Удобный БЭМ