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. bonnes pratiques au quotidien
    MINI-CONVENTION CSS

    View Slide

  2. 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 dans la section
    • 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)

    View Slide

  3. qui facilitent la vie
    BONNES PRATIQUES

    View Slide

  4. 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)

    View Slide

  5. 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;
    }

    View Slide

  6. 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;
    }


    View Slide

  7. 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

    View Slide

  8. 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)

    View Slide

  9. 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/

    View Slide

  10. produire du code sur le long terme
    MAINTENANCE ET LISIBILITÉ

    View Slide

  11. [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"] {

    }

    View Slide

  12. 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)

    View Slide

  13. 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 {

    }


    View Slide

  14. 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;
    }


    View Slide

  15. 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%;
    }


    View Slide

  16. 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)

    View Slide

  17. 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)

    View Slide

  18. RÉUTILISER LES BLOCS


    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;
    }



    .module {
    overflow: hidden;
    margin: 0;
    background: #fff;
    }
    .fl {
    float: left;
    }
    .fr {
    float: right;
    }

    View Slide

  19. NE PAS TROP RÉUTILISER

    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.


    info : https://blog.goetter.fr/2014/11/10/bien-utiliser-un-framework-css/

    View Slide

  20. accélérez vos productions
    PERFORMANCES

    View Slide

  21. 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;
    }

    View Slide

  22. @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

    View Slide

  23. 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

    View Slide

  24. 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

    View Slide

  25. 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/

    View Slide

  26. plein de bonnes pratiques
    FRONT-END GUIDELINES
    source : https://github.com/bendc/frontend-guidelines

    View Slide

  27. créez (et maintenez) VOTRE convention !
    À VOUS DE JOUER

    View Slide

  28. quelques bonnes ressources
    ALLER PLUS LOIN

    View Slide

  29. 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/

    View Slide

  30. LES MÉTHODOLOGIES
    • OOCSS
    • BEM
    • SMACSS
    • Atomic CSS
    • ITCSS

    View Slide

  31. 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

    View Slide

  32. 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;
    }


    View Slide

  33. OOCSS
    2) séparation entre conteneur et contenu
    .sidebar .button {

    }
    .button-primary {

    }


    View Slide

  34. 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)

    View Slide

  35. 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

    View Slide

  36. ARCHITECTURE CLASSIQUE
    dite « traditionnelle »

    View Slide

  37. ARCHITECTURE « À LA BEM »
    complètement modulaire

    View Slide

  38. LES OUTILS
    • CSSLint
    • CSScomb
    • Beautify
    • Autoprefixer

    View Slide

  39. CSSLINT
    validation *et* bons conseils
    plugins éditeurs : https://github.com/CSSLint/csslint/wiki/IDE-integration

    View Slide

  40. CSSCOMB
    réordonner son CSS
    source : http://csscomb.com/

    View Slide

  41. CSS BEAUTIFY
    ré-indenter et rendre lisible CSS
    plugin Atom : https://atom.io/packages/atom-beautify

    View Slide

  42. AUTOPREFIXER
    ajout automatique des préfixes CSS3
    https://autoprefixer.github.io/

    View Slide

  43. 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.

    View Slide