Essayer de coder ← Retour aux sujets

Cibler des éléments

sélecteurs

Une règle CSS associe un sélecteur (qui est concerné ?) à des déclarations (que change-t-on ?) : sélecteur { propriété: valeur; }.

p { … }
Tous les paragraphes (sélecteur d'élément)
.carte { … }
Les éléments de class="carte"
#entete { … }
L'élément d'id="entete" (unique)
h1, h2 { … }
Groupe : les h1 et les h2
nav a { … }
Descendant : les a situés dans un nav
ul > li { … }
Enfant direct : les li directement dans un ul
input[type="email"] { … }
Selon un attribut
style.css
h1 {
  color: #14141a;
}

.carte {
  padding: 1rem;
  border: 1px solid #cbd5e1;
}

nav a {
  text-decoration: none;
}

Cascade et spécificité

qui gagne ?

Quand plusieurs règles visent le même élément, la plus spécifique l'emporte ; à égalité, la dernière écrite gagne.

style="…" (dans la balise)
Le plus fort (hors !important)
#id
Spécificité forte : (1, 0, 0)
.classe [attr] :hover
Spécificité moyenne : (0, 1, 0)
élément ::before
Spécificité faible : (0, 0, 1)
*
Aucune spécificité
color: red !important;
Dernier recours : à éviter
cascade.css
p { color: black; }            /* (0, 0, 1) */
.alerte { color: orange; }     /* (0, 1, 0) : plus fort que p */
p.alerte { color: red; }       /* (0, 1, 1) : plus fort encore */
Rendu
Un paragraphe de classe « alerte » s'affiche en rouge ; un paragraphe sans classe en noir.

🎯 Le cours : les règles CSS

CSS (*Cascading Style Sheets*) décrit l'apparence d'une page : couleurs, tailles, espacements, mise en page. Le HTML dit « ceci est un titre », le CSS dit « les titres sont bleus et en gras ». Séparer les deux permet de changer l'allure de tout un site en modifiant un seul fichier.

Où écrire du CSS ?

MéthodeExempleQuand
fichier externe (recommandé)<link rel="stylesheet" href="style.css"> dans le <head>tout le site partage le même style
balise <style><style> p { color: blue; } </style> dans le <head>une seule page, ou un petit essai
attribut style<p style="color: blue;">cas exceptionnel : difficile à maintenir et très prioritaire

Anatomie d'une règle

h1, h2 {                        ◄── sélecteur (ici deux éléments)
  color: #2563eb;               ◄── déclaration : propriété: valeur;
  margin-bottom: 0.5rem;        ◄── chaque déclaration finit par un ;
}

Les commentaires s'écrivent /* … */. Un point-virgule oublié casse la déclaration suivante : c'est la faute la plus courante.

Les sélecteurs de base

SélecteurCibleExemple
élémenttoutes les balises de ce nomp, h1, a
classeles éléments portant cette classe (réutilisable).carte
identifiantl'unique élément de cet id#entete
universeltous les éléments*
groupeplusieurs sélecteurs à la fois (séparés par une virgule)h1, h2, h3
classes cumuléesles éléments qui ont les deux classes.carte.vedette

On préfère les classes aux identifiants pour le style : une classe se réutilise sur autant d'éléments qu'on veut, alors qu'un identifiant est unique et très prioritaire, ce qui complique les surcharges.

Les combinateurs : relations entre éléments

ÉcritureSignificationExemple
A BB est un descendant de A (à n'importe quel niveau)nav a
A > BB est un enfant direct de Aul > li
A + BB est le frère immédiatement après Ah2 + p
A ~ BB est un frère quelconque après Ah2 ~ p
combinateurs.css
/* tous les liens situés dans le menu */
nav a {
  color: #ffffff;
}

/* seulement les li directement sous la liste principale */
.menu > li {
  display: inline-block;
}

/* le paragraphe juste après un titre */
h2 + p {
  font-size: 1.1rem;
}

Les sélecteurs d'attribut

[attr] cible les éléments qui possèdent l'attribut, [attr="valeur"] ceux qui ont cette valeur exacte, [attr^="https"] une valeur qui commence par…, [attr$=".pdf"] qui finit par…, [attr*="nsi"] qui contient…

attributs.css
input[type="email"] {
  border-color: #2563eb;
}

a[href^="https"]::after {
  content: " ↗";
}

a[href$=".pdf"] {
  font-weight: 700;
}

La cascade : qui gagne ?

Le navigateur cherche toutes les règles qui s'appliquent à un élément. En cas de conflit sur une propriété, il départage dans cet ordre :

  1. l'importance (!important l'emporte, puis les règles normales) ;
  2. la spécificité du sélecteur (la plus forte gagne) ;
  3. l'ordre d'écriture : à spécificité égale, la dernière règle gagne.

La spécificité se compte comme un triplet (identifiants, classes, éléments). #menu a.actif vaut (1, 1, 1) : un identifiant, une classe, un élément. On compare composante par composante, de gauche à droite : un seul identifiant bat n'importe quel nombre de classes.

SélecteurSpécificité
p(0, 0, 1)
.carte p(0, 1, 1)
.carte.vedette(0, 2, 0)
nav ul li a(0, 0, 4)
#menu a(1, 0, 1)

L'héritage

Certaines propriétés se transmettent des parents aux enfants : tout ce qui concerne le texte (color, font-family, font-size, line-height, text-align). Les propriétés de boîte (border, margin, padding, background) ne s'héritent pas. Pour régler la police de toute la page, on la déclare sur body ; pour forcer l'héritage, inherit.

heritage.css
body {
  font-family: system-ui, sans-serif;   /* hérité par tous les éléments */
  color: #14141a;
}

a {
  color: inherit;                        /* reprend la couleur du parent */
}

Mettre de l'ordre dans son CSS

  • Une classe par rôle (.carte, .bouton, .alerte) plutôt qu'un sélecteur très long ; garde les sélecteurs courts, ils se surchargent plus facilement.
  • Évite les identifiants et !important pour le style : ils rendent les surcharges impossibles sans d'autres astuces.
  • Nomme les classes d'après le rôle (.alerte) et non l'apparence (.rouge) : si le style change, le nom reste vrai.
  • Regroupe le CSS par zone (en-tête, menu, contenu) et commente chaque groupe.

⚠️ Erreurs fréquentes

Un point-virgule oublié

À éviter
faux.css
p {
  color: red
  font-size: 1.2rem;     /* ignorée : le navigateur lit "red font-size: 1.2rem" */
}
Correct
correct.css
p {
  color: red;
  font-size: 1.2rem;
}

Ma règle n'a aucun effet

Démarche : (1) ouvre les outils de développement du navigateur (F12) et inspecte l'élément ; (2) regarde si ta règle apparaît barrée (une règle plus spécifique ou plus tardive l'écrase) ; (3) vérifie le nom de la classe (faute de frappe, point oublié devant la classe dans le sélecteur) ; (4) vérifie que le fichier CSS est bien lié.

