10 min de lecture · 2 192 mots

HTML5 & CSS3 : Aide-mémoire complet

HTML5 & CSS3 : Aide-mémoire complet

Structure HTML5

Balises sémantiques principales

| Balise | Usage | Exemple |
|——–|——-|———|
|

| En-tête de page/section | Navigation, logo |
| | Navigation principale | Menu de navigation |
|
| Contenu principal | Une seule par page |
|
| Contenu autonome | Article de blog, produit |
|
| Section thématique | Regroupement logique |
| | Contenu annexe | Sidebar, publicité |
|
| Pied de page/section | Copyright, liens |
|
| Contenu illustratif | Image avec légende |
|
| Légende de figure | Description d’image |
| | Date/heure | |
| | Texte surligné | Mise en évidence |
|
| Contenu pliable | Accordéon natif |
| | Titre de details | Titre cliquable |

Structure type d’une page HTML5




    
    
    
    Titre de la page (50-60 caractères)
    


    

Titre principal

Section 1

Contenu...

© 2024 Votre site

Balises de formulaire HTML5






















    


6 sur 10
70%

Balises multimédia









    
    
    Description




    

Balises utiles moins connues


Cliquez pour déplier

Contenu caché qui s'affiche au clic

Titre du modal

Contenu

HTML

Citation longue

Auteur

function exemple() {
    console.log("Code formaté");
}

Terme 1
Définition 1
Terme 2
Définition 2

CSS3 : Propriétés essentielles

Sélecteurs CSS3

/ Sélecteurs de base /
 { }                           / Tous les éléments /
div { }                         / Par balise /
.classe { }                     / Par classe /
#id { }                         / Par ID /
div, p { }                      / Groupement /
div p { }                       / Descendant /
div > p { }                     / Enfant direct /
div + p { }                     / Frère adjacent /
div ~ p { }                     / Tous les frères /

/ Sélecteurs d'attributs /
[attr] { }                      / Attribut existe /
[attr="value"] { }              / Attribut égal /
[attr~="value"] { }             / Contient le mot /
[attr|="value"] { }             / Commence par /
[attr^="value"] { }             / Préfixe /
[attr$="value"] { }             / Suffixe /
[attr="value"] { }             / Contient /

/ Pseudo-classes /
:hover { }                      / Survol /
:focus { }                      / Focus /
:active { }                     / Actif /
:visited { }                    / Visité /
:first-child { }                / Premier enfant /
:last-child { }                 / Dernier enfant /
:nth-child(2) { }               / N-ième enfant /
:nth-child(odd) { }             / Impairs /
:nth-child(even) { }            / Pairs /
:nth-child(3n+1) { }            / Tous les 3, décalé de 1 /
:nth-of-type(2) { }             / N-ième du type /
:not(.classe) { }               / Négation /
:empty { }                      / Vide /
:checked { }                    / Case cochée /
:disabled { }                   / Désactivé /
:enabled { }                    / Activé /
:required { }                   / Requis /
:valid { }                      / Valide /
:invalid { }                    / Invalide /

/ Pseudo-éléments /
::before { content: ""; }       / Avant le contenu /
::after { content: ""; }        / Après le contenu /
::first-letter { }              / Première lettre /
::first-line { }                / Première ligne /
::selection { }                 / Sélection texte /
::placeholder { }               / Placeholder /

Box Model & Positionnement

/ Box Model /
.element {
    / Taille /
    width: 300px;
    height: 200px;
    min-width: 200px;
    max-width: 500px;
    min-height: 100px;
    max-height: 400px;

    / Box-sizing /
    box-sizing: border-box;     / Inclut padding et border dans width/height /

    / Espacement /
    margin: 20px;               / Tous les côtés /
    margin: 10px 20px;          / Vertical | Horizontal /
    margin: 10px 20px 30px;     / Haut | H | Bas /
    margin: 10px 20px 30px 40px; / Haut | Droite | Bas | Gauche /
    margin-top: 10px;
    margin-right: 20px;
    margin-bottom: 30px;
    margin-left: 40px;
    margin: 0 auto;             / Centrer horizontalement /

    padding: 20px;              / Même syntaxe que margin /

    / Bordures /
    border: 2px solid #333;
    border-width: 2px;
    border-style: solid;        / solid, dashed, dotted, double, none /
    border-color: #333;
    border-radius: 10px;
    border-radius: 10px 20px 30px 40px;
    border-top-left-radius: 10px;

    / Ombres /
    box-shadow: 0 4px 6px rgba(0,0,0,0.1);
    box-shadow: inset 0 2px 4px rgba(0,0,0,0.1); / Interne /
    box-shadow: 0 0 10px #333, 0 0 20px #666;   / Multiple /
}

