Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 623 minDébutant

Les bases du CSS : sélecteurs, couleurs, unités et polices

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • ajouter du CSS à une page et écrire une règle ;
  • cibler des éléments avec les sélecteurs, les combinateurs, les pseudo-classes et les pseudo-éléments ;
  • choisir une couleur et la bonne unité : px, %, em, rem, vw ou vh ;
  • mettre en forme le texte, les polices et les fonds.

4 exercices corrigés

Une règle CSS associe un sélecteur, qui désigne les éléments HTML visés, à des déclarations propriété: valeur;, qui disent comment les afficher. Ce chapitre montre comment relier une feuille de style à une page, puis passe en revue les sélecteurs (classes, combinateurs, pseudo-classes), les couleurs, les unités, le texte, les polices et les fonds : de quoi mettre en forme une page entière.

Les trois façons d'ajouter du CSS

MéthodeExempleVerdict
Attribut style (en ligne)<p style="color: red;">à éviter : mélange contenu et présentation, non réutilisable, très difficile à surcharger
Élément <style> dans le <head><style> p { color: red; } </style>pour un test rapide ou une page unique
Feuille de style externe<link rel="stylesheet" href="css/style.css">la bonne pratique

La feuille externe a trois avantages : une seule feuille met en forme toutes les pages du site (changer la couleur des titres partout, c'est changer une ligne) ; le navigateur la garde en cache et ne la retélécharge pas à chaque page ; le HTML reste propre, sans aucune information de présentation.

La syntaxe d'une règle CSS

css
/* Les titres de section de la médiathèque */
h2 {
  color: #0f766e;
  font-size: 1.75rem;
  margin-bottom: 0.5em;
}
  • h2 est le sélecteur : la règle s'applique à tous les <h2> ;
  • entre accolades, le bloc de déclarations ;
  • chaque déclaration est une paire propriété: valeur, terminée par un point-virgule ;
  • les commentaires s'écrivent entre /* et */ ; il n'y a pas de // en CSS.

Une erreur de syntaxe (un ; oublié, une accolade en trop) n'arrête pas tout le fichier : le navigateur ignore la déclaration fautive, parfois tout le bloc, et continue. C'est pratique, mais l'erreur est silencieuse : l'inspecteur montre une déclaration invalide barrée avec un petit triangle d'avertissement.

Plusieurs sélecteurs peuvent partager une même règle, séparés par des virgules :

css
h1,
h2,
h3 {
  font-family: Georgia, serif;
}

Les sélecteurs de base : balise, classe, identifiant

SélecteurSyntaxeCibleExemple
De type (balise)ptous les <p>p { line-height: 1.6; }
De classe.nomtous les éléments qui ont class="nom".carte { padding: 1rem; }
D'identifiant#noml'élément unique qui a id="nom"#contenu { … }
Universel*tous les éléments* { box-sizing: border-box; }
Composép.introles <p> qui ont la classe intro (sans espace)a.bouton { … }

Un élément peut porter plusieurs classes, séparées par des espaces : <article class="carte complet">. Les règles de .carte et de .complet s'appliquent toutes les deux, et .carte.complet (sans espace) vise les éléments qui ont les deux classes à la fois.

Les combinateurs

Un combinateur exprime une relation entre deux éléments dans l'arbre du DOM (chapitre 2).

CombinateurSyntaxeCible
Descendant (une espace)nav ales <a> situés n'importe où dans un <nav>
Enfant directul > liles <li> enfants directs d'un <ul> (pas ceux d'une sous-liste)
Frère adjacenth2 + ple <p> qui suit immédiatement un <h2>
Frères suivantsh2 ~ ptous les <p> qui suivent un <h2>, dans le même parent
css
/* Les liens du menu, et seulement eux */
nav a {
  text-decoration: none;
}

/* Le premier niveau du menu, pas les sous-menus */
.menu > li {
  display: inline-block;
}

/* Le chapeau : le premier paragraphe après un titre d'article */
article h2 + p {
  font-size: 1.15rem;
}

Les sélecteurs d'attribut

SélecteurCible
[required]les éléments qui ont l'attribut required
[type="email"]les éléments dont l'attribut type vaut exactement email
a[href^="https://"]les liens dont l'adresse commence par https:// (liens externes)
a[href$=".pdf"]les liens dont l'adresse se termine par .pdf
[class*="col-"]les éléments dont la classe contient col-
css
/* Signaler les liens vers un PDF */
a[href$=".pdf"]::after {
  content: " (PDF)";
}

