Utilizarea PostCSS cu metodologiile BEM și SUIT

În acest tutorial vom învăța cum să folosim PostCSS pentru a face dezvoltarea CSS stil BEM / SUIT mai ușoară și mai eficientă.

Aceste două metodologii stabilesc o convenție de numire pentru clase, care facilitează păstrarea stilurilor strâns legate de funcții și ajută alți dezvoltatori să recunoască scopul diferitelor clase doar din modul în care sunt numiți.

BEM a fost predecesorul acestui tip de metodologie de numire a claselor, creat de Yandex. Metodologia SUIT este o abordare bazată pe BEM, dar cu unele ajustări și completări făcute de Nicholas Gallagher. SUIT face tot ceea ce face BEM, dar pentru mulți utilizatori este considerat un accesoriu.

Lucrul cu aceste metode contribuie cu siguranta la producerea unor CSS mai bine structurate. Cu toate acestea, partea complicată este că poate deveni obositoare manual tastând numele de clasă necesare în această structură și urmărirea modului în care clasele inter-relaționate pot deveni un pic de dureri de cap. 

Plug-ul postcss-bem de Malte-Maurice Dreyer ameliorează aceste probleme printr-o combinație de comenzi rapide și cuiburi, pe care o veți învăța să le folosiți pe măsură ce treceți prin acest tutorial.

Dar, mai întâi, hai să avem un primer rapid cu privire la metodele BEM și SUIT, pentru a vă asigura că aveți o imagine clară a beneficiilor utilizării pluginului postcss-bem și a modului în care este folosit.

Primer rapid pe BEM

bloc

În BEM blocuri sunt bucăți de nivel înalt ale unui design; blocurile de construcție din care face parte. Un bloc ar trebui să fie o bucată din site-ul dvs. care este independentă de alte piese și ar putea fi plasată teoretic oriunde în aspectul dvs., chiar și în interiorul unui alt bloc.

De exemplu, formularul de căutare "blochează" pe site-ul dvs. ar putea utiliza clasa .Căutare în formă.

Element

Un element în BEM este o subsecțiune în interiorul unui bloc. Acestea sunt semnificative prin adăugarea a două subliniere __ separator și un nume de element în numele blocului părinte.

De exemplu, un formular de căutare poate include titluri, câmp de text și elemente de buton de trimitere. Numele lor de clasă ar putea fi .căutare-form__heading.căutare-form__text-câmp și .căutare-form__submit-buton respectiv.

Modificatorul

A modificator este aplicat unui bloc sau element care semnifică o schimbare a prezentării sale sau o schimbare a stării sale. Acestea sunt semnificative prin adăugarea unui separator și a unui nume de modificare a blocului sau elementului în cauză.

Documentele oficiale ale site-ului BEM afirmă că separatoarele de modificatori ar trebui să fie un singur subliniere _. Cu toate acestea, convenția "BEM-like" a Ghidului CSS de Harry Roberts folosește două liniuțe -- și este, probabil, mai larg utilizat și cunoscut decât convenția oficială BEM.

De exemplu, într-un design puteți dori să prezentați formulare de căutare avansată diferit de formularele de căutare obișnuite și, prin urmare, să creați clasa de modificatori .-Search form_advanced (BEM oficial) sau .Căutare în formă - avansat (BEM-like).

Într-un alt exemplu, este posibil să doriți să modificați aspectul formularului datorită unei modificări a stării, cum ar fi în cazul în care tocmai a fost trimis un conținut nevalid și, prin urmare, să creați modificatorul .căutare-form_invalid (BEM oficial) sau  .căutare-formular - invalid (BEM-like).

Primer rapid pe SUIT

SUIT cuprinde Utilități și Componente. În cadrul componentelor pot exista Modificatorii, Urmasi și statele.

SUIT utilizează o combinație de caz pascal (PascalCase), caz de cămilă (camelCase) și liniuțe. Convențiile sale impun o limită a numărului uneori confuz de liniuțe și sublinieri care pot apărea în BEM. De exemplu, clasa BEM .căutare-form__text-câmp va fi .SearchForm-textfield în SUIT.

Utilitate

Utilități structura mânerului și stilul pozițional și sunt scrise astfel încât să poată fi aplicate oriunde într-o componentă. Acestea sunt prefixate cu u- și scrisă în caz de cămilă. De exemplu, .u-clearFix.

component

A component în SUIT ia locul unui bloc în BEM. Componentele sunt întotdeauna scrise în cazul pascal și fac parte doar din SUIT care utilizează cazul pascal, făcându-le ușor de identificat. De exemplu, .SearchForm.

Nomenclatorul de componente