/ Position /
.position {
    position: static;           / Par défaut /
    position: relative;         / Relatif à position normale /
    position: absolute;         / Relatif au parent positionné /
    position: fixed;            / Relatif au viewport /
    position: sticky;           / Sticky au scroll /

    top: 10px;
    right: 20px;
    bottom: 30px;
    left: 40px;

    z-index: 100;               / Ordre d'empilement /
}

/ Display /
.display {
    display: block;
    display: inline;
    display: inline-block;
    display: none;              / Caché /
    visibility: hidden;         / Invisible mais prend place /
    opacity: 0.5;               / Transparence 0-1 /
}

/ Débordement /
.overflow {
    overflow: visible;          / Par défaut /
    overflow: hidden;           / Masque le débordement /
    overflow: scroll;           / Toujours des scrollbars /
    overflow: auto;             / Scrollbars si nécessaire /
    overflow-x: hidden;
    overflow-y: auto;

    text-overflow: ellipsis;    / ... pour texte tronqué /
    white-space: nowrap;        / Pas de retour à la ligne /
}

Flexbox

/ Container Flex /
.flex-container {
    display: flex;
    display: inline-flex;

    / Direction /
    flex-direction: row;            / Par défaut, horizontal /
    flex-direction: row-reverse;    / Inverse /
    flex-direction: column;         / Vertical /
    flex-direction: column-reverse;

    / Retour à la ligne /
    flex-wrap: nowrap;              / Par défaut, une ligne /
    flex-wrap: wrap;                / Retour à la ligne /
    flex-wrap: wrap-reverse;

    / Raccourci direction + wrap /
    flex-flow: row wrap;

    / Alignement horizontal (axe principal) /
    justify-content: flex-start;    / Par défaut, début /
    justify-content: flex-end;      / Fin /
    justify-content: center;        / Centré /
    justify-content: space-between; / Espacement entre /
    justify-content: space-around;  / Espacement autour /
    justify-content: space-evenly;  / Espacement égal /

    / Alignement vertical (axe secondaire) /
    align-items: stretch;           / Par défaut, étire /
    align-items: flex-start;        / Haut /
    align-items: flex-end;          / Bas /
    align-items: center;            / Centré /
    align-items: baseline;          / Ligne de base texte /

    / Alignement des lignes (si wrap) /
    align-content: flex-start;
    align-content: flex-end;
    align-content: center;
    align-content: space-between;
    align-content: space-around;
    align-content: stretch;

    / Gap entre items /
    gap: 20px;
    row-gap: 20px;
    column-gap: 10px;
}

/ Items Flex /
.flex-item {
    / Ordre /
    order: 0;                       / Par défaut, 0 /

    / Croissance /
    flex-grow: 0;                   / Par défaut, ne grandit pas /
    flex-grow: 1;                   / Grandit pour remplir /

    / Réduction /
    flex-shrink: 1;                 / Par défaut, peut rétrécir /
    flex-shrink: 0;                 / Ne rétrécit pas /

    / Taille de base /
    flex-basis: auto;               / Par défaut /
    flex-basis: 200px;              / Taille de base /
    flex-basis: 50%;

    / Raccourci grow shrink basis /
    flex: 0 1 auto;                 / Par défaut /
    flex: 1;                        / flex: 1 1 0 /
    flex: 1 0 200px;

    / Alignement individuel /
    align-self: auto;
    align-self: flex-start;
    align-self: flex-end;
    align-self: center;
    align-self: baseline;
    align-self: stretch;
}

/ Exemple pratique : Layout 3 colonnes /
.layout-flex {
    display: flex;
    gap: 20px;
}
.sidebar {
    flex: 0 0 250px;               / Largeur fixe 250px /
}
.main-content {
    flex: 1;                       / Prend l'espace restant /
}
.aside {
    flex: 0 0 200px;               / Largeur fixe 200px /
}

/ Centrer parfaitement /
.center-flex {
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
}

CSS Grid

