HTML structure le contenu, CSS le met en forme. Maîtrise des balises sémantiques, Flexbox, Grid, responsive design, animations et bonnes pratiques pour créer des interfaces web modernes et accessibles.

HTML5 Sémantique

HTML
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="Description page pour SEO">
    <title>Titre de la Page</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <!-- En-tête principal -->
    <header>
        <nav>
            <ul>
                <li><a href="#accueil">Accueil</a></li>
                <li><a href="#services">Services</a></li>
                <li><a href="#contact">Contact</a></li>
            </ul>
        </nav>
    </header>

    <!-- Contenu principal -->
    <main>
        <article>
            <header>
                <h1>Titre de l'Article</h1>
                <p><time datetime="2025-10-03">3 octobre 2025</time></p>
            </header>
            
            <section>
                <h2>Introduction</h2>
                <p>Contenu de l'article...</p>
            </section>
            
            <aside>
                <p>Information complémentaire</p>
            </aside>
        </article>
    </main>

    <!-- Pied de page -->
    <footer>
        <p>© 2025 Mon Site</p>
    </footer>

    <script src="script.js"></script>
</body>
</html>

Balises importantes

Balise Usage
<header> En-tête de page ou section
<nav> Navigation principale
<main> Contenu principal (unique)
<article> Contenu indépendant (blog post, produit)
<section> Section thématique
<aside> Contenu périphérique (sidebar)
<footer> Pied de page
<figure> <figcaption> Image avec légende

Formulaires HTML5

HTML
<form action="/submit" method="POST">
    <!-- Texte -->
    <label for="nom">Nom :</label>
    <input type="text" id="nom" name="nom" required>

    <!-- Email avec validation -->
    <label for="email">Email :</label>
    <input type="email" id="email" name="email" required>

    <!-- Mot de passe -->
    <label for="password">Mot de passe :</label>
    <input type="password" id="password" name="password" 
           minlength="8" required>

    <!-- Nombre -->
    <label for="age">Âge :</label>
    <input type="number" id="age" name="age" 
           min="18" max="120">

    <!-- Date -->
    <label for="date">Date de naissance :</label>
    <input type="date" id="date" name="date">

    <!-- Téléphone -->
    <input type="tel" name="phone" 
           pattern="[0-9]{3}-[0-9]{3}-[0-9]{4}">

    <!-- URL -->
    <input type="url" name="website">

    <!-- Checkbox -->
    <input type="checkbox" id="newsletter" name="newsletter">
    <label for="newsletter">Recevoir newsletter</label>

    <!-- Radio buttons -->
    <input type="radio" id="homme" name="genre" value="homme">
    <label for="homme">Homme</label>
    
    <input type="radio" id="femme" name="genre" value="femme">
    <label for="femme">Femme</label>

    <!-- Select -->
    <label for="pays">Pays :</label>
    <select id="pays" name="pays">
        <option value="">-- Choisir --</option>
        <option value="ch">Suisse</option>
        <option value="fr">France</option>
    </select>

    <!-- Textarea -->
    <label for="message">Message :</label>
    <textarea id="message" name="message" rows="4"></textarea>

    <!-- Fichier -->
    <input type="file" name="photo" accept="image/*">

    <button type="submit">Envoyer</button>
</form>

Bases CSS

CSS
/* Sélecteurs */
element { }              /* Toutes les balises element */
.classe { }             /* Classe */
#id { }                 /* ID (unique) */
element.classe { }      /* Element avec classe */
element, autre { }      /* Plusieurs éléments */
parent enfant { }       /* Descendance */
parent > enfant { }     /* Enfant direct */
element + suivant { }   /* Adjacent */

/* Pseudo-classes */
a:hover { }             /* Survol */
input:focus { }         /* Focus */
li:first-child { }      /* Premier enfant */
li:last-child { }       /* Dernier enfant */
li:nth-child(2n) { }    /* Enfants pairs */

/* Pseudo-éléments */
p::before { content: "→ "; }
p::after { content: " ←"; }
p::first-line { }