Componentele pot fi prefixate opțional cu un spațiu de nume și o singură linie NMSP- pentru a asigura împiedicarea conflictelor, de ex. .mina-SearchForm.

descendentul

A descendent în SUIT înlocuiește o element în BEM. Utilizează o singură linie - și este scrisă în caz de cămilă. De exemplu .SearchForm-titlu.SearchForm-textfield și .SearchForm-submitButto.

Modificatorul

SUIT utilizează modificatori la fel ca BEM, însă rolul lor este mai strict controlat. Un modificator SUIT este, în general, aplicat doar direct unei componente, nu unui descendent. De asemenea, nu ar trebui să fie folosit pentru a reprezenta schimbări de stat, deoarece SUIT are o convenție dedicată de numire pentru state.

Modificatorii sunt scrise în cazul cămilă și sunt precedate de două liniuțe --. De exemplu,  .SearchForm - avansat.

Stat

Stat clasele pot fi folosite pentru a reflecta modificările la starea unei componente. Acest lucru le permite să fie diferențiate în mod clar de modificatori, care reflectă modificarea aspectului de bază al unei componente, indiferent de stat. Dacă este necesar, o stare poate fi aplicată și unui descendent.

Statele sunt prefixate cu este- și sunt scrise în caz de cămilă. Ele sunt, de asemenea, întotdeauna scrise ca clase adiacente. De exemplu  .SearchForm.is-nevalid.

Configurați-vă proiectul

Acum, că aveți cele mai importante lucruri pentru BEM și SUIT, este timpul să vă configurați proiectul.

Veți avea nevoie de un proiect gol, utilizând fie Gulp, fie Grunt, în funcție de preferințele dvs. Dacă nu aveți deja o preferință pentru unul sau altul, vă recomandăm să utilizați Gulp, deoarece veți avea nevoie de un cod mai mic pentru a atinge aceleași scopuri, așadar ar trebui să vă simțiți puțin mai ușor să lucrați cu.

Puteți citi despre cum să configurați proiectele Gulp sau Grunt pentru PostCSS în tutorialele anterioare

  • PostCSS Ghid de pornire rapidă: Gulp Setup sau
  • PostCSS Ghid de pornire rapidă: Configurarea gruntului

respectiv.

Dacă nu doriți să configurați manual proiectul de la zero, puteți să descărcați fișierele sursă atașate acestui tutorial și să extrageți proiectul Gulp sau Gruntul furnizat într-un dosar gol al proiectului. Apoi, cu un terminal sau un prompt de comandă indicat la dosarul de executare a comenzii npm install.

Instalați pluginurile

Apoi, va trebui să instalați pluginul postcss-bem. Vom instala, de asemenea, un plugin care poate funcționa destul de bine cu acesta: postcss-nested.

Indiferent dacă utilizați Gulp sau Grunt, executați următoarea comandă în dosarul proiectului:

npm instalare postcss-bem postcss-imbricate - save-dev

Acum suntem gata să încărcăm pluginurile în proiectul tău.

Încărcați pluginurile prin Gulp

Dacă utilizați Gulp, adăugați aceste variabile sub variabilele deja în fișier:

var bem = necesită ("postcss-bem"); var nested = necesită ("postcss-nested");

Acum adăugați fiecare dintre aceste nume de variabile noi în dvs. procesoare matrice:

 var procesoare = [bem, imbricate];

Faceți un test rapid că totul funcționează prin rularea comenzii gulp css verificând apoi că un nou fișier "style.css" a apărut în folderul "dest" al proiectului.

Încărcați pluginurile prin intermediul Grunt

