layout: true
Intégration web et bonnes pratiques avec les CSS par
Manon Carbonnel
2020
--- class: cover .highlight[] # Integration web .subtitle[Bonnes pratiques en CSS: Intégration avec préprocesseurs et frameworks frontend] .line[] .image-center[  ] --- class: content .highlight[] ## Quelques rappels .subtitle[CSS avec superpouvoirs] .line[] Les préprocesseurs sont des extensions de langage pour CSS. Ils ne font que quelques ajouts pratiques au langage CSS, ce qui fait qu'il est très rapide de les apprendre. .image-mini[  ] Leaner Style Sheets .image-mini[  ] Syntactically Awesome Style Sheets --- class: content .highlight[] ## Emboîtage .subtitle[Hiérarchie et portée] .line[] .col[ Lors de l'écriture de HTML, vous avez probablement remarqué qu'il a une hiérarchie imbriquée et visuelle claire. CSS, en revanche, non: ```css nav ul { margin: 0; padding: 0; list-style: none; } nav li { display: inline-block; } nav a { display: block; padding: 6px 12px; text-decoration: none; } ``` ] .col[ ] --- class: content .highlight[] ## Imbrication .subtitle[Hiérarchie et portée] .line[] .col[ Lors de l'écriture de HTML, vous avez probablement remarqué qu'il a une hiérarchie imbriquée et visuelle claire. CSS, en revanche, non: ```css nav ul { margin: 0; padding: 0; list-style: none; } nav li { display: inline-block; } nav a { display: block; padding: 6px 12px; text-decoration: none; } ``` ] .col[ Les préprocesseurs vous permettront d'imbriquer vos sélecteurs CSS d'une manière qui suit la même hiérarchie visuelle de votre HTML. *Une trop grande imbrication de règles est considérée comme une mauvaise pratique.* ```scss // SCSS ou LESS nav { ul { margin: 0; padding: 0; list-style: none; } li { display: inline-block; } a { display: block; padding: 6px 12px; text-decoration: none; } } ``` ] --- class: content .highlight[] ## Variables .subtitle[Réutilisabilité] .line[] .col[ Il n'est pas rare de voir la même valeur répétée des dizaines, voire des centaines de fois sur vos feuilles de style: ```css .link { color: #428bca; } .widget { color: #fff; background: #428bca; } ``` ] .col[ ] --- class: content .highlight[] ## Variables .subtitle[Réutilisabilité] .line[] .col[ Il n'est pas rare de voir la même valeur répétée des dizaines, voire des centaines de fois sur vos feuilles de style: ```css .link { color: #428bca; } .widget { color: #fff; background: #428bca; } ``` ] .col[ Les variables facilitent la maintenance du code en donnant un moyen de contrôler ces valeurs à partir d'un seul emplacement. On peut y stocker des éléments tels que des couleurs, des polices de caractère ou toute valeur CSS qu'on peut penser vouloir réutiliser. .col[ ```less // LESS @sea-blue: #428bca; .link { color: @sea-blue; } .widget { color: #fff; background: @sea-blue; } ``` ] .col[ ```scss // SCSS $sea-blue: #428bca; .link { color: $sea-blue; } .widget { color: #fff; background: $sea-blue; } ``` ] ] --- class: content .highlight[] ## Variables .subtitle[Sélecteurs parents] .line[] .col[ L'opérateur `&` représente les sélecteurs parents d'une règle imbriquée : ```less // SCSS ou LESS a { color: blue; &:hover { color: green; } } ``` ] .col[ ] --- class: content .highlight[] ## Variables .subtitle[Sélecteurs parents] .line[] .col[ L'opérateur `&` représente les sélecteurs parents d'une règle imbriquée : ```less // SCSS ou LESS a { color: blue; &:hover { color: green; } } ``` ] .col[ Cela fonctionne également avec les noms de classe et aide à gérer le système de *portée*: ```less // SCSS ou LESS .navbar { color: blue; &-button { // output : .navbar-button in CSS color: green; } } ``` Vraiment pratique lors de l'utilisation de conventions de nommage telles que BEM. ] --- class: content .highlight[] ## Partials .subtitle[Rendre le tout modulaire] .line[] Un partiel est un fichier Sass ou Less nommé avec un trait de soulignement en tête. Vous pouvez lui donner un nom comme «_partial.scss» ou «_partial.less». Le trait de soulignement permet au préprocesseur de savoir que le fichier n'est qu'un fichier partiel et qu'il ne doit pas être généré dans un fichier CSS séparé. Les partiels sont utilisés avec la règle ** @import**. ```scss // LESS or SCSS @import "partial"; // No need to include the file extension ``` .line[] **Dans SASS, la règle @import va devenir, lentement mais sûrement, obsolète et remplacée par la règle @use. Cependant, elle est toujours utilisée dans les frameworks frontend.** Vous pouvez utiliser l'outil sass-migrator et le module migration pour vous aider à mettre à jour votre code [https://sass-lang.com/documentation/cli/migrator](https://sass-lang.com/documentation/cli/migrator). --- class: content .highlight[] ## Sass Modules .subtitle[Rendre le tout modulaire] .line[] Un module est comme un partiel auquel est ajouté un espace de noms. Les modules Sass sont également utilisés avec la règle **@use**. ```scss // _module.scss $primary-color: #333; ``` ```scss // SCSS @use 'module'; .inverse { background-color: module.$primary-color; color: white; } ``` --- class: content .highlight[] ## Mixins .subtitle[Mélanger les propriétés à partir de styles existants] .line[] Les mixins vous permettent de créer des groupes de déclarations CSS que vous souhaitez **réutiliser** dans vos feuilles de style. Vous pouvez même leur passer des valeurs en paramètre pour rendre vos mixins plus flexibles. *Une bonne utilisation d'un mixin est pour *$les préfixes de vendors** (règles non standard ou expérimentales), mais je préfère utiliser un autoprefixeur* .col[ ```scss // SCSS @mixin transform($property) { -webkit-transform: $property; -ms-transform: $property; transform: $property; } .box { @include transform(rotate(30deg)); } ``` ] .col[ ```css /* CSS */ .box { -webkit-transform: rotate(30deg); -ms-transform: rotate(30deg); transform: rotate(30deg); } ``` ] --- class: content .highlight[] ## Mixins .subtitle[Utiliser une règle comme un mixin] .line[] .col[ ```less // LESS .my-mixin { color: black; } .my-other-mixin() { background: white; } .class { .my-mixin(); .my-other-mixin(); } ``` ] .col[ ```css /* CSS */ .my-mixin { color: black; } .class { color: black; background: white; } ``` ] --- class: content .highlight[] ## Less functions .subtitle[Utiliser une fonction dans une règle] .line[] Less offre de nombreuses fonctions intégrées à utiliser dans les feuilles de style. Je n'en utilise pas beaucoup, sauf pour les opérations sur les couleurs. Elles nécessitent toutes les mêmes paramètres : * `color`: un objet couleur. * `amount`: Un pourcentage de 0 à 100%. * `method`: facultatif, défini sur relative pour que l'ajustement soit relatif à la valeur actuelle. .line[] .col[ ```less // LESS .elem:hover { color: saturate(#80e619, 20%); color: desaturate(#80e619, 20%); color: lighten(#80e619, 20%); color: darken(#80e619, 20%); } ``` ] .col[ .line[] .image-mini-block[  ] .image-mini-block[  ] .image-mini-block[  ] .image-mini-block[  ] ] --- class: content .highlight[] ## Qualité de code .subtitle[] .line[] .image-center[  ] --- class: content .highlight[] ## Qualité de code .subtitle[Linters et post-processeurs] .line[] .col[ [Stylelint](https://github.com/stylelint/stylelint) est un linter qui vous aide à éviter les erreurs et à suivre des conventions de code dans vos feuilles de style. Vous pouvez le configurer pour qu'il fonctionne dans votre IDE Jetbrains préféré. Voir le fichier Stylelint [README.md](../../../quality-tools-tutorials/stylelint/README.md). .line[] .line[] .line[] .line[] .image-mini[  ] ] .col[ [PostCSS](https://github.com/postcss/postcss) est un outil pour transformer les feuilles de style avec des plugins JS. Il propose plus de 200 plugins, dont quelques-uns très sympa : - [autoprefixer](https://github.com/postcss/autoprefixer) (ajoute automatiquement les préfixes des vendors à vos règles) - [stylelint](https://github.com/stylelint/stylelint) (un linter de feuilles de style modulaire). - [doiuse](https://github.com/anandthakker/doiuse) (un linter pour l'analyse de compatibilité avec les navigateurs). Voir le fichier PostCSS [README.md](../../../quality-tools-tutorials/post-css/README.md). .image-mini[  ] ] --- class: content .highlight[] ## Source maps .subtitle[Identifier la source d'une règle] .line[] Une **source map** est un fichier spécial qui connecte une version minifiée d'un actif (CSS ou JS) à la version originale créée. Très utile pour débugger les règles CSS. Devez-vous les déployer sur **l'environnement de production** ? En réalité c'est à vous de décider car ils sont assez légers et ne gênent pas les performances. --- class: content .highlight[] ## Compilation .subtitle[] .line[] .image-center[  ] --- class: content .highlight[] ## Utilisation de la ligne de commande .subtitle[Commandes intégrées] .line[] Vous pouvez compiler vos fichiers `.scss` ou` .less` en utilisant les outils intégrés en ligne de commande. .col[ .image-mini[  ] Le binaire inclus, `bin/lessc`, fonctionne avec NodeJS. Il offre une [commande de build](http://lesscss.org/usage/#command-line-usage-command-line-usage) simple mais limitée, et une [configuration de watcher](http://lesscss.org/usage/#using-less-in-the-browser-watch-mode): ```shell-script $ lessc bootstrap.less bootstrap.css ``` Il a également une option pour les source maps : ```shell-script $ lessc bootstrap.less bootstrap.css --source-map ``` ] .col[ .image-mini[  ] Ce préprocesseur propose un [exécutable Dart Sass](https://sass-lang.com/documentation/cli/dart-sass) plus riche avec différents modes : ```shell-script $ sass style.scss:style.css $ sass light.scss:light.css dark.scss:dark.css $ sass themes:public/css ``` Et propose une ligne de commande `watch` : ```shell-script $ sass --watch themes:public/css ``` Il a également plus d'options comme la compression et la génération de source maps: ```shell-script $ sass --style=compressed style.scss:style.min.css ``` ] --- class: content .highlight[] ## Task runners .subtitle[Intégration dans l'IDE] .line[] Les IDE Jetbrains proposent des outils de compilation et des watchers pour les préprocesseurs. Ils utilisent les outils de ligne de commande intégrés au préprocesseur. Voir les fichiers SASS [README.md](../../../quality-tools-tutorials/sass/README.md#file-watchers) et LESS [README.md](../../../quality-tools-tutorials/less/README.md#file-watchers). .line[] .image-mini[  ] .image-mini[  ] .image-mini[  ] .image-mini[  ] .image-mini[  ] .image-mini[  ] --- class: content .highlight[] ## Task runners .subtitle[Webpack] .line[] Vous pouvez également utiliser des task runners externes pour compiler vos feuilles de style. [Webpack] (https://webpack.js.org/) est un bon exemple car il optimise également les fichiers .js et images. .line[] Ce task runners utilise des [loaders de style](https://webpack.js.org/loaders/#styling) dédiés à SASS et LESS, mais aussi d'autres dédiés à la qualité de code tels que PostCSS. Voir le fichier WebPack [README.md](../../../quality-tools-tutorials/webpack/README.md). .line[] .image-mini[  ] --- class: content .highlight[] ## Frameworks frontend .subtitle[] .line[] .image-center[  ] --- class: content .highlight[] ## Frameworks frontend .subtitle[] .line[] .col[ Je vous conseille vivement d'utiliser un framework frontend comme **Bootstrap**, **Materialize** ou **Bulma**... Ils contiennent des composants déjà prêts en CSS et JS. .line[] .line[] .image-mini[  ] .image-mini[  ] .image-mini[  ] ] .col[ Installez-les à l'aide d'un package manager comme **NPM**, **Yarn**... Versionnez et partagez uniquement vos fichiers de configuration pour la construction du projet. .line[] .line[] .image-mini[  ] .image-mini[  ] ] --- class: content .highlight[] ## Frameworks frontend .subtitle[] .line[] Une fois que vous avez installé le framework, regardez l'architecture de ses feuilles de style. **Essayez de respecter la même dans les feuilles de style de votre projet.** .col[ Par exemple, **Bootstrap** utilise Sass: .image-max-height[  ] ] .col[ Architecture de mon projet: .image-max-height[  ] ] --- class: content .highlight[] ## Frameworks frontend .subtitle[] .line[] Il existe deux façons de charger les feuilles de style d'un framework dans votre projet. **1** Vous pouvez charger son fichier dist minifié, séparément du CSS principal de votre projet: ```html
``` .line[] **2** Ou vous pouvez `@import` dans votre fichier d'entrée `theme.scss` et charger le fichier point d'entrée du framework. Soit l'ensemble des feuilles de style du framework, *soit* les variables et toute feuille de style des composants dont vous pourriez avoir besoin, vous permettant un **override** si nécessaire. .col[ ```html
``` ] .col[ ```scss /* Libraries */ @import '../node_modules/bootstrap/scss/bootstrap'; /* Custom variables */ @use 'variables'; /* Components */ @use 'components/badges'; @use 'components/buttons'; @use 'components/cards'; @use 'components/forms'; /* Global */ @use 'layout'; ``` ] --- class: cover .highlight[] # Merci ! .line[] .line[] .image-center[  ]