Ознакомился с материалами на https://ru.bem.info/, но не могу для себя прояснить ряд моментов, объясните пожалуйста:
- Где должен быть описан внешний вид блока (размер, цвет и т.д.): можно в css-классе блока писать или обязательно в модификаторе блока? Можно ли писать дефолтный внешний вид прямо в в css-классе блока?
- Где должен быть описан внешний вид элемента: можно в css-классе элемента или обязательно в модификаторе элемента? Можно ли писать дефолтный внешний вид прямо в в css-классе блока?
- В методологии указано: Блок не должен влиять на свое окружение, т. е. блоку не следует задавать внешнюю геометрию (в виде отступов, границ, влияющих на размеры) и позиционирование. А где тогда указывать свойства влияющие на позиционирование(position, display, float, margin и т.д.)?
- Все что касается позиционирования элемента я могу писать в css-классе элементе?
Можно смело писать прямо на класс до тех пор, пока не возникнет необходимость отменять такие стили по умолчанию. В этот момент можно вынести их в модификатор.
Аналогично предыдущему ответу.
Если дочитать тот же документ до раздела про миксы, там найдется ответ: https://ru.bem.info/methodology/quick-start/#Микс
Да, т.к. элементы — это «внутренняя кухня» блока.
@tadatuta По поводу 3-го пункта - вы хотите сказать что:
search-form
я задалposition: relative;
чтобы использовать это для позиционирования элементовsearch-form
. А в элементеheader__search-form
я задамposition: absolute;
чтобы позиционировать уже элементheader__search-form
в блокеheader
.Или я
search-form
задалdisplay: flex;
, а вheader__search-form
display: block;
иfloat: left;
.Т.е., в общем случае, не получится написать
header__search-form
не посмотрев что используется вsearch-form
.@RinatMullayanov 1 Да. можно
@RinatMullayanov в целом все так. Для случаев, когда есть вероятность подобных пересечений, нужно просто не экономить на DOM-узлах и делать
@tadatuta @kompolom понял, большое спасибо за разъяснения.
т.к. бэм должен быть понятен с первого взгляда, может следующая конструкция более уместна? потому как вряд ли будет понятно, что
<div class="header__search-form">
отвечает за позишн.@AlexandrKom
header__search-form
отвечает за позиционирование формы, а, скажем,header__logo
— за позиционирование логотипа. И так далее.Избавиться от дополнительных оберток можно с помощью миксов. Но вообще выбирая между возможностью повторного использования блока целиком VS экономии на обертке достаточно очевидно, что победит повторное использование.
В том-то и дело, что блоки
form
,logo
илиbutton
не должны ничего знать про свое позиционирование, т.к. могут быть использованы многократно в совершенно разных местах на странице, с разными отступами и так далее. Про то, что логотип имеет отступ в 22 пикселя от границы шапки должна знать именно шапка (в ней всегда есть такой отступ от края, а логотип где-нибудь подвале вполне может иметь другие отступы и там пусть за них отвечает подвал).Вот есть у меня блок
button
и я хочу его использовать 40 раз на проекте: «Войти», «Найти», «Сохранить», «Отмена», «Купить», «Отправить», «Подтвердить» и так далее. Как быть с парой цифр в классе?можете объяснить почему тогда в исходном коде сайта бэма я вижу кучу блоков с позиционированием и без миксов?
@gexenemy, наверное, можем, но нужные конкретные примеры
Владимир, вот например блок с именем .nav position:fixed; top: 79; left: 9; либо выше блок .sitemap тоже есть свойства позиционирования и всё задано без миксов, хотя это вроде как противоречит документации?
У нас на этих выходных хакатон по БЭМ, я буду заниматься сайтом и сделаю ревью реализации блоков. Такие места подправлю.
@gexenemy посмотрел на стили блока
.nav
, у него не предполагается переиспользование в других местах и вводить искусственно элемент родителя только для того, чтобы задать ему позиционирование не вижу смысла, это будет тут избыточно.@vithar какаие-то «двойные стандарты» получаются: документация точно определяет, как следует позиционировать блоки. Соответственно, в данном случае
nav
следует сделать элементом «родительского элемента» (или внести уточнение в документ об исключениях).БЭМ — это не про жесткие правила, а про рекомендации, которые упрощают жизнь.
Разумеется, в идеале стоит писать все, как написано в доке, но в реальности всегда бывают допущения с учетом знания о внутренней кухне и планах на дальнейшее развитие проекта. Особенно когда разработчик глубоко понимает, что он делает и к чему это может привести.
Я отрефакторил, чтобы не было двойных стандартов.
А почему не стоит в модификаторе блока указывать margin? Если можно на примере.
@lukasvs "В методологии указано: Блок не должен влиять на свое окружение, т. е. блоку не следует задавать внешнюю геометрию (в виде отступов, границ, влияющих на размеры) и позиционирование. А где тогда указывать свойства влияющие на позиционирование(position, display, float, margin и т.д.)?"
А почему не стоит в модификаторе блока указывать margin?
как делаем мы, если к блоку на определенной странице или в определенном месте нужен отступ, например margin-right в 10px, добавляем соответствующий класс class='b-block l-margin__right-normal' Так же для других отступов и позиционирования
Нет, мы миксируем к блоку элемент родителя, который может задавать свои отступы.
class="logo header__logo"
илиclass="button checkout-form__submit"