/ Container Grid /
.grid-container {
    display: grid;
    display: inline-grid;

    / Définir colonnes /
    grid-template-columns: 200px 200px 200px;           / 3 colonnes fixes /
    grid-template-columns: 1fr 2fr 1fr;                 / Proportionnelles /
    grid-template-columns: repeat(3, 1fr);              / 3 colonnes égales /
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); / Responsive /
    grid-template-columns: 200px auto 200px;

    / Définir lignes /
    grid-template-rows: 100px 200px 100px;
    grid-template-rows: repeat(3, 100px);
    grid-template-rows: auto 1fr auto;                  / Header, content, footer /

    / Zones nommées /
    grid-template-areas:
        "header header header"
        "sidebar main aside"
        "footer footer footer";

    / Gap (espacement) /
    gap: 20px;                      / Lignes et colonnes /
    row-gap: 20px;
    column-gap: 10px;

    / Alignement du contenu (dans les cellules) /
    justify-items: start;           / Horizontal /
    justify-items: end;
    justify-items: center;
    justify-items: stretch;         / Par défaut /

    align-items: start;             / Vertical /
    align-items: end;
    align-items: center;
    align-items: stretch;

    / Alignement de la grille (dans le container) /
    justify-content: start;
    justify-content: end;
    justify-content: center;
    justify-content: space-between;
    justify-content: space-around;
    justify-content: space-evenly;

    align-content: start;
    align-content: end;
    align-content: center;
    align-content: space-between;
    align-content: space-around;
    align-content: space-evenly;

    / Taille automatique /
    grid-auto-rows: 100px;          / Hauteur lignes implicites /
    grid-auto-columns: 200px;       / Largeur colonnes implicites /
    grid-auto-flow: row;            / Direction auto (row/column/dense) /
}

/ Items Grid /
.grid-item {
    / Position par ligne/colonne /
    grid-column-start: 1;
    grid-column-end: 3;
    grid-column: 1 / 3;             / Raccourci /
    grid-column: 1 / span 2;        / Occupe 2 colonnes /
    grid-column: 1 / -1;            / Jusqu'à la fin /

    grid-row-start: 1;
    grid-row-end: 3;
    grid-row: 1 / 3;
    grid-row: 1 / span 2;

    / Zone nommée /
    grid-area: header;

    / Alignement individuel /
    justify-self: start;
    justify-self: end;
    justify-self: center;
    justify-self: stretch;

    align-self: start;
    align-self: end;
    align-self: center;
    align-self: stretch;
}

/ Exemple : Layout complet /
.page-grid {
    display: grid;
    grid-template-columns: 250px 1fr 200px;
    grid-template-rows: auto 1fr auto;
    grid-template-areas:
        "header header header"
        "sidebar main aside"
        "footer footer footer";
    gap: 20px;
    min-height: 100vh;
}
.page-header { grid-area: header; }
.page-sidebar { grid-area: sidebar; }
.page-main { grid-area: main; }
.page-aside { grid-area: aside; }
.page-footer { grid-area: footer; }

/ Exemple : Galerie responsive /
.gallery {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    gap: 20px;
    padding: 20px;
}

Typographie

