Maîtriser les 4 types de sélecteurs de base : universel, élément, classe et ID.
Avant de pouvoir styliser quoi que ce soit, il faut dire au navigateur quel cibler. C'est exactement le rôle d'un sélecteur. Il agit comme un adresse postale : il indique précisément quel élément (ou quels éléments) doit recevoir les déclarations de style.
Il existe 4 sélecteurs simples, du plus générique au plus spécifique :
| Sélecteur | Syntaxe | Cible | Spécificité |
|---|---|---|---|
| Universel | * |
Tous les éléments | 0 |
| Élément | h1, p, a… |
Tous les éléments de ce type | 1 |
| Classe | .ma-classe |
Tous les éléments avec cet attribut class |
10 |
| ID | #mon-id |
L'élément unique avec cet attribut id |
100 |
** cible absolument tous les éléments du
document, sans exception. Il correspond à chaque nœud du DOM.
/* Applique cette marge à TOUS les éléments */
* {
margin: 0;
padding: 0;
}
/* Utilisation plus ciblée : réinitialiser à l'intérieur d'un conteneur */
.container * {
box-sizing: border-box;
}
Cas pratiques :
border-box sur tous les éléments
* est coûteuse
en performance car le navigateur doit l'appliquer à chaque nœud du
DOM. Utilise-le avec parcimonie, principalement pour les
réinitialisations globales.
/* Tous les h1 */
h1 {
font-size: 2rem;
color: #1e293b;
}
/* Tous les paragraphes */
p {
line-height: 1.6;
margin-bottom: 1rem;
}
/* Tous les liens */
a {
color: #2563eb;
text-decoration: none;
}
/* Tous les éléments de liste */
li {
padding: 0.3rem 0;
}
Cas pratiques :
class correspondant. Il
commence par un point .. Un élément peut avoir plusieurs classes.
/* HTML : un seul élément avec plusieurs classes */
<button class="btn btn-primary btn-lg">Cliquer ici</button>
/* CSS : cibler chaque classe individuellement */
.btn {
padding: 0.5rem 1rem;
border: none;
border-radius: 6px;
cursor: pointer;
}
.btn-primary {
background: #2563eb;
color: white;
}
.btn-lg {
font-size: 1.1rem;
padding: 0.75rem 1.5rem;
}
Cas pratiques :
.btn-primary,
.btn-secondary, .btn-danger
.sidebar,
.main-content, .footer
id. Il commence par un
dièse #. Un ID doit être unique dans tout le document.
<!-- HTML : l'ID est unique -->
<header id="main-header">
<h1>Mon site</h1>
</header>
<nav id="sidebar">
<ul>...</ul>
</nav>
/* CSS */
#main-header {
background: #1e293b;
color: white;
padding: 2rem;
}
#sidebar {
width: 250px;
background: #f1f5f9;
position: fixed;
left: 0;
top: 0;
height: 100vh;
}
Cas pratiques :
section#contact)
document.getElementById() est très rapide
Sélecteur universel * → ★ TOUT le DOM
│
Sélecteur d'élément p → ← Tous les <p>
│
Sélecteur de classe .carte → ← Tous les éléments avec class="carte"
│
Sélecteur d'ID #header → ← Un seul élément avec id="header"
Portée et spécificité des 4 sélecteurs simples
┌─────────────────────────────────────┐ │ * Spécificité : 0 (plus faible) │ ├─────────────────────────────────────┤ │ h1, p, a Spécificité : 1 │ ├─────────────────────────────────────┤ │ .ma-classe Spécificité : 10 │ ├─────────────────────────────────────┤ │ #mon-id Spécificité : 100 (plus forte) │ └─────────────────────────────────────┘
Quand deux règles s'appliquent au même élément, celle avec la spécificité plus élevée gagne.
Démonstration : Reset avec *
/* Le code appliqué */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', sans-serif;
line-height: 1.6;
}
Paragraphe — impacté par le reset
Élément span — impacté par le resetDémonstration : Styliser par type de balise
/* Le code appliqué */
h1 {
color: #dc2626;
font-size: 1.5rem;
border-bottom: 2px solid #dc2626;
padding-bottom: 0.5rem;
}
h2 {
color: #2563eb;
font-size: 1.2rem;
}
p {
color: #64748b;
font-style: italic;
}
a {
color: #7c3aed;
text-decoration: underline;
font-weight: 600;
}
Ceci est un paragraphe — gris et italique.
Ceci est un lien — violet et soulignéDémonstration : Boutons avec classes
/* Le code appliqué */
.btn {
display: inline-block;
padding: 0.6rem 1.2rem;
border-radius: 8px;
font-weight: 600;
border: none;
cursor: pointer;
}
.btn-primary {
background: #2563eb;
color: white;
}
.btn-secondary {
background: #7c3aed;
color: white;
}
.btn-success {
background: #16a34a;
color: white;
}
Démonstration : En-tête et barre latérale
/* Le code appliqué */
#banner-demo {
background: linear-gradient(135deg, #2563eb, #7c3aed);
color: white;
padding: 1.5rem;
border-radius: 8px;
text-align: center;
}
#sidebar-demo {
background: #f1f5f9;
padding: 1rem;
border-left: 4px solid #f59e0b;
border-radius: 0 8px 8px 0;
}
<!-- FAUX — L'ID doit être unique ! -->
<div id="carte">Carte 1</div>
<div id="carte">Carte 2</div>
<!-- CORRECT — Utiliser des classes pour les éléments multiples -->
<div class="carte">Carte 1</div>
<div class="carte">Carte 2</div>
/* FAUX — cible toutes les balises <primary> qui n'existent pas */
primary {
color: blue;
}
/* FAUX — même problème */
#primary {
color: blue;
}
/* CORRECT — la classe commence par un point */
.btn-primary {
color: blue;
}
/* CORRECT — l'ID commence par un dièse */
#main-header {
color: blue;
}
/* FAUX — le nom dépend de l'apparence, pas de la signification */
.rouge { color: red; }
.grand { font-size: 2rem; }
.rond { border-radius: 50%; }
/* CORRECT — nommer selon la signification */
.texte-erreur { color: red; }
.titre { font-size: 2rem; }
.avatar { border-radius: 50%; }
/* FAUX — pas de point pour un sélecteur d'élément */
.p {
font-size: 16px;
}
/* CORRECT — sans point pour cibler les balises <p> */
p {
font-size: 16px;
}
/* Si tu veux cibler uniquement les <p> avec une classe */
p.intro {
font-size: 16px;
}
.block__element--modifier pour des noms de classes
clairs.
* sauf
pour les réinitialisations globales.
/* ✅ Bonne pratique : classes avec BEM */
.card {}
.card__title {}
.card__body {}
.card--featured {}
/* ✅ Bonne pratique : sélecteur d'élément pour la base */
h1, h2, h3 {
font-family: 'Inter', sans-serif;
line-height: 1.3;
}
/* ✅ Bonne pratique : ID uniquement pour les ancres */
#contact { scroll-margin-top: 80px; }
| Critère | Classe .classe |
ID #id |
|---|---|---|
| Nombre par élément | Plusieurs | Un seul |
| Réutilisation | Oui — même classe sur N éléments | Non — unique dans la page |
| Spécificité | 10 | 100 |
| Facilité de surcharge | Facile | Difficile (très spécifique) |
| Usage recommandé | Styles CSS | Ancres, JavaScript |
Exercice 1 : Sélecteur universel
Écris une règle CSS qui utilise le sélecteur universel pour :
box-sizing: border-box sur tous les éléments
Solution :
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
Exercice 2 : Sélecteur d'élément
Écris des règles pour :
<h1> : couleur #1e293b,
taille 2rem
<p> : couleur #64748b,
interligne 1.8
<a> : couleur #2563eb,
pas de soulignement
Solution :
h1 {
color: #1e293b;
font-size: 2rem;
}
p {
color: #64748b;
line-height: 1.8;
}
a {
color: #2563eb;
text-decoration: none;
}
Exercice 3 : Sélecteurs de classe
Crée 3 boutons différents en utilisant une classe commune
.btn et 3 classes de variante :
.btn : padding, border-radius, font-weight, curseur
.btn-rouge : fond rouge, texte blanc.btn-vert : fond vert, texte blanc.btn-grand : taille de police plus grande, padding
plus grand
Solution :
.btn {
padding: 0.5rem 1rem;
border-radius: 6px;
font-weight: 600;
border: none;
cursor: pointer;
}
.btn-rouge {
background: #dc2626;
color: white;
}
.btn-vert {
background: #16a34a;
color: white;
}
.btn-grand {
font-size: 1.1rem;
padding: 0.75rem 1.5rem;
}
Exercice 4 : ID unique
Crée un élément <div id="alerte"> avec :
#fef2f2#dc26261rem0 8px 8px 0Solution :
#alerte {
background: #fef2f2;
border-left: 4px solid #dc2626;
padding: 1rem;
border-radius: 0 8px 8px 0;
}
Projet : Carte de visite stylisée
Crée un fichier index.html et
style.css qui affichent une carte de visite avec :
HTML requis :
<div id="carte"><h1><h2><p class="bio"><a class="lien-email">
<a class="lien-github">
CSS requis :
* avec
margin: 0; padding: 0; box-sizing: border-box
body avec police et couleur de fond
#carte avec fond blanc, ombre, border-radius,
padding
h1 avec taille et couleur spécifiques.bio avec couleur grise et italiqueObjectif : Utiliser les 4 types de sélecteurs dans un même projet pour comprendre quand utiliser quoi.
Quiz rapide
p,
.texte, ou #intro ?
<h2>.
.highlight.
*.class="premiere deuxieme"#intro (spécificité 100)h2 { ... }.highlight { ... }