Les pseudo-classes

Une pseudo-classe, introduite par un deux-points, vise un élément selon son état ou sa position.

Pseudo-classeCible
:hoverl'élément survolé par la souris
:focusl'élément qui a le focus (clic dans un champ, touche Tab)
:focus-visiblel'élément qui a le focus quand le navigateur juge utile de le montrer (au clavier, pas après un clic de souris sur un bouton)
:activel'élément pendant le clic
:visitedun lien déjà visité
:first-child, :last-childle premier, le dernier enfant de son parent
:nth-child(2), :nth-child(odd), :nth-child(3n)le 2e enfant ; les enfants impairs ; un sur trois
:not(.complet)les éléments qui n'ont pas la classe complet
:checked, :disabled, :requiredles cases cochées, champs désactivés, champs obligatoires
:user-invalidun champ invalide, une fois que l'utilisateur l'a modifié (chapitre 5)
css
/* Lignes de tableau zébrées */
tbody tr:nth-child(even) {
  background-color: #f1f5f9;
}

/* Un focus clavier toujours visible */
a:focus-visible,
button:focus-visible {
  outline: 3px solid #0f766e;
  outline-offset: 2px;
}

/* Pas de trait de séparation après le dernier élément du menu */
.menu li:not(:last-child) {
  border-right: 1px solid #cbd5e1;
}

Pour les liens, l'ordre des règles compte : écris-les dans l'ordre :link, :visited, :hover, :active (moyen mnémotechnique : LoVe HAte), sinon :visited écrase :hover (chapitre 7).

Les pseudo-éléments

Un pseudo-élément, introduit par deux deux-points, vise une partie d'un élément ou crée un élément virtuel.

Pseudo-élémentCible
::before, ::afterun contenu ajouté au début, à la fin de l'élément (propriété content obligatoire)
::first-line, ::first-letterla première ligne, la première lettre (lettrine)
::placeholderle texte indicatif d'un champ
::markerla puce ou le numéro d'un élément de liste
::selectionle texte sélectionné par l'utilisateur
css
/* Un astérisque après l'étiquette des champs obligatoires */
.obligatoire::after {
  content: " *";
  color: #b91c1c;
}

/* Des puces de la couleur de la charte */
li::marker {
  color: #0f766e;
}

Le contenu ajouté par content est décoratif : il ne se sélectionne pas, et les lecteurs d'écran ne le lisent pas toujours. N'y mets jamais une information essentielle.

Les couleurs en CSS

NotationExempleRemarque
Mot-cléteal, white, transparent148 noms, choix limité
Hexadécimal#0f766e, #fff, #0f766e80rouge, vert, bleu de 00 à ff ; le 4e couple optionnel est l'opacité
rgb()rgb(15 118 110), rgb(15 118 110 / 50%)trois valeurs de 0 à 255 ; / alpha pour l'opacité
hsl()hsl(175 77% 26%)teinte en degrés (0 rouge, 120 vert, 240 bleu), saturation, luminosité : pratique pour éclaircir une couleur sans changer sa teinte
oklch()oklch(52% 0.09 185)luminosité perçue, intensité, teinte : deux couleurs de même luminosité y paraissent vraiment aussi claires ; reconnue par tous les navigateurs actuels
currentColorborder-color: currentColorreprend la couleur du texte de l'élément

La syntaxe ancienne rgba(15, 118, 110, 0.5), avec des virgules, reste valide ; la syntaxe moderne, avec des espaces et une barre oblique, fonctionne partout aujourd'hui.

color change la couleur du texte, background-color celle du fond. Une charte graphique fixe en général une couleur principale, une ou deux couleurs secondaires et des gris : on les déclare une seule fois dans des variables CSS (chapitre 11).

Les unités : px, %, em, rem, vw et vh