.typography {
    / Police /
    font-family: Arial, Helvetica, sans-serif;
    font-family: 'Open Sans', sans-serif;

    / Taille /
    font-size: 16px;
    font-size: 1rem;                / Relatif à html /
    font-size: 1.2em;               / Relatif au parent /
    font-size: clamp(14px, 2vw, 24px); / Responsive fluide /

    / Poids /
    font-weight: normal;            / 400 /
    font-weight: bold;              / 700 /
    font-weight: 100;               / Thin /
    font-weight: 300;               / Light /
    font-weight: 500;               / Medium /
    font-weight: 600;               / Semi-bold /
    font-weight: 900;               / Black /

    / Style /
    font-style: normal;
    font-style: italic;
    font-style: oblique;

    / Hauteur de ligne /
    line-height: 1.5;               / Recommandé pour lisibilité /
    line-height: 24px;

    / Alignement /
    text-align: left;
    text-align: right;
    text-align: center;
    text-align: justify;

    / Transformation /
    text-transform: none;
    text-transform: uppercase;
    text-transform: lowercase;
    text-transform: capitalize;

    / Décoration /
    text-decoration: none;
    text-decoration: underline;
    text-decoration: line-through;
    text-decoration: overline;
    text-decoration: underline wavy red;

    / Espacement /
    letter-spacing: 0.05em;         / Entre les lettres /
    word-spacing: 0.2em;            / Entre les mots /
    text-indent: 30px;              / Indentation première ligne /

    / Ombre texte /
    text-shadow: 2px 2px 4px rgba(0,0,0,0.3);
    text-shadow: 0 0 10px #fff, 0 0 20px #fff; / Glow /

    / Couleur /
    color: #333;
    color: rgb(51, 51, 51);
    color: rgba(51, 51, 51, 0.8);
    color: hsl(0, 0%, 20%);
    color: hsla(0, 0%, 20%, 0.8);

    / Ellipsis (texte tronqué) /
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;

    / Limiter lignes avec ellipsis /
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/ @font-face personnalisée /
@font-face {
    font-family: 'MaPolice';
    src: url('fonts/mapolice.woff2') format('woff2'),
         url('fonts/mapolice.woff') format('woff');
    font-weight: normal;
    font-style: normal;
    font-display: swap;             / Améliore performance /
}

Couleurs & Arrière-plans

.colors-backgrounds {
    / Couleurs /
    color: #3498db;
    color: rgb(52, 152, 219);
    color: rgba(52, 152, 219, 0.8);
    color: hsl(204, 70%, 53%);
    color: hsla(204, 70%, 53%, 0.8);

    / Arrière-plan /
    background-color: #f0f0f0;
    background-image: url('image.jpg');
    background-repeat: no-repeat;   / repeat, repeat-x, repeat-y /
    background-position: center;
    background-position: top left;
    background-position: 50% 50%;
    background-size: cover;         / Couvre tout /
    background-size: contain;       / Contient entièrement /
    background-size: 100% auto;
    background-attachment: fixed;   / Parallax /

    / Raccourci /
    background: #f0f0f0 url('img.jpg') no-repeat center/cover;

    / Dégradés linéaires /
    background: linear-gradient(to right, #3498db, #e74c3c);
    background: linear-gradient(45deg, #3498db, #e74c3c);
    background: linear-gradient(to bottom, #3498db 0%, #e74c3c 100%);
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);

    / Dégradés radiaux /
    background: radial-gradient(circle, #3498db, #e74c3c);
    background: radial-gradient(ellipse at center, #3498db 0%, #e74c3c 100%);

    / Dégradés coniques /
    background: conic-gradient(from 0deg, red, yellow, green, blue, red);

    / Multiples arrière-plans /
    background:
        linear-gradient(rgba(0,0,0,0.3), rgba(0,0,0,0.3)),
        url('image.jpg') center/cover;

    / Clip du background /
    background-clip: border-box;    / Par défaut /
    background-clip: padding-box;
    background-clip: content-box;
    background-clip: text;          / Texte avec dégradé /
    -webkit-background-clip: text;
    color: transparent;             / Pour background-clip: text /
}

Transitions & Animations

/ Transitions /
.transition {
    transition: all 0.3s ease;
    transition-property: background-color, transform;
    transition-duration: 0.3s;
    transition-timing-function: ease;        / ease, linear, ease-in, ease-out, ease-in-out /
    transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
    transition-delay: 0.1s;

    / Raccourci : property duration timing-function delay /
    transition: transform 0.3s ease-in-out 0.1s, opacity 0.3s ease;
}

.transition:hover {
    background-color: #3498db;
    transform: scale(1.1);
}

/ Animations /
@keyframes slideIn {
    0% {
        transform: translateX(-100%);
        opacity: 0;
    }
    100% {
        transform: translateX(0);
        opacity: 1;
    }
}

@keyframes pulse {
    0%, 100% {
        transform: scale(1);
    }
    50% {
        transform: scale(1.1);
    }
}

@keyframes rotate {
    from {
        transform: rotate(0deg);
    }
    to {
        transform: rotate(360deg);
    }
}

.animated {
    animation: slideIn 0.5s ease-out;
    animation-name: slideIn;
    animation-duration: 0.5s;
    animation-timing-function: ease-out;
    animation-delay: 0s;
    animation-iteration-count: 1;           / infinite /
    animation-direction: normal;            / reverse, alternate, alternate-reverse /
    animation-fill-mode: forwards;          / backwards, both /
    animation-play-state: running;          / paused /

    / Raccourci : name duration timing-function delay iteration-count direction fill-mode /
    animation: slideIn 0.5s ease-out 0s 1 normal forwards;
}

/ Transform /
.transform {
    / 2D /
    transform: translate(50px, 100px);
    transform: translateX(50px);
    transform: translateY(100px);
    transform: scale(1.5);
    transform: scaleX(1.5);
    transform: scaleY(0.5);
    transform: rotate(45deg);
    transform: skew(10deg, 20deg);
    transform: skewX(10deg);
    transform: skewY(20deg);

    / 3D /
    transform: perspective(1000px) rotateY(45deg);
    transform: rotateX(45deg);
    transform: rotateY(45deg);
    transform: rotateZ(45deg);
    transform: translateZ(50px);
    transform: translate3d(50px, 100px, 75px);
    transform: scale3d(1, 1.5, 1);

    / Multiple /
    transform: translateX(50px) rotate(45deg) scale(1.2);

    / Origine /
    transform-origin: center;               / Par défaut /
    transform-origin: top left;
    transform-origin: 50% 50%;
    transform-origin: 20px 40px;

    / Style 3D /
    transform-style: preserve-3d;
    backface-visibility: hidden;
    perspective: 1000px;
}

Media Queries (Responsive)

/ Mobile First (recommandé) /
/ Styles de base pour mobile /
.container {
    width: 100%;
    padding: 10px;
}

/ Tablette /
@media (min-width: 768px) {
    .container {
        width: 750px;
        padding: 20px;
    }
}

/ Desktop /
@media (min-width: 1024px) {
    .container {
        width: 960px;
    }
}

/ Large Desktop /
@media (min-width: 1280px) {
    .container {
        width: 1200px;
    }
}

/ Desktop First /
@media (max-width: 1023px) {
    / Tablette /
}

@media (max-width: 767px) {
    / Mobile /
}

/ Orientation /
@media (orientation: portrait) {
    / Portrait /
}

@media (orientation: landscape) {
    / Paysage /
}

/ Ratio d'aspect /
@media (aspect-ratio: 16/9) {
    / Ratio 16:9 /
}

/ Résolution /
@media (min-resolution: 2dppx) {
    / Écrans Retina /
}

/ Préférences utilisateur /
@media (prefers-color-scheme: dark) {
    / Mode sombre /
    body {
        background: #1a1a1a;
        color: #f0f0f0;
    }
}

@media (prefers-reduced-motion: reduce) {
    / Réduire animations /
     {
        animation: none !important;
        transition: none !important;
    }
}

/ Multiple conditions /
@media (min-width: 768px) and (max-width: 1023px) {
    / Seulement tablette /
}

@media (min-width: 768px) and (orientation: landscape) {
    / Tablette en paysage /
}

Variables CSS (Custom Properties)

/ Définition des variables /
:root {
    / Couleurs /
    --primary-color: #3498db;
    --secondary-color: #e74c3c;
    --text-color: #333;
    --bg-color: #f0f0f0;

    / Espacements /
    --spacing-xs: 5px;
    --spacing-sm: 10px;
    --spacing-md: 20px;
    --spacing-lg: 40px;
    --spacing-xl: 80px;

    / Typographie /
    --font-primary: 'Open Sans', sans-serif;
    --font-heading: 'Montserrat', sans-serif;
    --font-size-sm: 14px;
    --font-size-md: 16px;
    --font-size-lg: 20px;

    / Ombres /
    --shadow-sm: 0 2px 4px rgba(0,0,0,0.1);
    --shadow-md: 0 4px 6px rgba(0,0,0,0.1);
    --shadow-lg: 0 10px 15px rgba(0,0,0,0.1);

    / Transitions /
    --transition-fast: 0.15s;
    --transition-normal: 0.3s;
    --transition-slow: 0.5s;

    / Breakpoints /
    --mobile: 480px;
    --tablet: 768px;
    --desktop: 1024px;
}

/ Utilisation /
.button {
    background-color: var(--primary-color);
    padding: var(--spacing-sm) var(--spacing-md);
    font-family: var(--font-primary);
    box-shadow: var(--shadow-md);
    transition: all var(--transition-normal);
}

.button:hover {
    background-color: var(--secondary-color);
}

/ Valeur par défaut (fallback) /
.element {
    color: var(--undefined-color, #333);
}

/ Variables locales /
.card {
    --card-padding: 20px;
    padding: var(--card-padding);
}

/ Mode sombre avec variables /
@media (prefers-color-scheme: dark) {
    :root {
        --text-color: #f0f0f0;
        --bg-color: #1a1a1a;
        --primary-color: #5dade2;
    }
}

Propriétés modernes utiles

/ Filter /
.filter {
    filter: blur(5px);
    filter: brightness(1.2);
    filter: contrast(1.5);
    filter: grayscale(100%);
    filter: hue-rotate(90deg);
    filter: invert(100%);
    filter: opacity(50%);
    filter: saturate(200%);
    filter: sepia(100%);
    filter: drop-shadow(0 4px 6px rgba(0,0,0,0.1));

    / Multiple /
    filter: brightness(1.1) contrast(1.2) saturate(1.3);
}

/ Backdrop Filter (arrière-plan flou) /
.glassmorphism {
    background: rgba(255, 255, 255, 0.1);
    backdrop-filter: blur(10px);
    border: 1px solid rgba(255, 255, 255, 0.2);
}

/ Clip Path /
.clip {
    clip-path: circle(50%);
    clip-path: ellipse(50% 60%);
    clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
    clip-path: inset(10px 20px 30px 40px);
}

/ Object Fit (images) /
.image {
    width: 300px;
    height: 200px;
    object-fit: cover;              / Couvre en rognant /
    object-fit: contain;            / Contient entièrement /
    object-fit: fill;               / Étire /
    object-fit: none;               / Taille originale /
    object-fit: scale-down;
    object-position: center;
    object-position: top right;
}

/ Aspect Ratio /
.video-container {
    aspect-ratio: 16 / 9;
    width: 100%;
}

.square {
    aspect-ratio: 1;
}

/ Scroll Behavior /
html {
    scroll-behavior: smooth;
}

/ Scroll Snap /
.scroll-container {
    scroll-snap-type: y mandatory;
    overflow-y: scroll;
    height: 100vh;
}

.scroll-item {
    scroll-snap-align: start;
    height: 100vh;
}

/ User Select /
.no-select {
    user-select: none;
}

/ Pointer Events /
.disabled {
    pointer-events: none;
}

/ Mix Blend Mode /
.blend {
    mix-blend-mode: multiply;
    mix-blend-mode: screen;
    mix-blend-mode: overlay;
    mix-blend-mode: difference;
}

/ Writing Mode /
.vertical-text {
    writing-mode: vertical-rl;
    writing-mode: vertical-lr;
}

Bonnes pratiques

Performance

  • Minifier CSS en production
  • Utiliser will-change avec parcimonie pour animations
  • Éviter sélecteurs trop complexes
  • Utiliser transform et opacity pour animations (GPU)
  • Charger polices avec font-display: swap
  • Organisation

    / BEM (Block Element Modifier) /
    .card { }                          / Block /
    .cardtitle { }                   / Element /
    .cardbutton { }                  / Element /
    .card--featured { }                / Modifier /
    .card_button--primary { }         / Element + Modifier /
    
    / Structure recommandée /
    / 1. Variables /
    / 2. Reset/Normalize /
    / 3. Base (html, body) /
    / 4. Layout /
    / 5. Composants /
    / 6. Utilitaires /
    / 7. Media queries /
    

    Accessibilité

    / Focus visible /
    :focus-visible {
        outline: 2px solid var(--primary-color);
        outline-offset: 2px;
    }
    
    / Masquer visuellement mais accessible /
    .sr-only {
        position: absolute;
        width: 1px;
        height: 1px;
        padding: 0;
        margin: -1px;
        overflow: hidden;
        clip: rect(0, 0, 0, 0);
        white-space: nowrap;
        border: 0;
    }
    
    / Contraste suffisant /
    / Ratio min 4.5:1 pour texte normal /
    / Ratio min 3:1 pour texte large (18px+ ou 14px+ gras) /
    
    / Éviter animations pour prefers-reduced-motion /
    @media (prefers-reduced-motion: reduce) {
        , ::before, *::after {
            animation-duration: 0.01ms !important;
            animation-iteration-count: 1 !important;
            transition-duration: 0.01ms !important;
        }
    }
    

    Pièges courants

  • Oublier box-sizing: border-box - Toujours l'inclure globalement
  • Z-index anarchique - Définir une échelle (10, 20, 30...)
  • !important - À éviter sauf cas exceptionnels
  • Unités absolues (px) partout - Préférer rem/em pour typographie
  • Animations sans préfixe - Ajouter préfixes navigateurs si support ancien
  • Oublier fallbacks - Toujours prévoir une alternative
  • ---

    Version: 2024 | Compatibilité: Navigateurs modernes (2+ dernières versions)

    Une remarque, un retour ?

    Cet article est vivant — corrections, contre-arguments et retours de production sont les bienvenus. Trois canaux, choisissez celui qui vous convient.