Суббота, 18.05.2024
VadimOlga.at.ua
Меню сайта
Категории раздела
HTML [9]
HTML
Языки разметки [44]
Языки разметки
PHP [14]
PHP
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Главная » 2016 » Сентябрь » 28 » БЭМ
21:57
БЭМ
БЭМ (Блок-Элемент-Модификатор) — методология web-разработки, а также набор интерфейсных библиотек, фреймворков и вспомогательных инструментов.

Обзор


Основные понятия

«Блок», «элемент» и «модификатор» — основные термины БЭМ. Это необходимые и достаточные понятия для описания интерфейса любой сложности.

Блок

Блок — это независимый интерфейсный компонент. Блок может быть простым или составным (содержать другие блоки). При создании блока нужно обеспечивать возможность его использования в любом месте web-страницы, а также повторения на той же самой странице. Блок должен включать в себя всю реализацию, необходимую для представления части интерфейса, которую он выражает.

Элемент

Элемент — это составная часть блока. Элементы контекстно-зависимы: они имеют смысл только в рамках своего блока. Элемент — не обязательная составляющая блока, небольшие блоки обходятся без элементов.

Модификатор

Модификатор — это свойство блока или элемента, задающее изменения в их внешнем виде или поведении. Модификатор может быть булевым (например, button_big) или парой ключ-значение (например, menu_type_bullet, menu_type_numbers). У блока или элемента может быть несколько модификаторов одновременно.

Цель создания БЭМ

БЭМ предлагает общую семантическую модель для всех технологий, использующихся во фронтэнд разработке (HTML, CSS, JavaScript, шаблоны и др.)

Используя понятия «блок», «элемент» и «модификатор» можно описать древовидную структуру документа. Такое описание называется BEM tree и является семантическим представлением интерфейса, абстракцией над DOM tree.

Применение БЭМ в различных web-технологиях


HTML/CSS

В HTML/CSS блоки, элементы и модификаторы представлены в виде CSS-классов, названных согласно правилам именования (naming convention). Несколько блоков могут быть расположены на одном и том же DOM-узле, в этом случае DOM-узлу назначается 2 CSS-класса. На одном DOM-узле также могут быть одновременно расположены блок и элемент другого блока.
Правила именования БЭМ-классов от Яндекса

CSS-класс блока соответствует имени блока. Для разделения слов в сложных именах блоков используется дефис.

...




...

...


CSS-класс элемента содержит имя блока и имя элемента, разделенные двумя знаками underscore.


...






...



...



CSS-класс модификатора содержит имя блока и имя модификатора, разделенные одним знаком underscore. В том случае, если модификатор — это пара ключ-значение, они тоже разделяются знаком underscore. Для модификатора элемента в CSS-классе сохраняются и имя блока, и имя элемента. CSS-класс модификатора используется в паре с классом своего блока (или элемента).

...




...

...


Правила именования БЭМ-классов от Гарри Робертса

Альтернативные правила именования были предложены Гарри Робертсом[1]. Он советует использовать 2 дефиса для разделения имён блока и модификатора.

...




...

...


Префиксы

Некоторые правила именования рекомендуют использовать префиксы. Так, все классы блоков могут начинаться с префикса b-.

...


    ...


...

...


Иногда в качестве префикса используют сокращенное имя проекта. Например, OraanjePool-> op.

...


    ...


...

...


JavaScript


В БЭМ JavaScript работает с абстрактной структурой блоков-элементов и модификаторов, не обращаясь к лежащим за ним DOM-узлам и их CSS-классам напрямую. Кроме того, для идентификации DOM-узлов не используются дополнительные CSS-классы "специально для JavaScript". Для обеспечения такой возможности используется фреймворк или собственный набор хелперов.
Хелперы для работы с БЭМ-структурой

Так, если каждому блоку с JavaScript-функциональностью соответствует объект, его методы позволяют:

обращаться к вложенным элементам:

// предположим, что blockObj указывает на объект блока


blockObj.elem('panel'); // возвращает элементы


работать с модификаторами

// предположим, что blockObj указывает на объект блока


blockObj.setMod('disabled'); // устанавливает модификатор


blockObj.delMod('disabled'); // удаляет модификатор


Реакция на установку/удаление модификаторов


Поскольку модификатор отражает состояние блока, при назначении модификатора блок или элемент должен быть приведен в соответствующее состояние. Для изменения внешнего вида достаточно назначения CSS-класса модификатора. В более сложных случаях приведение блока в нужное состояние требует JavaScript-функциональности. Поэтому у используемого JavaScript-фреймворка должна быть возможность декларировать список действий, соответствующий модификатору.

BlockObj.do({ 'active': function() {
// do smth when active
},
'disabled': function() {
// do something when disabled
}
});

i-bem.js


На сегодняшний день фреймворк i-bem.js (часть библиотеки bem-core) предлагает самую полную реализацию БЭМ-принципов в JavaScript. Информацию о фреймворке и примеры использования можно найти на страницах:

Шаблоны


Файловая структура проекта
На файловой системе блоки, элементы и модификаторы представлены в виде файлов своих реализаций в различных web-технологиях. Файлы, относящиеся к одному блоку, объединяют в одну директорию.

Плоская структура


Самая простая структура проекта не предполагает вложенности в директории блоков:

button/
button.css
button.js
button.tpl
button__control.css

header/
header.css
header.tpl
header_christmas.css

tabbed-pane/
tabbed-pane.css
tabbed-pane.js
tabbed-pane.tpl


Сложная структура


В больших проектах или библиотеках удобно использовать сложную файловую структуру блока, где для элементов и модификаторов выделяются директории.


button/
__control/
button__control.css
button.css
button.js
button.tpl

header/
_christmas/
header_christmas.css
header.css
header.tpl

tabbed-pane/
tabbed-pane.css
tabbed-pane.js

tabbed-pane.tpl
Категория: Языки разметки | Просмотров: 322 | Добавил: Baron | Теги: БЭМ | Рейтинг: 0.0/0
Всего комментариев: 0
avatar
Вход на сайт
Поиск
Календарь
«  Сентябрь 2016  »
ПнВтСрЧтПтСбВс
   1234
567891011
12131415161718
19202122232425
2627282930
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • База знаний uCoz
  • VadimOlga.at.ua © 2024