Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ITCSS + BEM + Namespaces = Normandy CSS

ITCSS + BEM + Namespaces = Normandy CSS

Una proposta d'organització per mantenir una arquitectura escalable de CSS en els projectes de Calidae.

Avatar for Adrià Fontcuberta

Adrià Fontcuberta

May 16, 2017
Tweet

More Decks by Adrià Fontcuberta

Other Decks in Programming

Transcript

  1. Una proposta una mica sensata per mantenir una arquitectura escalable

    del CSS en els projectes de Calidae. CSS IS AWESOME AND BEERS
  2. CSS escalable? CSS fàcil d’entendre i de mantenir? CSS fàcil

    de revisar? CSS comú en diversos projectes? (Això existeix…?)
  3. “Convention over configuration” O sigui: reduir el nombre de decisions

    que un desenvolupador ha de prendre. Arribar a acords i mantenir-los.
  4. “[ITCSS] is a fully managed CSS architecture. It’s not a

    framework or library; there’s nothing to download or install. It’s a collection of principles and metrics by which developers should group and order their CSS in order to keep it scalable, terse, logical, and manageable.” - Harry Roberts Arquitectura ITCSS
  5. 3 - Generic 4 - Base Estils de molt baix

    nivell: Normalize.css, box-sizing... Estils base per elements HTML “plans” (<h1>, <img>...)
  6. 5 - Objects Patrons de disseny. Dóna estructura i no

    estil “cosmètic”. Simples i reusables fins i tot entre projectes. Modificar els estils d’un Object és una acció perillosa.
  7. 6 - Components Implementacions concretes de la nostra UI. Reusables

    i flexibles. És on passarem la major part del temps escrivint CSS. Es poden modificar sense conseqüències inesperades.
  8. Objects per reaprofitament Heredables pels components. Un Object està obert

    a extensions i tancat a modificacions. Estils per la distribució (layout). Separen l’estructura de la vista, i els contenidors del contingut. Components per concretesa Reusables i flexibles. Semàntica associada a l’apariència, no al contingut. Estils cosmètics.
  9. Objects per reaprofitament display, position, float, margin, padding, alignment, width,

    clearfix… Components per concretesa colors, borders, font-size, font-family… (i distribució d’elements fills!)
  10. 7 - Utilities Single Responsibility Principle: Amagar un element, afegir

    un marge, centrar un text… Immutabilitat Dissenyades per excepcions Tenen molta especificitat: !important
  11. 7 - Utilities .hidden { display: none !important; } .color-primary

    { color: $color-primary !important; } .width-1/2 { width: 50% !important; }
  12. En resum: Abast ampli Abast limitats Selectors universals Selectors específics

    Baixa especificitat Alta especificitat Output CSS Classes
  13. La majoria d’elements de la UI estan formats d’Objects i

    Components <div class="media testimonial"> ... </div> <div class="media featured-tweet"> ... </div> Com sabem quina classe és un Object i quina un Component?
  14. Namespaces Indicador (prefix) per saber a quina capa pertany cada

    classe. <div class="media testimonial"> ... </div> <div class="media featured-tweet"> ... </div>
  15. Namespaces Indicador (prefix) per saber a quina capa pertany cada

    classe. <div class="o-media c-testimonial"> ... </div> <div class="o-media c-featured-tweet"> ... </div>
  16. Namespaces .o- per Objects .c- per Components .u- per Utilities

    .js- per javascript hooks Les 3 últimes capes del triangle! Separation of Concerns (SoC)
  17. Namespaces .o- per Objects .c- per Components .u- per Utilities

    .js- per javascript hooks .o-pack .c-button .u-text-right .js-featured-items
  18. “Només hi ha dues coses complicades en l’enginyeria del software:

    la invalidació de la caché i posar nom a les coses.” Però… - Phil Karlton
  19. <div class="media user premium"> <img src="" alt="" class="img photo avatar"

    /> <p class="body bio">...</p> </div> Exercici: esborrar totes les classes relacionades amb l’usuari per poder reaprofitar el codi.
  20. <div class="border logged text-normal"> <span class="name">...</span> <span class="role">...</span> </div> <li

    class="border dropdown text-normal"> <a class="adminLink"> <span class="adminMenu">...</span> </a> </li>
  21. Block: L’arrel del component/object. El contenidor. Element: Un element intern

    del Block. Modifier: Una variant / extensió d’un Block o un Element. Nomenclatura BEM
  22. Nomenclatura BEM - Media Object .media { display: flex; align-items:

    flex-start; } .media .body { flex: 1; } .media .image { margin-right: 1em; } <div class="media"> <div class="image">...</div> <div class="body">...</div> </div>
  23. Nomenclatura BEM - Media Object <div class="media"> <div class="media__image">...</div> <div

    class="media__body">...</div> </div> .media { display: flex; align-items: flex-start; } .media__body { flex: 1; } .media__image { margin-right: 1em; }
  24. <div class="o-media"> <div class="o-media__image">...</div> <div class="o-media__body">...</div> </div> Nomenclatura BEM -

    Media Object .o-media { display: flex; align-items: flex-start; } .o-media__body { flex: 1; } .o-media__image { margin-right: 1em; }
  25. Nomenclatura BEM - Media Object .o-media--large { > .o-media__image {

    margin-right: 2em; } } <div class="o-media o-media--large"> <div class="o-media__image">...</div> <div class="o-media__body">...</div> </div>
  26. Nomenclatura BEM - Exemple // BAD .person__head__face {} .person__head__face__eye {}

    .person--female__head {} // GOOD .person {} .person__head {} .person__face {} .person__eye {} .person--female {} .person__eye--blue {}
  27. Nomenclatura BEM - Exemple (2) // BAD .page__sub-content { }

    .page__footer { } .page__copyright { } // GOOD(?) .page { } .content { } .sub-content { } .footer { } .footer__copyright { } Les classes no han de reflectir l’esquelet del DOM.
  28. .btn { font-size: 1.2em; } .promo .btn { font-size: 2em;

    } Una classe, dos outputs. No ens agrada.
  29. .btn { font-size: 1.2em; } .btn--large { font-size: 2em; }

    Immutable Menys específic Reaprofitable Simple
  30. Nomenclatura BEM - Exemple (4) .btnLogin { display: inline-block; padding:

    20px; background-color: #BADA55; color: white; } Base Estructural Cosmètic
  31. Nomenclatura BEM - Exemple (4) .btn { display: inline-block; }

    .btn--large { padding: 20px; } .btn--positive { background-color: #BADA55; color: white; } .btn--small {} .btn--disabled {} .btn--secondary {} .btn--full {} .btn--negative {} ...
  32. “The most reusable components are those with class names that

    are independent of the content” - Nicholas Gallager
  33. <div class="media user premium"> <img src="" alt="" class="img photo avatar"

    /> <p class="body bio">...</p> </div> Exercici: esborrar totes les classes relacionades amb l’usuari per poder reaprofitar el codi.
  34. <div class="o-media c-user c-user--premium"> <img src="" alt="" class="o-media__img c-user__photo c-avatar"

    /> <p class="o-media__body c-user__bio">...</p> </div> Exercici: esborrar totes les classes relacionades amb l’usuari per poder reaprofitar el codi. Si hem aplicat BEM i Namespaces...
  35. <div class="o-media c-user c-user--premium"> <img src="" alt="" class="o-media__img c-user__photo c-avatar"

    /> <p class="o-media__body c-user__bio">...</p> </div> Exercici: esborrar totes les classes relacionades amb l’usuari per poder reaprofitar el codi. 1 Object (o-media)
  36. <div class="o-media c-user c-user--premium"> <img src="" alt="" class="o-media__img c-user__photo c-avatar"

    /> <p class="o-media__body c-user__bio">...</p> </div> Exercici: esborrar totes les classes relacionades amb l’usuari per poder reaprofitar el codi. 1 Object (o-media) 1 Component (c-avatar)
  37. <div class="o-media c-user c-user--premium"> <img src="" alt="" class="o-media__img c-user__photo c-avatar"

    /> <p class="o-media__body c-user__bio">...</p> </div> Exercici: esborrar totes les classes relacionades amb l’usuari per poder reaprofitar el codi. 1 Object (o-media) 1 Component (c-avatar) 1 Component (c-user) 5-Objects/_objects.media.scss 6-Components/_components.avatar.scss 6-Components/_components.user.scss
  38. AFONCU Y U DO DIS xque tantas clases? ¿xque? wow

    much block element xque no me kiere? XQ? XQ? jo posaré !important i al palco... ¿xque? bete en bici wow__such--amaze
  39. - Google Web Developers (https://goo.gl/c7U4JM) “If you’re looking for a

    good way to organize your CSS, BEM is a really good starting point, both from a structure point-of-view, but also because of the simplifications of style lookup.”
  40. Bones pràctiques 1. No utilitzar #IDs 2. Inception Rule 3.

    Encapsular frameworks de tercers 4. CSS linting ...
  41. 1. No utilitzar #IDs ...als fulls d’estil! #loginForm { al:

    palco; } Res supera l’especificitat d’un estil definit en un #id Impossible de reaprofitar Simplifica el codi: com si no existíssin
  42. 2. Inception Rule No arribar mai als 4 nivells de

    profunditat ...i amb menys n’hi ha prou!!
  43. Regla d’or: Sempre que declaris un estil, fes-ho amb la

    menor quantitat de selectors possible. body { div.wrapper { article.featured { > p:first-of-type { font-size: 1.2em; } } }
  44. article#Featured { > p.introText { font-size: 1.2em; } } Regla

    d’or: Sempre que declaris un estil, fes-ho amb la menor quantitat de selectors possible.
  45. .c-featured-news__intro { font-size: 1.2em; } Regla d’or: Sempre que declaris

    un estil, fes-ho amb la menor quantitat de selectors possible.
  46. .block { .block--mod { .block__element { &:hover { font-size: 1.2em;

    } } } Regla d’or: Sempre que declaris un estil, fes-ho amb la menor quantitat de selectors possible. 4 nivells (tot i que només en compten 3)
  47. xD

  48. body.product .content-body-wrapper.tabs-block .switch .offer section.accommodation .content-width .accommodation .select-accommodation-box .list .map

    { width: 100%; height: 300px; } body.product .content-body-wrapper.tabs-block .switch .offer section.accommodation .content-width .accommodation .select-accommodation-box .list .list-content .items .accommodation-info #formAccomodation .accommodation-form .mealplan .select-price input { display: inline-block }
  49. 3. Encapsular frameworks <p class="o-media c-user c-user--premium [ uk-grid uk-width-1-3

    ]"> Realment necessites un altre framework? <p class="uk-grid o-media c-user c-user--premium uk-width-1-1">
  50. Recap 1. Estructura ITCSS: 7 capes 2. Nomenclatura BEM: block__element--mod

    3. Namespacing: prefix de capa 4. Bones pràctiques: IDs, linting, inception rule...
  51. Què hem aconseguit amb tot això? 1. Estructura de selectors

    plana (no nesting) 2. Codi organitzat (ja no escrivim estils al final) 3. Les classes fan una sola cosa, i la fan bé 4. Desacoplem per reaprofitar
  52. ...i a partir d’aquí…? Adoptar la metodologia en nous projectes.

    Aplicar-ne parts a projectes existents (Capa de Settings i Tools? BEM? Bones pràctiques? Encapsular BEM - noBEM?)
  53. Ampliar la guia! ...media queries? ...més Objects (Grid, Layout, Island,

    Bare List....)? ...més namespaces (.is-, .has-)? ...modificar/afegir regles linting? ...magic numbers? ...i a partir d’aquí…?