BEM (Block-Element-Modifier) je metodika vývoje webu , stejně jako sada knihoven rozhraní, rámců a pomocných nástrojů.
"Blok", "prvek" a "modifikátor" jsou základní pojmy BEM. Toto jsou nezbytné a dostatečné koncepty pro popis rozhraní jakékoli složitosti.
BlokovatBlok je nezávislá komponenta rozhraní. Blok může být jednoduchý nebo složený (obsahuje další bloky). Při vytváření bloku je třeba zajistit, aby mohl být použit kdekoli na webové stránce a také opakován na stejném místě na stránce (nadřazený prvek). Blok musí obsahovat veškerou implementaci nezbytnou k reprezentaci části rozhraní, kterou vyjadřuje.
PrvekPrvek je součástí bloku. Prvky jsou závislé na kontextu: smysl dávají pouze v rámci svého bloku. Prvek je volitelná součást bloku, malé bloky se obejdou bez prvků.
ModifikátorModifikátor je vlastnost bloku nebo prvku, která určuje změny jeho vzhledu nebo chování. Modifikátor může být booleovský (např button_big. ) nebo pár klíč–hodnota (např . menu_type_bullet, menu_type_numbers). Blok nebo prvek může mít více modifikátorů současně.
BEM nabízí společný sémantický model pro všechny technologie používané při vývoji front-endu (HTML, CSS, JavaScript, šablony atd.)
Pomocí pojmů "blok", "prvek" a "modifikátor" je možné popsat stromovou strukturu dokumentu. Takový popis se nazývá strom BEM a je sémantickou reprezentací rozhraní, abstrakcí nad stromem DOM.
V HTML / CSS jsou bloky, prvky a modifikátory reprezentovány jako třídy CSS pojmenované podle konvence pojmenování. Na stejném uzlu DOM může být umístěno více bloků, v takovém případě má uzel DOM přiřazeny 2 třídy CSS. Blok a prvek jiného bloku mohou být také umístěny na stejném uzlu DOM.
Pravidla pojmenování tříd BEM z YandexuTřída CSS bloku odpovídá názvu bloku. Pomlčka se používá k oddělení slov ve složitých názvech bloků.
<div class= "header" > ... </div> <ul class= "menu" > ... </ul> <span class= "button" > ... </span> <div class= "tabbed-pane" > ... </div>Třída CSS prvku obsahuje název bloku a název prvku oddělené dvěma podtržítky.
<div class= "header" > <div class= "header__bottom" > ... </div> </div> <ul class= "menu" > <li class= "menu__item" > ... </li> </ul> <span class= "button" > <input class= "button_control" > ... </input> </span> <div class= "tabbed-pane" > <div class= "tabbed-pane__panel" > ... </div> </div>Třída CSS modifikátoru obsahuje název bloku a název modifikátoru oddělené jedním podtržítkem. V případě, že je modifikátorem pár klíč–hodnota, jsou také odděleny podtržítkem. U modifikátoru prvku je název bloku i název prvku uložen ve třídě CSS. Modifikační třída CSS se používá ve spojení s její třídou bloku (nebo prvku).
<div class= "header header_christmas" > ... </div> <!-- Vánoční vydání záhlaví --> <ul class= "menu" > <li class= "menu__item menu__item_current" > ... </li> </ul> <span class= "button button_theme_night" > ... </span> <div class= "tabbed-pane tabbed-pane_disabled" > ... </div> BEM třídy pojmenování konvence od Harryho RobertseAlternativní jmenovací konvence byly navrženy Harrym Robertsem [1] . Doporučuje používat 2 pomlčky k oddělení názvů bloků a prvků od modifikátoru.
<div class= "header header--christmas" > ... </div> <!-- Vánoční vydání záhlaví --> <ul class= "menu" > <li class= "menu__item menu__item--current" > ... </li> </ul> <span class= "button button--theme_night" > ... </span> <div class= "tabbed-pane tabbed-pane--disabled" > ... </div> PředponyNěkteré konvence pojmenování doporučují používat předpony . Všechny třídy bloků tedy mohou začínat prefixem b-.
<div class= "b-header" > ... </div> <ul class= "b-menu" > ... </ul> <span class= "b-button" > ... </span> <div class= "b-tabbed-pane" > ... </div>Někdy se jako předpona používá zkrácený název projektu. Například OrangePool->op.
<div class= "op-header" > ... </div> <ul class= "op-menu" > ... </ul> <span class= "op-button" > ... </span> <div class= "op-tabbed-pane" > ... </div>V BEM pracuje JavaScript s abstraktní strukturou blokových prvků a modifikátorů, aniž by přímo přistupoval k základním uzlům DOM a jejich třídám CSS. K identifikaci uzlů DOM se také nepoužívají žádné další třídy CSS „specifické pro JavaScript“. K zajištění této možnosti se používá framework nebo jeho vlastní sada pomocníků.
Pomocníci pro práci se strukturou BEMPokud tedy každý blok s funkcí JavaScriptu odpovídá objektu, jeho metody umožňují:
Protože modifikátor odráží stav bloku, když je modifikátor přiřazen, musí být blok nebo prvek uveden do odpovídajícího stavu. Pro změnu vzhledu stačí přiřadit modifikátor CSS třídu. Ve složitějších případech vyžaduje uvedení bloku do požadovaného stavu funkčnost JavaScriptu. Použitý JavaScriptový framework proto musí být schopen deklarovat seznam akcí odpovídající modifikátoru.
BlockObj . on ({ active : function () { // udělat cokoli, když je aktivní }, vypnuto : function () { // udělat něco, když je zakázáno } }); i-bem.jsK dnešnímu dni framework i-bem.js(součást knihovny bem-core) nabízí nejúplnější implementaci principů BEM v JavaScriptu. Informace o frameworku a příklady použití naleznete na stránkách:
Na souborovém systému jsou bloky, prvky a modifikátory reprezentovány jako soubory jejich implementací v různých webových technologiích. Soubory patřící do jednoho bloku jsou sloučeny do jednoho adresáře.
Plochá konstrukceNejjednodušší struktura projektu nezahrnuje vnoření do adresáře bloků:
knoflík/ tlačítko.css button.js button.tpl button_control.css záhlaví/ hlavička.css hlavička.tpl hlavička_vánoce.css tablo/ panel s kartami.css tabbed-pane.js tabbed-pane.tpl Vnořená strukturaVe velkých projektech nebo knihovnách je vhodné použít strukturu vnořených blokových souborů, kde jsou alokovány adresáře pro prvky a modifikátory.
knoflík/ __řízení/ button_control.css tlačítko.css button.js button.tpl záhlaví/ _Vánoce/ hlavička_vánoce.css hlavička.css hlavička.tpl tablo/ panel s kartami.css tabbed-pane.js tabbed-pane.tplMetodika byla vyvinuta společností Yandex a je široce používána v produktech této společnosti [2] .
Našel uplatnění jako součást speciálně vyvinutého rámce HTML5 pro redesign a refaktoring poštovní služby mail.ru [3] [4] .
Stejnou metodiku mimo jiné použila i televizní a rozhlasová společnost BBC při vývoji svého nového webu [5] .
BEM se také používá ve verzi Material Design Lite od Google z roku 2015 , což je rámec HTML5 , jako je Twitter Bootstrap , který podporuje Material design [6] .
Web a webové stránky | |
---|---|
globálně | |
Lokálně | |
Typy stránek a služeb |
|
Tvorba a údržba | |
Typy rozložení, stránek, webů | |
Technický | |
Marketing | |
Společnost a kultura |