Dacă utilizați Grunt, actualizați procesoare obiect, care este imbricat sub Opțiuni obiect, la următoarele:

 procesoare: [cere ('postcss-bem') (), necesită ('postcss-nested') ()

Faceți un test rapid că totul funcționează prin rularea comenzii zgâria postcss verificând apoi că un nou fișier "style.css" a apărut în folderul "dest" al proiectului.

Bine, sunteți gata să plecați. Să învățăm cum să generăm structura BEM și SUIT.

BEM și SUIT cu postmodernă

Există oarecare neajuns în dezvoltarea structurii BEM sau SUIT atunci când scrieți codul manual, deoarece repetarea continuă a acelorași identificatori în numele claselor poate deveni obositoare și urmărirea elementelor și descendenților care aparțin blocurilor și componentelor care pot deveni confuze.

Când utilizați postcss-bem cu toate acestea, devine ușor să înțelegeți structura codului dvs. dintr-o privire și repetarea în tastarea numelor de clasă devine practic inexistentă.

Generarea structurii SUIT

În ciuda numelui său, în mod implicit postcss-bem va ieși conform sintaxei SUIT, mai degrabă decât BEM. Puteți ieși în sintaxa BEM, pe care o vom acoperi mai târziu, dar plugin-ul este în primul rând proiectat să producă SUIT, deci din acest motiv, vom începe cu sintaxa SUIT.

Generarea unei componente

Pentru a crea o componentă, utilizați sintaxa @ component ComponentName ....

Încercați acest lucru prin adăugarea unui SearchForm în fișierul "src / style.css":

@ Component SearchForm umplutură: 0; marja: 0; 

Compilați-l și codul rezultat ar trebui să fie:

.Formularul de căutare padding: 0; marja: 0; 

Generarea unui Descendent

Pentru a crea un descendent, utilizați sintaxa @ descendent descName ... imbricate în interiorul componentei părinte.

Adăugați un descendent numit textfield în interiorul tău SearchForm astfel:

@ Component SearchForm umplutură: 0; marja: 0; / * Nest descendent sub componenta * / @descendent textField border: 1px solid #ccc; 

După compilare, ar trebui să vedeți acum:

.Formularul de căutare padding: 0; marja: 0;  .SearchForm-textField border: 1px solid #ccc; 

Generarea unui Modificator

Creați un modificator pentru o componentă cu sintaxa @ name of modifier ..., imbricate în interiorul componentei pe care o efectuează. Modificatorii ar trebui să fie în mod obișnuit plasați în partea superioară a componentei dvs., deasupra oricărui descendent și stat.

Adăugați un modificator numit avansat pentru dumneavoastră SearchForm componenta cu următorul cod:

@ Component SearchForm umplutură: 0; marja: 0; / * De obicei, modificați locurile de deasupra descendenților * / @modifier advanced padding: 1rem;  @descendent textField border: 1px solid #ccc; 

Recompilați codul dvs. și ar trebui să vedeți noul dvs. avansat modificator de componente:

.Formularul de căutare padding: 0; marja: 0;  .SearchForm - avansat padding: 1rem;  .SearchForm-textField border: 1px solid #ccc; 

Generarea unui stat

Statele sunt create prin sintaxa @ când numele ... și pot fi imbricate în interiorul unei componente sau descendente.

Adăugați o stare numită invalid pentru dumneavoastră textfield descendent folosind acest cod:

@ Component SearchForm umplutură: 0; marja: 0; @modifier avansat padding: 1rem;  @descendent textField border: 1px solid #ccc; / * Aceasta creează o stare pentru descendentul textField * / @when invalid border: 1px solid red; 

Acum, când compilați codul, veți vedea că acesta conține noul dvs. invalid stat:

.Formularul de căutare padding: 0; marja: 0;  .SearchForm - avansat padding: 1rem;  .SearchForm-textField border: 1px solid #ccc;  .SearchForm-textField.is-invalid border: 1px solid red; 

Componente pentru numere de nume

Aveți posibilitatea să denumiți componentele și toți descendenții, modificatorii și stările imbricate în ele, prin înconjurarea lor @ name-name-component-component .... Poți, dacă îți dorești, să îți împacheți întreaga foaie de stil cu acest spațiu de nume, astfel încât toate clasele tale să fie prefixate automat cu acesta.

Încercați acest lucru prin împachetarea întregului cod până acum @ component-namespace mine ...:

@ component-namepace mina @component SearchForm padding: 0; marja: 0; @modifier avansat padding: 1rem;  @descendent textField border: 1px solid #ccc; @when invalid border: 1px solid red; 

După compilare, veți vedea că acum fiecare dintre componentele dvs. este prefixată A mea-:

.a mea-SearchForm umplutura: 0; marja: 0;  .mine-SearchForm - avansat padding: 1rem;  .mine-SearchForm-textField graniță: 1px solid #ccc;  .mine-SearchForm-textField.is-nevalid border: 1px solid red; 

Generarea unui utilitar

Utilitățile sunt create cu sintaxa @ utilitate utilityName .... Vă reamintiți că atunci când ați configurat proiectul, ați instalat pluginul postcss-nested. Am făcut acest lucru, deoarece poate fi foarte util pentru a fi folosit împreună cu postmodern, așa cum veți vedea în acest exemplu în care vom crea un clearFix utilitate:

@ utilitate clearFix &: înainte, &: după conținut: ""; afișare: tabel;  &: după clar: ambele;  / * Dacă se acceptă zoom IE 6/7 * / *: 1; 

După adăugarea codului de mai sus, compilați și veți vedea că acest utilitar nou a fost creat:

.u-clearFix / * Dacă suportă IE 6/7 * / zoom: 1;  .u-clearFix: înainte, .u-clearFix: după content: ""; afișare: tabel;  .u-clearFix: după clear: ambele; 

Generarea structurii BEM

Pentru a activa ieșirea sintaxei BEM în postcss-bem, treceți opțiunea stil: "bem" în Gulpfile sau în Gruntfile:

/ * Gulpfile * / procesoarele var = [bem (stil: bem '), imbricate]; / * Gruntfile * / procesoare: [necesită ('postcss-bem')) (stil: 'bem')

În mod implicit, postcss-bem va folosi separatorul oficial pentru un modifier al unui singur subliniere _. Dacă este important pentru proiectul dvs. să utilizați separatorul mai comun al celor două liniuțe -- în schimb, poți schimba configurația pentru plugin-ul postcss-bem accesând folderul node_modules / postcss-bem al proiectului tău, deschizând index.js, localizând linia 15 și schimbând aceasta:

 bem: separatoare: spațiu de nume: '-', descendent: '__', modificator: '_'

… la acest:

 bem: separatoare: spațiu de nume: '_', descendent: '__', modificator: '-'

Generarea unui bloc

Deoarece un "bloc" în BEM se corelează cu o "componentă" în SUIT, utilizați sintaxa numele blocului -component ... pentru a genera un bloc.

Pentru a crea un Căutare în formă bloc adăugați acest cod:

Formularul de căutare a componentelor padding: 0; marja: 0; 

Apoi compilați și ar trebui să vedeți:

.forma de căutare padding: 0; marja: 0; 

Generarea unui element

Ca un "element" în BEM se corelează cu un "descendent" în SUIT, ele pot fi create cu sintaxa @ element adunant-nume ... imbricate în interiorul blocului părinte.

Pentru a crea un text-câmp element adaugă următoarele:

Formularul de căutare a componentelor padding: 0; marja: 0; @ câmpul textual adunat border: 1px solid #ccc; 

La compilație, veți vedea că elementul dvs. nou a fost creat:

.forma de căutare padding: 0; marja: 0;  .search-form__text-câmp border: 1px solid #ccc; 

Generarea unui Modificator

Chiar dacă BEM permite modificarea atât a blocurilor, cât și a elementelor, pluginul postcss-bem va procesa numai dacă este implantat în blocuri și nu în elemente, datorită convenției SUIT a modificatorilor care se aplică componentelor care nu sunt descendente. Ele pot fi create cu sintaxa @ name of modifier ..., imbricate în blocul părinte.

Adăugați un avansat modificator la dvs. Căutare în formă astfel:

Formularul de căutare a componentelor padding: 0; marja: 0; @modifier avansat padding: 1rem;  @ câmp de text care se află la distanță border: 1px solid #ccc; 

Și pe compilație va da:

.forma de căutare padding: 0; marja: 0;  .search-form_advanced padding: 1rem;  .search-form__text-câmp border: 1px solid #ccc; 

Nu există utilități sau state, dar există spații de nume

În modul BEM @utilitate și @cand sintaxele nu se vor compila în nimic, având în vedere că BEM nu utilizează utilități sau state.

Cu toate acestea, chiar dacă în general nu face parte din BEM, @ Component-namespace sintaxa va funcționa dacă doriți să o utilizați în foaia de stil BEM. Acesta vă va prefixa clasele Nume--:

.a mea - forma de căutare padding: 0; marja: 0;  .mine - căutare-form_advanced padding: 1rem;  .mini - căutarea-forma__text-câmp border: 1px solid #ccc; 

Să recapitulăm

Acum știi totul despre cum să scurtezi dezvoltarea BEM și SUIT și să faci mai ușor procesul general. Să rezumăm tot ce am acoperit:

  • BEM și SUIT sunt convenții de clasificare a claselor care ajută la menținerea foilor de stil orientate spre funcții și organizate, precum și pentru a ajuta alți dezvoltatori să recunoască scopul diverselor clase.
  • SUIT este ca BEM, dar cu unele extras adăugate și ajustări făcute
  • Plugin-ul postcss-bem oferă comenzi rapide pentru crearea de clase BEM și SUIT, cum ar fi @component, @descendent, @modifier etc.
  • Pluginul permite, de asemenea, ca codul să fie imbricat într-un mod util, de ex. modificatorii sunt imbricați în interiorul componentei sau al blocului pe care îl modifică.
  • Păstrarea numelor poate fi efectuată automat prin împachetarea clasei cu @ name-name-component-component ...

În Următorul tutorial

Urmează o altă modalitate excelentă de a profita de PostCSS, și anume prin a pune împreună un set de instrumente de scurtătură și scurtături pe care le putem lua pentru a face codificarea noastră mai rapidă și mai eficientă.

ne vedem acolo!