BEM (Block-Element-Modifier) este o metodologie de dezvoltare web , precum și un set de biblioteci de interfețe, cadre și instrumente auxiliare.
„Bloc”, „element” și „modificator” sunt termenii de bază BEM. Acestea sunt concepte necesare și suficiente pentru a descrie o interfață de orice complexitate.
BlocareUn bloc este o componentă independentă a interfeței. Un bloc poate fi simplu sau compus (conține alte blocuri). Când creați un bloc, trebuie să vă asigurați că acesta poate fi folosit oriunde pe pagina web, precum și repetat în același loc pe pagină (elementul părinte). Blocul trebuie să includă toată implementarea necesară pentru a reprezenta partea interfeței pe care o exprimă.
ElementUn element este o componentă a unui bloc. Elementele sunt sensibile la context: au sens doar în blocul lor. Un element este o componentă opțională a unui bloc; blocurile mici se descurcă fără elemente.
ModificatorUn modificator este o proprietate a unui bloc sau element care specifică modificări ale aspectului sau comportamentului acestuia. Modificatorul poate fi un boolean (de ex button_big. ) sau o pereche cheie-valoare (de ex . menu_type_bullet, menu_type_numbers). Un bloc sau un element poate avea mai mulți modificatori în același timp.
BEM oferă un model semantic comun pentru toate tehnologiile utilizate în dezvoltarea front-end (HTML, CSS, JavaScript, șabloane etc.)
Folosind conceptele de „bloc”, „element” și „modificator” este posibil să se descrie structura arborescentă a documentului. O astfel de descriere se numește arbore BEM și este o reprezentare semantică a interfeței, o abstractizare peste arborele DOM.
În HTML / CSS , blocurile, elementele și modificatorii sunt reprezentați ca clase CSS denumite conform convenției de denumire. Mai multe blocuri pot fi localizate pe același nod DOM, caz în care nodului DOM îi sunt alocate 2 clase CSS. Un bloc și un element al altui bloc pot fi, de asemenea, localizate pe același nod DOM.
Reguli de denumire pentru clasele BEM de la YandexClasa CSS a blocului se potrivește cu numele blocului. O cratima este folosită pentru a separa cuvintele în nume de bloc complexe.
<div class= "header" > ... </div> <ul class= "meniu" > ... </ul> <span class= "button" > ... </span> <div class= "tabbed-pane" > ... </div>Clasa CSS a unui element conține numele blocului și numele elementului, separate prin două caractere de subliniere.
<div class= "header" > <div class= "header__bottom" > ... </div> </div> <ul class= "meniu" > <li class= "menu__item" > ... </li> </ul> <span class= "button" > <input class= "button_control" > ... </input> </span> <div class= "panoul cu tabele" > <div class= "panoul-filă__panoul" > ... </div> </div>Clasa CSS modificatoare conține numele blocului și numele modificatorului separate printr-o singură liniuță de subliniere. În cazul în care modificatorul este o pereche cheie-valoare, acestea sunt, de asemenea, separate printr-un caracter de subliniere. Pentru un modificator de element, atât numele blocului, cât și numele elementului sunt stocate în clasa CSS. Clasa CSS modificatoare este folosită împreună cu clasa sa de bloc (sau element).
<div class= "header header_christmas" > ... </div> <!-- Ediția de Crăciun a antetului --> <ul class= "meniu" > <li class= "menu__item menu__item_current" > ... </li> </ul> <span class= "button button_theme_night" > ... </span> <div class= "panoul cu file" > ... </div> Convențiile de denumire a clasei BEM de Harry RobertsConvenții alternative de denumire au fost propuse de Harry Roberts [1] . El sfătuiește să folosiți 2 cratime pentru a separa numele blocurilor și ale elementelor de modificator.
<div class= "header header--christmas" > ... </div> <!-- Ediția de Crăciun a antetului --> <ul class= "meniu" > <li class= "menu__item menu__item--current" > ... </li> </ul> <span class= "buton buton--theme_night" > ... </span> <div class= "panou cu file - panou cu file --dezactivat" > ... </div> PrefixeUnele convenții de denumire recomandă utilizarea prefixelor . Deci, toate clasele de bloc pot începe cu prefixul b-.
<div class= "b-header" > ... </div> <ul class= "b-menu" > ... </ul> <span class= "b-button" > ... </span> <div class= "b-tabbed-pane" > ... </div>Uneori, numele abreviat al proiectului este folosit ca prefix. De exemplu, OrangePool->op.
<div class= "op-header" > ... </div> <ul class= "op-meniu" > ... </ul> <span class= "op-button" > ... </span> <div class= "op-tabbed-pane" > ... </div>În BEM , JavaScript funcționează cu structura abstractă a elementelor bloc și modificatorilor fără a accesa direct nodurile DOM subiacente și clasele lor CSS. De asemenea, nu sunt folosite clase CSS suplimentare „specifice JavaScript” pentru a identifica nodurile DOM. Pentru a oferi această posibilitate, se folosește un cadru sau propriul set de ajutoare.
Ajutoare pentru lucrul cu structura BEMDeci, dacă fiecare bloc cu funcționalitate JavaScript corespunde unui obiect, metodele sale permit:
Deoarece modificatorul reflectă starea blocului, atunci când modificatorul este atribuit, blocul sau elementul trebuie adus în starea corespunzătoare. Pentru a schimba aspectul, este suficient să atribuiți o clasă CSS modificatoare. În cazuri mai complexe, aducerea blocului în starea dorită necesită funcționalitate JavaScript. Prin urmare, cadrul JavaScript utilizat trebuie să poată declara o listă de acțiuni corespunzătoare modificatorului.
BlockObj . on ({ activ : function () { // face ceva cand este activ }, disabled : function () { // face ceva cand este dezactivat } }); i-bem.jsPână în prezent, cadrul i-bem.js(parte a bibliotecii bem-core) oferă cea mai completă implementare a principiilor BEM în JavaScript. Informații despre cadru și exemple de utilizare pot fi găsite pe paginile:
Pe sistemul de fișiere, blocurile, elementele și modificatorii sunt reprezentați ca fișiere ale implementărilor lor în diferite tehnologii web. Fișierele aparținând unui singur bloc sunt combinate într-un singur director.
Structură platăCea mai simplă structură de proiect nu implică imbricarea în directorul bloc:
buton/ butonul.css button.js butonul.tpl button_control.css antet/ antet.css antet.tpl header_christmas.css panou cu file/ panou cu file.css tabbed-pane.js tabbed-pane.tpl Structură imbricatăÎn proiecte sau biblioteci mari, este convenabil să folosiți o structură de fișiere bloc imbricate, în care directoarele sunt alocate pentru elemente și modificatori.
buton/ __Control/ button_control.css butonul.css button.js butonul.tpl antet/ _Crăciun/ header_christmas.css antet.css antet.tpl panou cu file/ panou cu file.css tabbed-pane.js tabbed-pane.tplMetodologia a fost dezvoltată de Yandex și este utilizată pe scară largă în produsele acestei companii [2] .
A găsit aplicație ca parte a unui cadru HTML5 special dezvoltat pentru reproiectarea și refactorizarea serviciului de e-mail mail.ru [3] [4] .
Aceeași metodologie, printre altele, a fost folosită de compania de televiziune și radio BBC la dezvoltarea noului său site web [5] .
BEM este folosit și în versiunea Google din 2015 a Material Design Lite , un cadru HTML5 precum Twitter Bootstrap care acceptă Material design [6] .
Web și site-uri web | |
---|---|
la nivel global | |
La nivel local | |
Tipuri de site-uri și servicii |
|
Creare si intretinere | |
Tipuri de machete, pagini, site-uri | |
Tehnic | |
Marketing | |
Societate și cultură |