Заголовок
Текст
Добавляем класс содержащий назначение элемента: .popup:
Заголовок
Текст
Теперь попробуем добавить классы вложенным элементам:
Заголовок
Текст
Классы удобные, но не уникальные. Если на странице будут ещё элементы с классами .title и .text, их стили могут затронуть элементы в попапе. Селектор типа .popup .title может в будущем создать проблемы со специфичностью. Можно придумать другие классы, но чем больше похожих по смыслу элементов, тем сложнее придумывать новые классы.
А теперь применим БЭМ-нотацию: каждому элементу внутри блока добавим префикс с классом родителя, например, для заголовка это будет
Заголовок
Текст
Теперь эти классы легко решают сразу две задачи: во-первых, благодаря уникальным классам стили для них никогда не пересекутся с другими подобными элементами на странице, а во-вторых, по таким классам сразу видно, что это элементы блока .popup.
====2.Пример посложнее: Блок + Элемент + Модификатор====
Для примера возьмём сервисное сообщение на сайте. Обычно такие сообщения бывают разных видов, например, сообщение об успешном завершении действия или об ошибке.
Логично использовать одну и ту же разметку, но с разными цветовыми темами. Именно здесь очень пригодятся модификаторы.
Обоим элементам можно добавить одинаковые стили используя общий класс .message и так же легко можно добавить отдельные стили для каждого из них, используя уникальный класс с модификатором:
.message {
border: 1px solid gray;
}
.message--success {
border-color: green;
}
.message--error {
border-color: red;
}
Оба сообщения будут иметь рамку толщиной один пиксель, но для сообщения об успешной операции она будет зелёной, а для сообщения об ошибке — красной.
====3.Ещё сложнее: что делать, если хочется сделать элемент элемента?====
Например, на странице есть блок новостей:
Новости
Заголовок блока логично получает класс
Новости
Тут никаких проблем возникнуть не должно. Теперь добавим разметку отдельной новости:
Новости
-
Заголовок новости
Текст новости
Нам нужно добавить класс заголовку новости. Первым делом приходит в голову .
.news__title { ... }
.news__subject { ... }
Без дополнительных комментариев будет совершенно невозможно понять какой из них является заголовком всего блока, а какой — отдельной новости. Не пойдёт.
Следующий вариант —
Новости
-
Заголовок новости
Текст новости
Проблема решена: нам больше не нужно использовать монструозные классы, при этом класс точно описывает элемент, и в CSS будет сразу понятно какой класс за что отвечает:
.news__title { ... }
.news-item__title { ... }
Простой и удобный выход из неудобной ситуации.
Больше примеров разметки можно увидеть здесь.
Ещё одно хорошее руководство по использованию БЭМ есть здесь.