/* Propriétés communes */
color: #6366F1;
background-color: #F0F0F0;
font-size: 16px;
font-weight: bold;
text-align: center;
margin: 10px;           /* Extérieur */
padding: 15px;          /* Intérieur */
border: 2px solid #333;
border-radius: 8px;
width: 100%;
height: 200px;
display: block;
position: relative;

Box Model

┌────────────────────────────────────┐
│         MARGIN (extérieur)         │
│  ┌──────────────────────────────┐  │
│  │      BORDER (bordure)        │  │
│  │  ┌────────────────────────┐  │  │
│  │  │   PADDING (intérieur)  │  │  │
│  │  │  ┌──────────────────┐  │  │  │
│  │  │  │     CONTENT      │  │  │  │
│  │  │  │    (contenu)     │  │  │  │
│  │  │  └──────────────────┘  │  │  │
│  │  └────────────────────────┘  │  │
│  └──────────────────────────────┘  │
└────────────────────────────────────┘
                    
CSS
/* Notation complète */
margin: 10px 20px 10px 20px;  /* haut droite bas gauche */
margin: 10px 20px;             /* haut/bas  droite/gauche */
margin: 10px;                  /* tous côtés */

/* Notation individuelle */
margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left: 20px;

/* Centrer horizontalement */
margin: 0 auto;

Flexbox

Flexbox permet d'aligner et distribuer des éléments facilement, idéal pour les layouts modernes.

CSS
/* Container flex */
.container {
    display: flex;
    
    /* Direction */
    flex-direction: row;           /* Horizontal (défaut) */
    flex-direction: column;        /* Vertical */
    flex-direction: row-reverse;   /* Horizontal inversé */
    
    /* Alignement principal (axe principal) */
    justify-content: flex-start;   /* Début (défaut) */
    justify-content: center;       /* Centré */
    justify-content: flex-end;     /* Fin */
    justify-content: space-between; /* Espacement entre */
    justify-content: space-around;  /* Espacement autour */
    justify-content: space-evenly;  /* Espacement égal */
    
    /* Alignement transversal (axe croisé) */
    align-items: stretch;          /* Étirer (défaut) */
    align-items: flex-start;       /* Haut */
    align-items: center;           /* Centré */
    align-items: flex-end;         /* Bas */
    
    /* Retour à la ligne */
    flex-wrap: nowrap;             /* Pas de wrap (défaut) */
    flex-wrap: wrap;               /* Wrap si besoin */
    
    /* Gap entre éléments */
    gap: 20px;                     /* Moderne */
}

/* Items flex */
.item {
    flex: 1;                       /* Prend espace disponible */
    flex-grow: 1;                  /* Peut grandir */
    flex-shrink: 1;                /* Peut rétrécir */
    flex-basis: 200px;             /* Taille de base */
    
    align-self: center;            /* Override align-items */
    order: 2;                      /* Ordre d'affichage */
}

Exemple pratique : Navigation

CSS
/* Navigation horizontale centrée */
nav {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 20px;
}

nav ul {
    display: flex;
    gap: 30px;
    list-style: none;
}

/* Cards en ligne */
.cards {
    display: flex;
    gap: 20px;
    flex-wrap: wrap;
}

.card {
    flex: 1 1 300px;  /* Grandir, rétrécir, base 300px */
    min-width: 300px;
}

CSS Grid

Grid permet de créer des layouts bidimensionnels complexes.

CSS
/* Container grid */
.container {
    display: grid;
    
    /* Définir colonnes */
    grid-template-columns: 200px 1fr 200px;  /* 3 colonnes */
    grid-template-columns: repeat(3, 1fr);   /* 3 colonnes égales */
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); /* Responsive */
    
    /* Définir lignes */
    grid-template-rows: 100px auto 100px;
    
    /* Gap */
    gap: 20px;
    row-gap: 10px;
    column-gap: 20px;
}

/* Items grid */
.item {
    /* Span sur plusieurs colonnes/lignes */
    grid-column: 1 / 3;        /* Colonnes 1 à 3 */
    grid-column: span 2;       /* Sur 2 colonnes */
    
    grid-row: 1 / 3;
    grid-row: span 2;
}

/* Template areas (nommées) */
.container {
    grid-template-areas:
        "header header header"
        "sidebar main main"
        "footer footer footer";
}

