React - Bibliothèque Javascript pour le frontend

Auteur: Mohamed CHINY Durée necessaire pour le cours de React - Bibliothèque Javascript pour le frontend Niveau recommandé pour le cours de React - Bibliothèque Javascript pour le frontend Supports vidéo disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz non disponibles pour ce cours

Page 13: Ajouter des styles CSS à une application React

Toutes les pages

Appliquer du style CSS à nos composants

Dans une application React, la présentation de l'interface est primordiale, ce qui est tout à fait naturel puisqu'on parle du frontend. Donc, le design et la présentation de l'interface graphique c'est ce qui frappe au yeux le premier quand une application est chargée. De plus, un bon design et un agencement propre des éléments de la vue contribuent significativement à l'amélioration de l'expérience utilisateur (UX).

Pour intégrer des styles CSS à une application React, il existe de nombreuses méthodes, en l'occurrence, l'utilisation des feuilles de styles externes (importées), l'intégration d'un inline CSS, l'utilisation de CSS Modules et l'adoption d'un frameworks approprié comme Tailwind CSS.

Utiliser des feuilles de styles externes (importation de styles)

Dans la leçon consacrée à la création d'une nouvelle application React, nous avons exploré l'environnement de travail qui a été généré automatiquement (à travers l'outil create-react-app) et nous avons identifié les fichiers et dossiers importants d'un projet React. Parmi les dossiers les plus importants, il y a src qui renferme les codes des composants ainsi que d'autres ressources importantes, en l'occurrence, les fichiers index.css et App.css.

Bien que ces deux fichiers là puissent servir à la même chose, il est conseillé de consacrer le fichiers index.css aux styles globaux de l'application, comme les arrière-plans, les marges, les polices... Quant au fichier App.css, il est surtout prévu pour styler les composants de façon personnalisée.
Il est possible de créer vos propres fichiers CSS dans le répertoire src puis les importer exactement comme c'est le cas pour les deux fichiers précédents.

On considère maintenant que l'on va nous servir du fichier App.css.

On commence par vérifier si le fichier App.css est bien importé dans le fichier App.js qui implémente le composant principal. Normalement, si vous n'avez pas modifié le code après la génération du projet, cette importation est déjà faite. En tout cas, vous devriez avoir cette instruction d'importation:
import './App.css'

Dans le fichier App.css, vous avez du CSS classique, c'est à dire, des sélecteurs et des propriétés CSS. On peut aussi avoir des règles at (@) comme les importations, les media queries, les keyframes... Je vous renvoie vers mon cours de CSS si vous voulez plus de détails.

Généralement, on préfère utiliser l'attribut class pour appliquer du CSS à nos éléments. Cependant, le mot-clé class étant réservé en Javascript (qui est le moteur du JSX), alors on utilise l'attribut className à la place, comme ceci:
import './App.css'

function App() {
   return (
      <>
         <h1 className="h1class">
            Mon application React
         </h1>
      </>
   );
}

export default App;
Dans le fichier App.css on ajoute ce style par exemple:
.h1class{
   color:#FFF;
   background-color:#000;
   padding:10px
}
Sur le navigateur, on est sensé avoir quelque chose comme ça:

Mon application React

Appliquer un inline CSS (Attribut de style local)

Un inline CSS s'applique localement aux éléments que l'on veut styler. Cela nous rappelle l'attribut de style local qu'on a vu dans le cours de CSS.

La différence avec le HTML, c'est que la valeur à appliquer à l'attribut style doit être un objet Javascript. Donc, si on reprend l'exemple précédent on devrait avoir quelque chose qui ressemble à ceci:
function App() {
   const monStyle={
      color:'#FFF',
      'background-color':'#000',
      padding:'10px',
      margin:0
   }
   return (
      <>
         <h1 style={monStyle}>
            Mon application React
         </h1>
      </>
   );
}

export default App;
N'oubliez pas de procéder à l'interpolation JSX pour intégrer la valeur de l'attribut style, car il s'agit là d'une variable Javascript.
Vous avez certainement remarqué que j'ai encadré la propriété background-color par des guillemets. En effet, les propriétés composées (qui contiennent des tirets) ne sont pas permises à moins de les placer dans des quotes. Cependant, la bonne pratique consiste à utiliser une écriture camelCase qui caractérise le Javascript. Donc la propriété devient backgroundColor (sans guillemets).
On peut intégrer l'objet Javascript qui fait office de style directement dans l'élément h1 comme ceci:
function App() {
   return (
      <>
         <h1 style={{
            color:'#FFF',
            backgroundColor:'#000',
            padding:'10px',
            margin:0
         }}>
            Mon application React
         </h1>
      </>
   );
}

export default App;
Cette fois, j'ai utilisé une écriture en camelCase pour le style composé.

CSS Modules - Un outil puissant pour éviter les conflits entre styles

Avec les applications React qui deviennent de plus en plus grandes, on est souvent amené à créer des feuilles de styles personnalisées que l'on importera ensuite selon le besoin. Le souci avec cette technique, c'est qu'il y a un grand risque de conflit entre styles. En effet, il se peut bien que l'on réutilise la même classe dans des feuilles différentes, ce qui engendrera une confusion souvent difficile à repérer. La solution consiste à rendre les classe uniques, c'est à dire, au moment de l'exécution de l'application, des noms de classes seront regénérés de telle sorte que leurs noms soient uniques. En plus, la portée des styles sera locale au composant qui a importé la feuille de style. Ce qui est plutôt très pratique.

Afin de réussir cette tâche on fait appel aux CSS Modules. Il s'agit simplement de fichiers CSS que l'on crée dans le dossier src et dont le nom est suffixé par .module.css.

Par exemple, on crée un fichier nommé App.module.css qui contient le style vu précédemment. Ensuite, dans le composant App on intègre le code suivant:
import styles from './App.module.css'

function App() {

   return (
      <>
         <h1 className={styles.h1class}>
            Mon application React
         </h1>
      </>
   );
}

export default App;
Dans l'importation, on doit indiquer le nom que l'on souhaite attribuer au module (styles dans notre cas). Ensuite, au moment de l'application du style, il suffit de préfixer la classe par ce nom là. Donc styles.h1class.

Si on inspecte l'élément h1 sur le navigateur, on aura quelque chose qui ressemble à ceci:
<h1 class="App_h1class__Ws0a5">
   Mon application React
</h1>
Vous avez remarqué que la classe a été renommée de telle sorte à ce qu'elle soit unique.

Utiliser un framework comme Tailwind CSS

Il existe de nombreux frameworks pour le CSS qui permettent d'appliquer un look rapidement en invoquant des styles prédéfinis mais personnalisables. Le plus célèbre est sans doute Boostrap qui facilite l'intégration d'un design responsive. Cependant, un autre framework nommé Tailwind CSS devient de plus en plus apprécié par les intégrateurs.

Tailwind CSS est un framework dit Utility-First. C'est à dire qu'il favorise l'utilisation d'une grande collection de classes prêtes à l'emploi. Contrairement à Bootstrap qui propose des styles pour des composants entiers (comme les boutons), Tailwind CSS propose des classes qui appliquent des styles de base comme les marges, les bordures, les polices... En combinant ces classes là, on obtient un design complet des composants tout en conservant l'originalité.
Ce cours n'est pas destiné à expliquer le fonctionnement du framework Tailwind CSS, mais juste à vous montrer qu'il s'agit d'une solution envisageable pour vos projets React. Si vous voulez savoir comment mettre en route ce framerowk, je vous suggère de consulter le support disponible sur son site officiel.