Module CSS.9 – Architecture CSS
Objectif
Maîtriser l'architecture CSS : BEM, SMACSS, OOCSS, conventions de nommage pour créer du CSS maintenable et scalable en équipe.
Théorie
Pourquoi une architecture CSS ?
Problèmes sans architecture :
- ❌ CSS difficile à maintenir
- ❌ Conflits de styles
- ❌ Spécificité incontrôlée
- ❌ Code dupliqué
- ❌ Difficile en équipe
Avantages d'une architecture :
- ✅ Code organisé
- ✅ Maintenable
- ✅ Scalable
- ✅ Réutilisable
- ✅ Collaboration facilitée
BEM (Block Element Modifier)
BEM = Block, Element, Modifier.
Structure :
.block
.block__element
.block--modifier
.block__element--modifier
Exemple :
/* Block */
.card { }
/* Element */
.card__title { }
.card__body { }
.card__footer { }
/* Modifier */
.card--featured { }
.card--large { }
/* Element avec modifier */
.card__title--highlighted { }
HTML :
<div class="card card--featured">
<h2 class="card__title card__title--highlighted">Titre</h2>
<p class="card__body">Contenu</p>
<footer class="card__footer">Footer</footer>
</div>
Règles BEM :
- Block : Composant indépendant
- Element : Partie du block (__)
- Modifier : Variation (--)
Avantages :
- ✅ Spécificité faible et prévisible
- ✅ Auto-documenté
- ✅ Pas de conflits
- ✅ Réutilisable
SMACSS (Scalable and Modular Architecture)
5 catégories :
1. Base :
/* base.css */
html, body { }
h1, h2, h3 { }
a { }
2. Layout :
/* layout.css */
.l-header { }
.l-sidebar { }
.l-main { }
.l-footer { }
3. Module :
/* module.css */
.card { }
.button { }
.modal { }
4. State :
/* state.css */
.is-hidden { }
.is-active { }
.is-disabled { }
5. Theme :
/* theme.css */
.theme-dark { }
.theme-light { }
Structure de fichiers :
css/
├── base.css
├── layout.css
├── modules/
│ ├── card.css
│ ├── button.css
│ └── modal.css
├── state.css
└── theme.css
OOCSS (Object-Oriented CSS)
Principe : Séparer structure et skin.
Structure :
.button {
padding: 10px 20px;
border-radius: 5px;
display: inline-block;
}
Skin :
.button-primary {
background-color: blue;
color: white;
}
.button-secondary {
background-color: gray;
color: black;
}
HTML :
<button class="button button-primary">Primary</button>
<button class="button button-secondary">Secondary</button>
Avantages :
- ✅ Réutilisabilité
- ✅ Moins de code
- ✅ Maintenance facile
ITCSS (Inverted Triangle CSS)
7 couches (du plus général au plus spécifique) :
- Settings : Variables
- Tools : Mixins, fonctions
- Generic : Reset, normalize
- Elements : Balises HTML
- Objects : Layouts, conteneurs
- Components : Composants UI
- Utilities : Helpers
Structure :
css/
├── 01-settings/
├── 02-tools/
├── 03-generic/
├── 04-elements/
├── 05-objects/
├── 06-components/
└── 07-utilities/
Conventions de nommage
Classes utilitaires :
.u-text-center { }
.u-margin-large { }
.u-hidden { }
Layout :
.l-container { }
.l-grid { }
.l-sidebar { }
Composants :
.c-card { }
.c-button { }
.c-modal { }
États :
.is-active { }
.is-hidden { }
.has-error { }
JavaScript hooks :
.js-modal-trigger { }
.js-dropdown { }
Organisation des fichiers
Structure recommandée :
css/
├── abstracts/
│ ├── _variables.css
│ ├── _mixins.css
│ └── _functions.css
├── base/
│ ├── _reset.css
│ ├── _typography.css
│ └── _utilities.css
├── components/
│ ├── _buttons.css
│ ├── _cards.css
│ └── _forms.css
├── layout/
│ ├── _header.css
│ ├── _footer.css
│ └── _grid.css
└── main.css
main.css :
@import 'abstracts/variables';
@import 'abstracts/mixins';
@import 'base/reset';
@import 'base/typography';
@import 'layout/header';
@import 'components/buttons';
@import 'components/cards';
Bonnes pratiques
1. Préfixes cohérents
.l-* /* Layout */
.c-* /* Component */
.u-* /* Utility */
.is-* /* State */
.js-* /* JavaScript hook */
2. Spécificité faible
❌ Mauvais :
.container .card .title { }
✅ Bon :
.card__title { }
3. Pas de styles inline
❌ Mauvais :
<div style="color: blue;">
✅ Bon :
<div class="text-blue">
4. Commentaires organisés
/* ========================================
COMPONENT: Card
======================================== */
.card { }
/* Element: Title */
.card__title { }
/* Modifier: Featured */
.card--featured { }
5. DRY (Don't Repeat Yourself)
❌ Mauvais :
.button-primary {
padding: 10px 20px;
border-radius: 5px;
}
.button-secondary {
padding: 10px 20px;
border-radius: 5px;
}
✅ Bon :
.button {
padding: 10px 20px;
border-radius: 5px;
}
Exercices guidés
Exercice 1 : BEM
Créez un composant avec BEM :
- Block :
.card - Elements :
.card__title,.card__body - Modifiers :
.card--featured
Exercice 2 : SMACSS
Organisez votre CSS en 5 catégories :
- Base
- Layout
- Module
- State
- Theme
Exercice 3 : OOCSS
Séparez structure et skin :
- Classe de base (structure)
- Classes de skin (apparence)
Exercice 4 : Organisation fichiers
Créez une structure de fichiers :
- Abstracts
- Base
- Components
- Layout
- Main file
Exercice 5 : Conventions
Appliquez des conventions :
- Préfixes cohérents
- Nommage descriptif
- Commentaires organisés
❌ Erreurs fréquentes
Erreur 1 : Pas d'architecture
❌ Mauvais :
/* Tout dans un fichier, pas d'organisation */
✅ Bon :
/* Organisé par catégories, fichiers séparés */
Pourquoi : Architecture = maintenabilité.
Erreur 2 : BEM mal utilisé
❌ Mauvais :
.card-title { } /* Pas de __ */
✅ Bon :
.card__title { } /* BEM correct */
Pourquoi : BEM a des règles précises.
Erreur 3 : Spécificité trop élevée
❌ Mauvais :
.container .card .title { }
✅ Bon :
.card__title { }
Pourquoi : Spécificité faible = plus facile à surcharger.
Erreur 4 : Duplication de code
❌ Mauvais :
.button1 { padding: 10px; }
.button2 { padding: 10px; }
✅ Bon :
.button { padding: 10px; }
Pourquoi : DRY = moins de code, plus maintenable.
Erreur 5 : Pas de conventions
❌ Mauvais :
/* Noms incohérents */
.cardTitle { }
.card_title { }
.card-title { }
✅ Bon :
/* Convention cohérente (BEM) */
.card__title { }
Pourquoi : Conventions = collaboration facilitée.
🚀 Mini-projet
Mission : Réorganiser un projet CSS avec architecture
Prenez un projet existant et réorganisez-le :
Architecture :
- Choisir BEM, SMACSS ou OOCSS
- Organiser en fichiers
- Appliquer les conventions
Structure :
- Abstracts (variables, mixins)
- Base (reset, typography)
- Layout (header, footer, grid)
- Components (cards, buttons, forms)
- Utilities (helpers)
Critères :
- ✅ Architecture choisie et appliquée
- ✅ Fichiers organisés
- ✅ Conventions cohérentes
- ✅ Spécificité faible
- ✅ Code DRY
Objectif : Créer une architecture CSS professionnelle et maintenable.
Validation : Vous pouvez passer au module suivant quand vous maîtrisez l'architecture CSS et avez organisé un projet avec une architecture claire.