Какие CSS свойства нежелательно использовать для описания блока в БЭМ и почему их лучше описывать для селектора элемента?
Что проверяют
Понимаете ли вы главное правило БЭМ: блок ничего не знает про своё окружение и потому переиспользуем в любом месте страницы. Вопрос про конкретные свойства это способ проверить, отличаете ли вы внутреннее устройство блока от его позиции в родителе. Часто продолжают вопросом, куда тогда девать отступ между карточками в списке.
Как отвечать
Сформулируйте принцип: на селекторе самого блока (.card) нежелательны свойства, которые описывают не блок, а его место. Это внешняя геометрия и позиционирование.
- внешние отступы:
margin. Одна и та же карточка в списке, в модалке и в сайдбаре требует разных отступов, зашитыйmarginпридётся переопределять; - позиционирование:
position: absoluteиfixed,top,left,z-index,float, сдвигающийtransform. Это координаты внутри конкретного родителя; - размеры и поведение в раскладке:
width,height,flex,flex-basis,align-self,order,grid-area. Ширину карточки определяет сетка, а не карточка.
Куда это переносится: в селектор элемента родителя (.catalog__card { margin-bottom: 16px; }) или в микс, когда на одном узле висят два класса, class="card catalog__card". Первый описывает внешний вид, второй встраивание в конкретную сетку.
На блоке остаётся всё внутреннее: padding, background, border, border-radius, color, типографика, display: flex для собственных детей. Внутренняя раскладка это устройство блока, а не влияние на соседей, запрещать её незачем.
Полезно упомянуть приёмы, которые снимают часть боли: gap у контейнера вместо margin у детей, :where() для базовых стилей с нулевой специфичностью, CSS-переменные для настройки блока снаружи без переопределения правил.
Где спотыкаются
Запрещают на блоке заодно padding и display: flex. Это перегиб: внутренняя геометрия принадлежит блоку, иначе он перестаёт быть самостоятельным.
Правят чужой блок через каскад: .catalog .card { margin-top: 0; }. Специфичность растёт, отменяющие правила копятся, и через полгода блок нельзя тронуть.
Не различают модификатор и микс. card--in-catalog затаскивает знание о каталоге внутрь блока, а нужен именно микс с элементом родителя.