Séance 4 - DSP - USAL33
Attributs globaux HTML
id
class
data-*
lang
Sélecteurs CSS de base
Aujourd'hui :
:hover
a:hover { color: red; }
:focus
input:focus { border-color: blue; }
:first-child
li:first-child { font-weight: bold; }
:last-child
li:last-child { border: none; }
:nth-child(n)
tr:nth-child(even) { background: #f0f0f0; }
tr:nth-child(odd) { background: white; } tr:nth-child(even) { background: #f5f5f5; }
Usage typique : Améliorer la lisibilité des tableaux
::before
p::before { content: "→ "; }
::after
a::after { content: " "; }
Important : La propriété content est obligatoire
content
a[href^="http"]::after { content: " (lien externe)"; }
[attr]
[required] { }
[attr="value"]
[type="email"] { }
[attr^="value"]
[href^="http"] { }
[attr$="value"]
[href$=".pdf"] { }
/* Champs obligatoires */ input[required] { border-left: 3px solid red; } /* Liens externes */ a[href^="http"] { color: blue; } /* Liens PDF */ a[href$=".pdf"]::after { content: " (PDF)"; }
Spécificité = poids d'un sélecteur
p
div
.card
[type]
#header
<div style="...">
Règle : Plus la spécificité est élevée, plus la règle est prioritaire
/* Spécificité : 1 */ p { color: blue; } /* Spécificité : 11 */ .intro p { color: red; } /* Spécificité : 101 */ #content p { color: green; } /* Spécificité : 111 - gagne */ #content .intro p { color: purple; }
Ordre de priorité quand plusieurs règles ciblent le même élément :
!important
p { color: blue; } p { color: red; } /* Cette règle gagne */
Conseil : Éviter !important autant que possible
Chaque élément HTML est une boîte composée de 4 zones :
┌─────────────────────────────────────┐ │ MARGIN (extérieur) │ │ ┌───────────────────────────────┐ │ │ │ BORDER (bordure) │ │ │ │ ┌─────────────────────────┐ │ │ │ │ │ PADDING (intérieur) │ │ │ │ │ │ ┌───────────────────┐ │ │ │ │ │ │ │ CONTENT │ │ │ │ │ │ │ └───────────────────┘ │ │ │ │ │ └─────────────────────────┘ │ │ │ └───────────────────────────────┘ │ └─────────────────────────────────────┘
width
height
padding
border
margin
div { width: 200px; padding: 20px; border: 5px solid black; margin: 10px; }
Largeur totale (par défaut) = 200 + (20×2) + (5×2) = 250px
Par défaut, width et height ne comptent que le content
/* Tous les côtés identiques */ padding: 15px; /* Vertical | Horizontal */ padding: 10px 20px; /* Top | Right | Bottom | Left */ padding: 10px 20px 15px 25px; /* Côté par côté */ padding-top: 10px; padding-right: 20px; padding-bottom: 15px; padding-left: 25px;
Astuce : Top, Right, Bottom, Left (sens horaire)
/* Syntaxe : width style color */ border: 2px solid #333; /* Styles courants */ border-style: solid; /* Ligne continue */ border-style: dashed; /* Tirets */ border-style: dotted; /* Pointillés */ /* Coins arrondis */ border-radius: 10px; border-radius: 50%; /* Cercle */
/* Syntaxe identique au padding */ margin: 20px; margin: 10px 20px; margin: 10px 15px 20px 25px; /* Centrage horizontal */ .container { width: 800px; margin: 0 auto; }
Pour centrer : L'élément doit avoir une largeur définie
Les marges verticales adjacentes fusionnent
<p style="margin-bottom: 30px;">Paragraphe 1</p> <p style="margin-top: 20px;">Paragraphe 2</p>
Résultat : Espace entre les deux = 30px (la plus grande)
Important : Uniquement vertical, pas horizontal
box-sizing: border-box
Le problème :
.box { width: 200px; padding: 20px; border: 5px solid black; } /* Largeur totale = 250px */
La solution :
* { box-sizing: border-box; } .box { width: 200px; /* Largeur totale = 200px */ padding: 20px; border: 5px solid black; }
À mettre au début de tous vos projets CSS
DevTools : F12 → Éléments → Computed
Les zones sont colorées :
Utilisez les DevTools pour déboguer
position
static
relative
absolute
fixed
sticky
Propriétés associées : top, right, bottom, left, z-index
top
right
bottom
left
z-index
position: static
Position normale dans le flux
div { position: static; /* Valeur par défaut */ }
Les propriétés top, right, bottom, left sont ignorées
Vous n'écrirez presque jamais cette valeur
position: relative
Décalage par rapport à sa position normale
.box { position: relative; top: 20px; left: 30px; }
Caractéristiques :
position: absolute
Position par rapport au parent positionné le plus proche
.parent { position: relative; } .child { position: absolute; top: 10px; right: 10px; }
<body>
<div class="card"> <span class="badge">NEW</span> <h3>Titre</h3> <p>Contenu</p> </div>
.card { position: relative; padding: 20px; } .badge { position: absolute; top: 10px; right: 10px; background: red; color: white; padding: 5px 10px; }
position: fixed
Position fixe par rapport à la fenêtre
.header { position: fixed; top: 0; left: 0; width: 100%; }
Usage : Headers fixes, boutons flottants
.navbar { position: fixed; top: 0; width: 100%; height: 60px; } body { padding-top: 60px; /* Hauteur du header */ }
position: sticky
Hybride entre relative et fixed
.sidebar { position: sticky; top: 20px; }
Comportement :
Usage : Sidebars, en-têtes de tableaux
Contrôle la superposition des éléments
.back { position: absolute; z-index: 1; } .front { position: absolute; z-index: 2; /* Au-dessus */ }
Règles :
.navbar { position: fixed; z-index: 100; } .modal { position: fixed; z-index: 200; } .overlay { position: fixed; z-index: 199; }
Convention : Utiliser des valeurs espacées (100, 200, 300...)
.center { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
Explication :
top: 50%; left: 50%;
transform
Alternative : Flexbox ou Grid (plus simple)
Sélecteurs avancés
:nth-child()
Box Model
Positionnement
Box Model : Toujours utiliser box-sizing: border-box
Spécificité : Éviter !important
Positionnement :
DevTools : Indispensable pour déboguer
Mise en pratique des concepts vus aujourd'hui
À la prochaine séance