UnitéRelative àUsage typique
pxrien : taille fixe (un pixel CSS, pas un pixel physique de l'écran)bordures, ombres, petits détails
%la dimension correspondante du parentlargeurs fluides (width: 50%)
emla taille de police de l'élément lui-même (ou du parent, pour font-size)marges et espacements qui suivent la taille du texte
remla taille de police de la racine <html> (16 px par défaut)tailles de texte, espacements généraux
vw, vh1 % de la largeur, de la hauteur de la fenêtresections plein écran
dvh1 % de la hauteur visible de la fenêtreplein écran sur mobile, où la barre d'adresse apparaît et disparaît
chla largeur du caractère « 0 »largeur de lecture (max-width: 65ch)
frune fraction de l'espace libre (Grid uniquement)colonnes de grille (chapitre 9)

Le piège de em : il se multiplie en cascade.

css
html { font-size: 100%; }      /* 16 px, ou la taille choisie par l'utilisateur */
.carte { font-size: 1.25em; }  /* 1,25 × 16 = 20 px */
.carte p { font-size: 1.25em; }/* 1,25 × 20 = 25 px, et non 20 px */
.carte p { font-size: 1.25rem; }/* avec rem : 1,25 × 16 = 20 px, toujours */

Le texte et les polices

css
body {
  font-family: "Atkinson Hyperlegible", system-ui, sans-serif;
  font-size: 1rem;
  line-height: 1.6;
  color: #1f2937;
}

h1 {
  font-size: 2.25rem;
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -0.01em;
}

.surtitre {
  font-size: 0.875rem;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}
PropriétéRôleValeurs courantes
font-familyla police, avec des polices de secours séparées par des virgules, la dernière étant une famille génériqueGeorgia, serif ; system-ui, sans-serif ; ui-monospace, monospace
font-sizela taille1rem, 1.25rem
font-weightla graisse400 (normal), 600 (semi-gras), 700 (gras)
font-stylel'italiqueitalic, normal
line-heightla hauteur de ligne, sans unité de préférence (multiplie la taille du texte)1.5 à 1.7 pour le texte courant
text-alignl'alignementleft, center, right, justify (à éviter : crée des espaces irréguliers, gênants pour les personnes dyslexiques)
text-decorationsoulignement, barrénone, underline
text-transformcasse affichéeuppercase, capitalize
letter-spacingespacement des lettres0.05em

system-ui utilise la police de l'interface du système (Segoe UI sous Windows, San Francisco sous macOS et iOS, Roboto sous Android) : rapide, lisible, sans aucun téléchargement.

Pour une police particulière, la bonne méthode est de l'héberger toi-même, au format WOFF2, et de la déclarer avec @font-face :

css
@font-face {
  font-family: "Atkinson Hyperlegible";
  src: url("../fonts/atkinson-hyperlegible-regular.woff2") format("woff2");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

font-display: swap affiche d'abord le texte avec la police de secours, puis bascule quand la police est chargée : le texte n'est jamais invisible pendant le chargement.

Ne charge que les graisses que tu utilises vraiment : chaque fichier de police pèse quelques dizaines de kilo-octets.

Les fonds

css
.bandeau {
  background-color: #0f766e;
  background-image: url("../images/feuilles.svg");
  background-repeat: no-repeat;
  background-position: right bottom;
  background-size: 200px auto;
}

.hero {
  background: linear-gradient(135deg, #0f766e, #134e4a);
  color: white;
}

.photo-fond {
  background-image: url("../images/facade.jpg");
  background-size: cover;       /* couvre toute la zone, quitte à rogner */
  background-position: center;
}
PropriétéValeurs utiles
background-colorune couleur, qui s'affiche aussi pendant le chargement de l'image
background-imageurl(…), linear-gradient(…), radial-gradient(…)
background-repeatno-repeat, repeat-x, repeat (par défaut)
background-positioncenter, right bottom, 50% 20%
background-sizecover (couvre tout), contain (image entière visible), une taille

Exercices

Exercice 1 sur 4 Que cible ce sélecteur ? Réussi À revoir

Avec ce HTML, liste les éléments visés par chaque sélecteur.

html
<nav class="menu">
  <ul>
    <li><a href="index.html">Accueil</a></li>
    <li><a href="agenda.html" class="actif">Agenda</a>
      <ul>
        <li><a href="agenda.html#numerique">Numérique</a></li>
      </ul>
    </li>
    <li><a href="https://www.bnf.fr">BnF</a></li>
  </ul>
</nav>
  1. .menu a
  2. .menu > ul > li
  3. a.actif
  4. a[href^="https://"]
  5. li:first-child > a
  6. .menu > ul > li + li
Voir la réponseMasquer la réponse de l'exercice 1
  1. Les quatre liens : Accueil, Agenda, Numérique et BnF (descendants à n'importe quelle profondeur).
  2. Les trois <li> du premier niveau (Accueil, Agenda, BnF), pas celui du sous-menu.
  3. Le lien Agenda.
  4. Le lien BnF.
  5. Les liens Accueil et Numérique : chacun est dans un <li> qui est le premier enfant de sa liste.
  6. Les <li> Agenda et BnF du premier niveau : chacun suit immédiatement un autre <li>. Accueil, premier de la liste, n'a pas de frère avant lui. Ce sélecteur sert souvent à placer un séparateur entre les éléments.

Tu avais trouvé ?

Exercice 2 sur 4 Calculer des tailles Réussi À revoir

La taille de police de <html> est celle par défaut, 16 px. Calcule la taille en pixels du texte de chaque élément.

css
.encadre { font-size: 1.5rem; }
.encadre h3 { font-size: 1.5em; }
.encadre small { font-size: 0.75em; }
.note { font-size: 0.875rem; }
  1. Un <p> dans .encadre.
  2. Un <h3> dans .encadre.
  3. Un <small> dans un <p> de .encadre.
  4. Un <p class="note"> placé dans .encadre.
Voir la réponseMasquer la réponse de l'exercice 2
  1. Il hérite de .encadre : 1,5 × 16 = 24 px.
  2. em se rapporte à la taille du parent pour font-size : 1,5 × 24 = 36 px.
  3. Le <p> fait 24 px, donc 0,75 × 24 = 18 px.
  4. rem ignore les parents : 0,875 × 16 = 14 px.

Tu avais trouvé ?

Exercice 3 sur 4 Mettre en forme la page d'accueil Réussi À revoir

Écris le CSS qui donne à la page d'accueil de la médiathèque (chapitre 4) :

  1. une police système sans empattement, en 1rem, avec une hauteur de ligne de 1,6, en gris très foncé #1f2937 ;
  2. un <header> à fond vert #0f766e, dont les liens sont blancs et non soulignés ;
  3. un soulignement des liens du menu au survol et au focus clavier ;
  4. les titres <h2> en vert #0f766e, en 1,75rem ;
  5. le lien de la page active du menu en gras.
Voir la réponseMasquer la réponse de l'exercice 3
css
body {
  font-family: system-ui, sans-serif;
  font-size: 1rem;
  line-height: 1.6;
  color: #1f2937;
}

header {
  background-color: #0f766e;
}

header a {
  color: white;
  text-decoration: none;
}

header nav a:hover,
header nav a:focus-visible {
  text-decoration: underline;
}

h2 {
  color: #0f766e;
  font-size: 1.75rem;
}

nav a[aria-current="page"] {
  font-weight: 700;
}

Le sélecteur d'attribut [aria-current="page"] évite d'ajouter une classe actif : l'information est déjà dans le HTML. Le blanc sur #0f766e a un contraste de 5,5:1 environ : suffisant pour du texte courant.

Tu avais trouvé ?

Exercice 4 sur 4 Pseudo-classe ou pseudo-élément ? Réussi À revoir

Pour chaque besoin, écris le sélecteur.

  1. Colorer en rouge la bordure d'un champ invalide, seulement après saisie.
  2. Ajouter « (PDF) » après tout lien vers un fichier PDF.
  3. Griser une ligne de tableau sur deux.
  4. Mettre en gras le premier paragraphe qui suit chaque <h2>.
  5. Changer la couleur des puces des listes.
Voir la réponseMasquer la réponse de l'exercice 4
  1. input:user-invalid { border-color: #b91c1c; } (pseudo-classe : un état).
  2. a[href$=".pdf"]::after { content: " (PDF)"; } (pseudo-élément : un contenu ajouté). L'idéal reste d'écrire « (PDF) » dans le texte du lien, pour qu'il soit lu par tous.
  3. tbody tr:nth-child(even) (ou odd) : pseudo-classe de position.
  4. h2 + p { font-weight: 700; } : un combinateur, pas une pseudo-classe.
  5. li::marker { color: …; } (pseudo-élément : une partie de l'élément).

Tu avais trouvé ?

Chapitre terminé !

Fais les 4 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Cascade, héritage et spécificité en CSSRevoir le sommaire du cours