.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }

Exemple pratique : Layout page

CSS
/* Layout classique */
.page {
    display: grid;
    grid-template-columns: 250px 1fr;
    grid-template-rows: 60px 1fr 80px;
    min-height: 100vh;
    gap: 0;
}

.header {
    grid-column: 1 / -1;  /* Toute la largeur */
}

.sidebar {
    grid-row: 2 / 3;
}

.main {
    grid-row: 2 / 3;
}

.footer {
    grid-column: 1 / -1;
}

Responsive Design

CSS
/* Mobile first */
.container {
    width: 100%;
    padding: 15px;
}

/* Tablette */
@media (min-width: 768px) {
    .container {
        max-width: 720px;
        margin: 0 auto;
    }
}

/* Desktop */
@media (min-width: 1024px) {
    .container {
        max-width: 960px;
    }
    
    .grid {
        grid-template-columns: repeat(3, 1fr);
    }
}

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

/* Points de rupture standards */
/* Mobile: < 768px */
/* Tablette: 768px - 1023px */
/* Desktop: 1024px - 1279px */
/* Large: >= 1280px */

Unités responsive

CSS
/* Unités absolues */
px              /* Pixels */

/* Unités relatives */
%               /* Pourcentage du parent */
em              /* Relatif à la police du parent */
rem             /* Relatif à la police racine (html) */
vw              /* 1% largeur viewport */
vh              /* 1% hauteur viewport */
vmin            /* 1% plus petite dimension */
vmax            /* 1% plus grande dimension */

/* Exemples */
font-size: 16px;           /* Fixe */
font-size: 1rem;           /* Relatif racine */
width: 50%;                /* 50% parent */
width: 100vw;              /* Toute largeur écran */
height: 100vh;             /* Toute hauteur écran */

Transitions et Animations

Transitions

CSS
/* Transition simple */
.button {
    background: #6366F1;
    transition: background 0.3s ease;
}

.button:hover {
    background: #4F46E5;
}

/* Transitions multiples */
.card {
    transform: scale(1);
    box-shadow: 0 2px 4px rgba(0,0,0,0.1);
    transition: transform 0.3s ease, box-shadow 0.3s ease;
}

.card:hover {
    transform: scale(1.05);
    box-shadow: 0 8px 16px rgba(0,0,0,0.2);
}

/* Propriétés transition */
transition-property: all;
transition-duration: 0.3s;
transition-timing-function: ease;  /* ease, linear, ease-in, ease-out */
transition-delay: 0.1s;

Animations (keyframes)

CSS
/* Définir animation */
@keyframes fadeIn {
    from {
        opacity: 0;
        transform: translateY(20px);
    }
    to {
        opacity: 1;
        transform: translateY(0);
    }
}

/* Utiliser */
.element {
    animation: fadeIn 0.5s ease;
}

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

.icon {
    animation: pulse 2s infinite;
}

/* Propriétés animation */
animation-name: fadeIn;
animation-duration: 1s;
animation-timing-function: ease;
animation-delay: 0.5s;
animation-iteration-count: infinite;
animation-direction: alternate;  /* normal, reverse, alternate */
animation-fill-mode: forwards;   /* none, forwards, backwards, both */

Variables CSS (Custom Properties)

CSS
/* Définir variables */
:root {
    --primary: #6366F1;
    --secondary: #F59E0B;
    --text: #1E293B;
    --bg: #FFFFFF;
    
    --space-sm: 8px;
    --space-md: 16px;
    --space-lg: 24px;
    
    --radius: 8px;
    --shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

/* Utiliser */
.button {
    background: var(--primary);
    color: white;
    padding: var(--space-md);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
}

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

/* Fallback */
color: var(--text, #000);

Bonnes Pratiques

Sémantique

Utiliser balises HTML5 sémantiques pour structure claire et SEO

Accessibilité

Alt sur images, labels sur inputs, contrastes suffisants

Mobile First

Commencer par mobile, ajouter media queries pour desktop

Performance

CSS minifié, images optimisées, éviter @import

BEM

Nommage classes : .block__element--modifier

Variables CSS

Centraliser couleurs, espacements, pour cohérence