> Le HTML (HyperText Markup Language) est le langage de balisage utilisé pour structurer le contenu des pages web. Il définit ce que contient une page : texte, images, liens, etc.
---------
## Qu'est-ce que le HTML ?
Le HTML n'est **pas un langage de programmation** : c'est un **langage de description** (ou de balisage). Il ne permet pas de faire des calculs, des boucles ou des conditions comme Python. Son rôle est de **structurer** le contenu d'une page web.
### Principe des balises
Le HTML fonctionne avec des **balises** (tags en anglais). Une balise est un mot-clé entouré de chevrons `< >`.
La plupart des balises fonctionnent **par paires** :
- Une balise **ouvrante** : `<balise>`
- Une balise **fermante** : `</balise>` (avec un slash `/`)
```html
<p>Ceci est un paragraphe</p>
```
Certaines balises sont **auto-fermantes** (elles n'ont pas de contenu) :
```html
<br><!-- Retour à la ligne -->
<hr><!-- Ligne horizontale -->
<img><!-- Image -->
```
### Les attributs
Les balises peuvent avoir des **attributs** qui apportent des informations supplémentaires :
```html
<baliseattribut="valeur">Contenu</balise>
```
Exemples :
```html
<ahref="https://www.google.fr">Lien vers Google</a>
<imgsrc="photo.jpg"alt="Description de l'image">
```
---------
## Structure d'une page HTML5
Toute page HTML5 doit respecter une structure minimale :
| `<!DOCTYPE html>` | Indique au navigateur qu'il s'agit d'un document HTML5 |
| `<html lang="fr">` | Élément racine, contient toute la page. L'attribut `lang` précise la langue |
| `<head>` | En-tête du document (métadonnées, titre, liens CSS...). **Non visible** |
| `<meta charset="UTF-8">` | Définit l'encodage des caractères (UTF-8 pour les accents) |
| `<title>` | Titre affiché dans l'onglet du navigateur |
| `<body>` | Corps du document. **Contenu visible** de la page |
### Arborescence HTML
Une page HTML forme une **arborescence** (structure en arbre) :
```
html
├── head
│ ├── meta
│ └── title
└── body
├── h1
├── p
└── ...
```
Les éléments à l'intérieur d'autres éléments sont appelés **enfants**. L'élément qui les contient est leur **parent**.
---------
## Les balises de texte
### Titres
HTML propose 6 niveaux de titres, de `<h1>` (le plus important) à `<h6>` (le moins important) :
```html
<h1>Titre principal</h1>
<h2>Titre de section</h2>
<h3>Sous-titre</h3>
<h4>Titre de niveau 4</h4>
<h5>Titre de niveau 5</h5>
<h6>Titre de niveau 6</h6>
```
> **Bonne pratique** : Une page ne devrait avoir qu'un seul `<h1>`. Les titres doivent être hiérarchiques (pas de `<h3>` après un `<h1>` sans `<h2>` entre les deux).
### Paragraphes et mise en forme
```html
<p>Un paragraphe de texte.</p>
<strong>Texte important (gras)</strong>
<em>Texte mis en emphase (italique)</em>
<mark>Texte surligné</mark>
<del>Texte barré</del>
<sub>Texte en indice</sub> (comme H<sub>2</sub>O)
<sup>Texte en exposant</sup> (comme 2<sup>3</sup>)
```
### Retour à la ligne et séparation
```html
<br><!-- Retour à la ligne simple -->
<hr><!-- Ligne de séparation horizontale -->
```
---------
## Les liens hypertextes
Les liens sont créés avec la balise `<a>` (anchor = ancre) :
```html
<ahref="https://www.exemple.fr">Texte du lien</a>
```
### Attributs importants
| Attribut | Rôle |
|----------|------|
| `href` | URL de destination (obligatoire) |
| `target="_blank"` | Ouvre le lien dans un nouvel onglet |
| `title` | Info-bulle au survol |
### Types de liens
```html
<!-- Lien externe (vers un autre site) -->
<ahref="https://www.google.fr">Google</a>
<!-- Lien interne (vers une autre page du site) -->
<ahref="contact.html">Page contact</a>
<!-- Lien vers un fichier -->
<ahref="documents/rapport.pdf">Télécharger le PDF</a>
<!-- Lien vers une ancre (même page) -->
<ahref="#section2">Aller à la section 2</a>
<!-- Lien email -->
<ahref="mailto:contact@exemple.fr">Envoyer un email</a>
```
### Créer une ancre
Pour créer un point d'ancrage dans la page :
```html
<h2id="section2">Section 2</h2>
```
Le lien `<a href="#section2">` amènera directement à cet élément.
---------
## Les images
Les images sont insérées avec la balise `<img>` (auto-fermante) :
```html
<imgsrc="chemin/vers/image.jpg"alt="Description de l'image">
```
### Attributs obligatoires
| Attribut | Rôle |
|----------|------|
| `src` | Chemin vers l'image (obligatoire) |
| `alt` | Texte alternatif si l'image ne charge pas (obligatoire pour l'accessibilité) |
### Attributs optionnels
```html
<imgsrc="photo.jpg"alt="Photo de vacances"width="400"height="300">
```
### Formats d'images courants
| Format | Extension | Utilisation |
|--------|-----------|-------------|
| JPEG | .jpg, .jpeg | Photos |
| PNG | .png | Images avec transparence |
| GIF | .gif | Animations simples |
| SVG | .svg | Images vectorielles |
| WebP | .webp | Format moderne (compression optimisée) |
### Image cliquable (lien)
```html
<ahref="https://www.exemple.fr">
<imgsrc="logo.png"alt="Logo">
</a>
```
---------
## Les listes
### Liste non ordonnée (à puces)
```html
<ul>
<li>Premier élément</li>
<li>Deuxième élément</li>
<li>Troisième élément</li>
</ul>
```
Rendu :
- Premier élément
- Deuxième élément
- Troisième élément
### Liste ordonnée (numérotée)
```html
<ol>
<li>Premier élément</li>
<li>Deuxième élément</li>
<li>Troisième élément</li>
</ol>
```
Rendu :
1. Premier élément
2. Deuxième élément
3. Troisième élément
### Liste de définitions
```html
<dl>
<dt>HTML</dt>
<dd>HyperText Markup Language</dd>
<dt>CSS</dt>
<dd>Cascading Style Sheets</dd>
</dl>
```
### Listes imbriquées
```html
<ul>
<li>Fruits
<ul>
<li>Pomme</li>
<li>Banane</li>
</ul>
</li>
<li>Légumes</li>
</ul>
```
---------
## Les tableaux
Les tableaux servent à présenter des données tabulaires (et non pour la mise en page !).
```html
<table>
<thead>
<tr>
<th>Nom</th>
<th>Prénom</th>
<th>Âge</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dupont</td>
<td>Jean</td>
<td>25</td>
</tr>
<tr>
<td>Martin</td>
<td>Marie</td>
<td>30</td>
</tr>
</tbody>
</table>
```
### Structure d'un tableau
| Balise | Rôle |
|--------|------|
| `<table>` | Conteneur du tableau |
| `<thead>` | En-tête du tableau |
| `<tbody>` | Corps du tableau |
| `<tfoot>` | Pied du tableau (optionnel) |
| `<tr>` | Ligne (table row) |
| `<th>` | Cellule d'en-tête (table header) |
| `<td>` | Cellule de données (table data) |
### Fusionner des cellules
```html
<!-- Fusionner 2 colonnes -->
<tdcolspan="2">Cellule sur 2 colonnes</td>
<!-- Fusionner 3 lignes -->
<tdrowspan="3">Cellule sur 3 lignes</td>
```
---------
## Les balises sémantiques HTML5
HTML5 introduit des balises **sémantiques** qui donnent du sens à la structure :
```html
<header><!-- En-tête de page ou de section -->
<nav><!-- Menu de navigation -->
<main><!-- Contenu principal (unique par page) -->
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Licence Creative Commons Attribution - Partage dans les Mêmes Conditions 4.0 International</a>.