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

Mini Convention CSS

Mini Convention CSS

Bonnes pratiques, maintenabilité, performances de nos feuilles de styles CSS

Raphael Goetter

May 25, 2016
Tweet

More Decks by Raphael Goetter

Other Decks in Programming

Transcript

  1. GÉNÉRALITÉS • La feuille de style CSS est de préférence

    unique et minifiée et appelée à l'aide d'un élément <link> dans la section <head> • Les versions pour médias alternatifs (print, mobile) sont situées dans la même feuille de styles, en fin de document avec des règles @media • Utiliser un seul mode d’indentation et s’y tenir (espaces, tabulations). Utiliser EditorConfig • Utiliser toujours le même type de guillemets. De préférence des doubles guillemets, exemple : content: ""; • Utiliser toujours des guillemets pour les valeurs dans les sélecteurs, 
 exemple : input[type="checkbox"] • Toujours terminer les déclarations par un ; • Éviter d’utiliser !important • Valider le code avec CSSLint (disponible en plugins d’éditeur de code ou gulp)
  2. MODÈLE DE BOÎTE Opter pour le modèle de boîte CSS3

    (box-sizing: border-box) en début de la feuille de style * { box-sizing: border-box; } html { box-sizing: border-box; } * { box-sizing: inherit; } info : https://blog.goetter.fr/2012/07/27/box-sizing-et-pourquoi-pas/ (ou bien)
  3. TAILLES DE POLICES body { font-size: 14px; } Opter pour

    des tailles de polices fluides (de préférence en rem). html { font-size: 62.5%; } body { font-size: 1.4rem; }
  4. FLUX div { position: absolute; right: 0; } Éviter de

    sortir les éléments du flux (float, position) sans nécessité. div { margin-left: auto; } info : https://github.com/bendc/frontend-guidelines#flow div { float: left; clear: both; width: 100%; } div { float: none; }
  5. POSITIONNEMENT Positionner les éléments en choisissant de préférence parmi ces

    méthodes, dans l’ordre : display: block | inline; display: flex | inline-flex; display: inline-block | table-cell; float: left | right; position: relative | absolute | sticky | fixed; 1 2 3 4 5 ❤
  6. LECTURE li + li { visibility: hidden; } Écrire des

    syntaxes compréhensibles par des êtres humains et des collègues. li:not(:first-child) { visibility: hidden; } (un peu plus lisible)
  7. NAMESPACES Préfixer les classes par « namespace » pour les

    regrouper et les distinguer aisément. .o-container, .o-mod, -o-grid-container { /* objects : éléments génériques multitâches */ } .c-button, .c-nav, -c-lightbox { /* components : éléments concrets */ } .is-opened, .is-hidden, .has-* { /* state : désigne un état ou une condition */ } .js-menu, .js-is-hidden { /* comportement : éléments liés à JavaScript */ } info : http://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/
  8. [type="submit"] { … } POIDS DES SÉLECTEURS ul.nav li a.navlink

    { … } Éviter de surcharger un sélecteur, car cela lui ajoute du poids inutilement. .navlink { … } info : http://cssspecificity.com/ input[type="submit"] { … }
  9. SÉLECTEUR #ID #nav a { … } Éviter d’utiliser le

    sélecteur d’id, son poids est trop important et difficile à maintenir, éviter également le bazooka !important [id="nav"] a { … } .nav a { … } info : http://maintainablecss.com/chapters/ids/ (ou bien)
  10. SÉLECTEURS DE STRUCTURE div > h1 + p { …

    } Éviter les sélecteurs associés à la structure HTML, un élément doit pouvoir être ciblé quel que soit son conteneur ou son emplacement dans le DOM. .intro { … } #navigation h2, #sidebar h2 { … } .h2-like { … } info : https://github.com/bendc/frontend-guidelines#selectors .sidebar .button { … } .button-primary { … }
  11. STRUCTURE ET APPARENCE .button { display: inline-block; padding: 1em; background:

    blue; color: white; } Séparer la structure de l’apparence dans les sélecteurs pour faciliter la factorisation. .button { display: inline-block; } .button-large { padding: 1em; } .button-primary { background: blue; color: white; }
  12. FACTORISER LES PROPRIÉTÉS body::before { content: ""; position: absolute; top:

    40%; background: #fff; } body::after { content: ""; position: absolute; top: 20%; background: #fff; } Toujours tenter de rassembler les propriétés identiques. body::before, body::after { content: ""; position: absolute; top: 40%; background: #fff; } body::after { top: 20%; }
  13. SURCHARGE li { visibility: hidden; } li:first-child { visibility: visible;

    } Éviter d’écraser une règle par une autre. li + li { visibility: hidden; } info : https://github.com/bendc/frontend-guidelines#overriding li:not(:first-child) { visibility: hidden; } (ou bien)
  14. REDONDANCES li { color: red; } div { color: #F00;

    } p { color: #FF0000; } li { color: $color; } div { color: $color; } p { color: $color; } Utiliser des pré-processeurs (Sass, LESS, Stylus) pour éviter les répétitions de code. $color: #F00; doc : http://sass-lang.com/ (Sass)
  15. RÉUTILISER LES BLOCS <div class="module-left"></div> <div class="module-right"></div> Grouper les éléments

    par composants réutilisables. .module-left { overflow: hidden; float: left; margin: 0; background: #fff; } .module-right { overflow: hidden; float: right; margin: 0; background: #fff; } <div class="module fl"></div> <div class="module fr"></div> .module { overflow: hidden; margin: 0; background: #fff; } .fl { float: left; } .fr { float: right; }
  16. NE PAS TROP RÉUTILISER <div class="mod clearfix left inbl w200p

    pas mb1 lg-mb2 sm-mbn"></div> Se limiter à 4 noms de classes au maximum par élément HTML. 
 Si l’on pense qu’il en faut davantage, il est temps d’envisager une classe personnalisée. <div class="nom-de-classe-spécifique"></div> info : https://blog.goetter.fr/2014/11/10/bien-utiliser-un-framework-css/
  17. ANIMATIONS GOURMANDES div:hover { margin-left: 100px; transition: .5s; } Éviter

    d’animer des propriétés autres que transform ou opacity , ou alors ajouter la propriété will-change et/ou le hack de translateZ(). div:hover { transform: translateX(100px); transition: .5s; } info : https://csstriggers.com/ div:hover { margin-left: 100px; will-change: margin-left; transition: .5s; }
  18. @FONT-FACE PERFORMANT @font-face { font-family: kiwi;
 src: url("/fonts/kiwi.eot?#iefix") format("embedded opentype");


    src: url("/fonts/kiwi.eot?#iefix") format("embedded opentype"), url("/fonts/kiwi.woff2") format("woff2"),
 url("/fonts/kiwi.woff") format("woff"), url("/fonts/kiwi.ttf") format("truetype"), url("/fonts/kiwi.svg#svgFontName") format("svg"); } N’imposez pas de chargements aux anciens navigateurs (IE8). Privilégiez .woff2. Conservez l’astuce du #iefix @font-face { font-family: 'kiwi'; src: url('kiwi.woff2?#iefix') format('woff2'), url('kiwi.woff') format('woff'); } info : https://twitter.com/kaelig/status/609362210759012353
  19. PROPRIÉTÉS RACCOURCIES div { top: 50%; margin-top: -10px; flex-grow: 1;

    flex-basis: 0; padding-top: 5px; padding-right: 10px; padding-bottom: 20px; padding-left: 10px; } Préférer les propriétés raccourcies. div { top: calc(50% - 10px); flex: 1; padding: 5px 10px 20px; } source : https://github.com/bendc/frontend-guidelines#brevity-1
  20. UNITÉS div { margin: 0px; font-size: 0.9rem; line-height: 2em; border:

    none; } L’unité est inutile si la valeur est nulle. Ne pas donner d’unité à line-height. div { margin: 0; font-size: .9rem; line-height: 2; border: 0; } source : https://github.com/bendc/frontend-guidelines#units
  21. PRÉFIXES VENDEURS div { transform: scale(2); -webkit-transform: scale(2); -moz-transform: scale(2);

    -ms-transform: scale(2); transition: 1s; -webkit-transition: 1s; -moz-transition: 1s; -ms-transition: 1s; } Automatiser la gestion des préfixes à l’aide de Autoprefixer, ne pas le faire à la main et ne pas utiliser un mixin Sass/LESS pour cela. div { transform: scale(2); transition: 1s; } div { -webkit-transform: scale(2); transform: scale(2); transition: 1s; } (Autoprefixer) Autoprefixer : https://autoprefixer.github.io/
  22. LES CONVENTIONS DES AUTRES • Google HTML / CSS style

    guide • GitHub CSS styleguide • WordPress CSS coding standards • WordPress HTML coding standards • Idiomatic CSS • Trello CSS styleguide compil : css-tricks.com/css-style-guides/
  23. OOCSS à la recherche de « patterns visuels » Le

    concept de OOCSS est de repérer des « objets CSS », c'est-à-dire des « patterns visuels » qui se répètent, et de définir ainsi des classes réutilisables. OOCSS met en avant deux principes : 1. Le principe de séparation de la structure et de l'apparence ; 2. Le principe de séparation du conteneur et du contenu. Nicole Sullivan
  24. OOCSS 1) séparation entre structure et apparence .button { display:

    inline-block; padding: 1em; background: blue; color: white; } .button { display: inline-block; } .button-large { padding: 1em; } .button-primary { background: blue; color: white; }
  25. BEM « block - element - modifier » 1. Block


    entité indépendante et autonome 2. Element
 partie d’un Block 3. Modifier
 variante d’un Block ou Element .block { } .block__element { } .block__element--modifier { } .nav { } .nav__link { } .nav__link--active { } (en théorie) (en pratique)
  26. BEM principes généraux Les blocs et les éléments doivent chacun

    avoir un nom unique, lequel sera utilisé comme classe CSS 1 Les sélecteurs CSS ne doivent pas utiliser les noms des éléments HTML 
 (pas de nav) 2 Les cascades dans les sélecteurs CSS devraient être évitées 
 (pas de .menu .list) 3
  27. CSS BEAUTIFY ré-indenter et rendre lisible CSS plugin Atom :

    https://atom.io/packages/atom-beautify
  28. LES PLUGINS INDISPENSABLES • EMMET : raccourcis clavier ++ (Emmet,

    c’est la vie) • HTMLhint : affiche les erreurs de validation • CSSlint : affiche les erreurs de CSS et les conseils “OOCSS” • JShint / JSlint : vérification de syntaxe JavaScript • Beautify : ré-indentation, ré-agencement des fichiers JS, HTML et CSS • Autoprefixer : ajout de préfixes automatiques • Minifier : Minifie CSS (et JavaScript) dans un fichier *.min.css • CSScomb : réordonne les propriétés CSS dans leur ordre d’importance • etc.