Елемент
Складова частина блоку, яка не має окремого значення і не може використовуватися окремо від нього. Наприклад, елемент меню, заголовок або текст у статті, зображення галереї тощо.
Ім'я класу елемента:
- Обов'язково формується за схемою
блок__елемент
. Ім'я блоку задає простір імен, який гарантує залежність його елементів. - Повинно відповідати на питання «Що це?», наприклад
блок__item
,блок__title
,блок__link
,блок__image
тощо. - Не повинно відповідати на питання «Як виглядає?», наприклад
блок__big-link
,блок__blue-text
,блок__round-button
тощо.
<!-- ✅ Блок logo з елементами image і label -->
<a href="" class="logo">
<img class="logo__image" src="..." alt="Логотип компанії Технокряк" />
<span class="logo__label">Компанія Технокряк</span>
</a>
<!-- ❌ Елемент за межами блоку не має окремого значення -->
<img class="logo__image" src="..." alt="Логотип компанії Технокряк" />
<!-- ✅ Блок product з елементами name, price і link -->
<article class="product">
<h1 class="product__name">Холодильник</h1>
<p class="product__price">Ціна: 30000</p>
<a class="product__link" href="">Переглянути всі характеристики</a>
</article>
<!-- ❌ Елемент за межами блоком не має окремого значення -->
<h1 class="product__name">Холодильник</h1>
Задайте собі питання: «Ця сутність може знадобитися мені окремо і самостійно? Чи вона потрібна тільки всередині її батька?». Якщо потрібна окремо - це блок, якщо має значення тільки як частина - це елемент.
Вкладеність
Елементи можна вкладати один в одного, водночас допустима будь-яка вкладеність, оскільки BEM-класи не прив'язані до HTML-ієрархії. HTML-структура елементів блоку може бути довільною.
Навігація - це блок, а елемент списку і посилання - це елементи блоку навігації.
<ul class="nav">
<li class="nav__item">
<a class="nav__link" href="">Про нас</a>
</li>
<li class="nav__item">
<a class="nav__link" href="">Контакти</a>
</li>
<li class="nav__item">
<a class="nav__link" href="">Галерея</a>
</li>
</ul>
Структура BEM-класів такого компонента буде плоскою.
.nav
.nav__item
.nav__link
Додамо BEM-класи до розмітки картки продукту з декількома рівнями вкладеності.
<article class="product">
<div class="product__overlay">
<img class="product__image" src="" />
</div>
<div class="product__content">
<h2 class="product__name">Холодильник</h2>
<p class="product__description">Шикарний холодильник</p>
<a class="product__link" href="">Переглянути всі характеристики</a>
<div class="product__meta">
<p class="product__price">Ціна: 30000</p>
<p class="product__quantity">Залишилось: 8 штук</p>
</div>
</div>
</article>
Структура BEM-класів блоку та його елементів завжди буде плоскою, незалежно від глибини вкладеності елементів один в одного. Це дозволяє змінювати структуру HTML-розмітки блоку без внесення змін у стилі.
.product
.product__overlay
.product__image
.product__content
.product__name
.product__description
.product__link
.product__meta
.product__price
.product__quantity
Елемент - завжди частина блоку, а не іншого елемента. Це означає, що в імені
класу елемента не можна прописувати ієрархію на зразок блок__елемент1__елемент2
.
Необов'язковість
Елемент - це необов'язкова частина блоку. Не у всіх блоків повинні бути елементи і не усі елементи можуть бути присутніми у різних екземплярах блоку.
<!-- Блок button з іконкою і текстом -->
<button class="button" type="button">
<svg class="button__icon">...</svg>
<span class="button__label">В кошик</span>
</button>
<!-- Блок button тільки з текстом -->
<button class="button" type="button">
<span class="button__label">В кошик</span>
</button>
<!-- Блок button тільки з іконкою -->
<button class="button" type="button">
<svg class="button__icon">...</svg>
</button>