# Ajouter un framework CSS ou des icônes
Je présente ici 3 framework/bibliothèque CSS, dans mon ordre de préférence. Il faut en choisir un, et surtout ne pas les mélanger :
En tout dernier, je présente une très bonne et très grande bibliothèque d'icônes : Font Awesome (opens new window) avec la bonne façon de l'intégrer au projet.
Il y en a d'autres : Material Design Icons (opens new window), icomoon (opens new window)...
# Ajouter tailwindcss
Pour ajouter ce très bon "framework" CSS qu'est tailwindcss (opens new window), il y a la façon simple mais pas très propre, et la bonne façon.
Il est basé sur normalize.css (comme bootstrap) de Nicolas Gallagher ou @necolas sur github. Il ne faut donc pas importer les deux, cela est inutile.
# Ajouter tailwindcss façon "Quick & dirty"
De manière simple, on peut ajouter tailwindcss comme "normalement" c'est-à-dire et comme décrit dans ce cours.
On peut donc ajouter dans index.html
la ligne suivante à l'intérieur de la balise head
:
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/1.2.0/tailwind.min.css" />
Mais cela veut dire qu'on va embarquer un grand nombre de styles que notre application n'utilisera pas : l'utilisateur va télécharger un gros fichier CSS alors qu'un beaucoup plus petit serait suffisant.
# La bonne manière
Avec parcel (opens new window) (ça fonctionne aussi avec webpack, un autre bundler), on peut "importer" du CSS comme on importe du JavaScript, avec la syntaxe import
.
Installer tailwindcss :
npm i tailwindcss
Créer un fichier main.css
avec ce contenu (qui se trouve sur le site officiel de tailwindcss (opens new window)) :
@tailwind components;
@tailwind utilities;
Et ensuite dans main.js
:
import './main.css'
Enfin, dans index.html
, modifiez les balises suivantes :
- la balise
<body>
pour avoir les classesfont-sans p-0 m-0
; - la balise
<header>
les classesm-0 p-1 sticky top-0 shadow bg-white
; - la balise
<h1>
la classe suivante :text-center
; - et la balise
<footer>
les classes suivantes :text-center py-2 bg-purple-700 text-white fixed w-full bottom-0
Mettre 2 espaces entre les noms de classe permet de rendre plus évident qu'il s'agit bien de classes différentes.
Regarder le résultat
# Aller plus loin avec tailwindcss
# Composer les classes tailwind
On peut utiliser la règle @apply pour réutiliser les styles. Au lieu d'écrire
<footer class="text-center py-2 bg-purple-700 text-white fixed w-full bottom-0">
Ce serait plus lisible, et plus réutilisable d'écrire :
<footer class="main-footer">
Pour rendre cela possible, il faut ajouter un plugin à postcss (qui traite le code CSS), et donc l'ajouter en tant que dépendance :
~/dev/projects/esilv-scratch/client $ npm i -D postcss-apply
Et l'ajouter à la configuration de postcss en créant un nouveau fichier postcss.config.js
(à mettre dans le dossier client
) avec ce contenu :
module.exports = {
plugins: {
tailwindcss: {},
'postcss-apply': {},
}
Une fois cela fait, il est possible d'utiliser @apply
dans le code CSS.
Ajouter dans main.css
le code suivant :
.main-footer {
@apply text-center py-2 bg-purple-700 text-white fixed w-full bottom-0;
}
Et voilà, il est désormais possible d'utiliser la classe main-footer
dans notre code HTML.
# Ajouter bulma
Bulma (opens new window) est aussi un très bon framework uniquement CSS (pas de JavaScript, comme tailwind), et est le plus simple à installer et à utiliser.
### Installer la dépendance
npm i bulma
Ajouter cette ligne dans main.css
:
@import 'bulma';
Il est conseillé de purger les CSS avec purgecss (cf. plus loin).
# Ajouter bootstrap
Bootstrap (opens new window), contrairement aux 2 autres, n'est pas seulement une bibliothèque CSS, mais une bibliothèque de composants complets, avec gestion des interactions utilisateurs, et donc embarque aussi du JavaScript. Il est donc un peu plus difficile de l'ajouter à un projet.
Bootstrap dépend (encore?!) de jquery (opens new window), et de popper (opens new window), il faut donc les installer aussi. Bootstrap est fait en SASS, sass sera donc installé aussi.
Installer toutes les dépendances :
npm i bootstrap jquery popper
Dans main.js
:
import 'bootstrap'
import './main.scss'
Dans main.scss
/*
Éventuellement ici des personnalisations
*/
@import "~bootstrap/scss/bootstrap";
Cf. le site officiel (opens new window) pour plus de détail pour la personnalisation (opens new window).
# Purger les CSS non utilisés
Les classes de ces bibliothèques sont très nombreuses, et on n'en utilise qu'une petite partie. Il convient donc de traiter le CSS pour en expurger que l'essentiel. Pour cela, on peut utiliser PurgeCSS (opens new window) à travers un plugin parcel dédié :
npm install -D parcel-bundler parcel-plugin-purgecss
Ensuite, créer un fichier purgecss.config.js
dans le dossier client
avec ce contenu :
module.exports = { content: ["**/*.html"], }
# Ajouter font-awesome
Fontawesome (opens new window) est une très grande bibliothèque d'icones.
# Ajouter font-awesome façon "Quick & dirty"
Ajouter cette balise link
dans le head
de vos documents html :
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/css/all.min.css" integrity="sha256-h20CPZ0QyXlBuAw7A+KluUYx/3pK+c7lYEpqLTlxjYQ=" crossorigin="anonymous" />
Inconvénients : les visiteurs de votre site téléchargeront toutes les icônes de font-awesome, alors que vous n'en utiliserez qu'une (toute) petite partie.
# Mieux : importer uniquement le nécessaire
Ajouter font-awesome dans les dépendances :
npm i @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons
Et dans main.js
, ajouter ce contenu (dans l'exemple, seules les icônes archway, ad et brain seront importées et donc utilisables) :
import { library, dom } from '@fortawesome/fontawesome-svg-core'
import { faArchway, faAd, faBrain } from '@fortawesome/free-solid-svg-icons'
// Utiliser uniquement les icônes archway, ad et brain
library.add(faArchway, faAd, faBrain)
dom.i2svg()
Importé de cette façon, le bundle ne contiendra que les icônes font-awesome que vous aurez ajoutées !
# Le mieux du mieux : importer uniquement le nécessaire, et observer les changements du DOM
Ajouter font-awesome dans les dépendances :
npm i @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons
Et dans main.js
, ajouter ce contenu (dans l'exemple, seules les icônes archway, ad et brain seront importées et donc utilisables) :
import { library, dom } from '@fortawesome/fontawesome-svg-core'
import { faArchway, faAd, faBrain } from '@fortawesome/free-solid-svg-icons'
// Utiliser uniquement les icônes archway, ad et brain
library.add(faArchway, faAd, faBrain)
// Remplacer toutes les balises <i class="fa..."> par un <svg> et utiliser un MutationObserver pour
// continuer à le faire quand le DOM change.
dom.watch()
Importé comme cela aussi, le bundle ne contiendra que les icônes font-awesome que vous aurez ajoutées !
De plus, dès que le dom changera, les balises <i class="fa...">
seront remplacées par les icônes en svg : idéal pour les SPA (Single Page Application) faites avec React, Vue.js ou autres. Plus de détails sur le site officiel (opens new window).