Oublier le point devant une classe, ou le dièse devant un identifiant

À éviter
faux.css
carte { padding: 1rem; }    /* cible la balise <carte>, qui n'existe pas */
Correct
correct.css
.carte { padding: 1rem; }   /* cible class="carte" */

Recourir à !important

!important règle un conflit aujourd'hui et en crée dix demain : la seule façon de le battre est un autre !important. Simplifie plutôt le sélecteur concurrent, ou augmente légèrement la spécificité de ta règle.

Confondre descendant et enfant

.menu li atteint tous les li sous .menu, y compris ceux des sous-menus ; .menu > li seulement ceux du premier niveau.

Attendre un héritage qui n'existe pas

Mettre une bordure ou un fond sur un parent ne les donne pas à ses enfants. Seules les propriétés de texte se transmettent.

📋 Aide-mémoire

  • sélecteur { propriété: valeur; } ; un ; après chaque déclaration ; commentaire /* … */.
  • Sélecteurs : p (élément), .classe, #id, *, a, b (groupe), A B (descendant), A > B (enfant), A + B (frère suivant), [attr="v"].
  • Cascade : importance, puis spécificité (id, classes, éléments), puis ordre d'écriture.
  • Spécificité : style inline > #id > .classe / [attr] / :pseudo-classe > élément.
  • Héritage : les propriétés de texte se transmettent (color, font-*, line-height), pas les propriétés de boîte.
  • Préfère les classes, évite #id et !important pour le style ; inspecte avec F12.