Introduction
- HTML = Hyper Text Markup Language (langage de description de page hypertexte)
- Définition d'un ensemble de balises organisables en nœuds sous la forme d'un arbre (modèle Document Object Model DOM)
-
Deux variantes du langage HTML :
- La variante classique basée sur la syntaxe SGML plus tolérante
- La variante XHTML basée sur la syntaxe XHTML plus stricte
- Rendu des nœuds personnalisable avec des feuilles de style CSS
- Dynamisation de l'arbre DOM (modification selon événements) avec le langage de programmation JavaScript
HTML vs. XHTML
Plus de contraintes pour la variante XHTML :
- Fermeture obligatoire des balises
- Casse des balises importante (en pratique toujours en minuscules)
- Valeur obligatoire pour un attribut : indication entre guillemets (exemple : <input type=button disabled> devra être écrit <input type="button" disabled="1" /> en XHTML)
- Imbrication correcte des balises (même ordre d'ouverture et de fermeture des balises)
- Présence au début du document du DOCTYPE XML
- Document défini à l'intérieur de balises <html xmlns="...">..</html> avec indication d'un namespace XML pour les balises
Exemple de page XHTML minimaliste :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Hello World</title> </head> <body> <p>Hello <br /> World!</p> </body> </html>
- Exemple de validateur pour le code HTML (utilisant Java et Python) : Nu HTML Checker
Organisation d'une page HTML
-
Un document HTML comprend deux parties
- Un en-tête compris entre balises <head>...</head> qui comprend les méta-données de la page (titre, résumé, mots-clés, lien vers des versions alternatives, lien vers des feuilles de style...)
- Un corps de page entre balises <body>...</body> qui contient le contenu à afficher pour la page
- Le code HTML peut être commenté avec <!-- Commentaire -->
Exemple d'en-tête de page : balises <head>...</head>
<head> <title>Titre de la page</title> <!-- Quelques balises meta --> <meta charset="UTF-8" /> <!-- Jeu de caractères utilisé pour encoder le texte de la page --> <meta name="description" content="Résumé de la page, peut être utilisé par les moteurs de recherche pour afficher un snippet" /> <meta name="keywords" content="motcle1, motcle2, ..." /> <!-- Des mots-clés de la page --> <meta name="author" content="John Doe" /> <!-- L'auteur de la page --> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <!-- Pour indiquer le comportement d'affichage --> <!-- Des balises meta http-equiv qui jouent le rôle d'en-têtes HTTP (sans avoir besoin de configurer le serveur) --> <meta http-equiv="pragma" content="no-cache" /> <!-- La page ne doit pas être conservée dans le cache --> <meta http-equiv="refresh" content="60" /> <!-- La page doit être rafraîchie automatiquement toutes les minutes --> <!-- Balises link référençant des ressources utilisées par la page --> <link rel="stylesheet" href="mystyle.css" /> <!-- Indication d'une feuille de style CSS à appliquer --> <link rel="icon" type="image/png" href="logo.png" /> <!-- Chemin vers une icone (favicon) pour le site --> <link rel="canonical" href="http://example.com/page.html" /> <!-- Si la page est accessible à différentes adresses, on indique son adresse canonique de référence --> <link rel="alternate" hreflang="fr-ca" href="http://example.com/tabernacle.html" /> <!-- Indique une version alternative de notre document en québecquois --> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Course", "name": "Une petite introduction au langage HTML", "description": "Différentes choses plus ou moins intéressantes concernant le HTML et ses nombreuses balises diverses et variées.", "provider": { "@type": "Organization", "name": "Université Gustave Eiffel", "sameAs": "http://www.univ-eiffel.fr" } } </script> </head>
Quelques explications :
- Les balises meta permettent de spécifier des méta-données sur la page ; certaines balises meta de type http-equiv permettent d'indiquer des informations normalement communiquées dans les en-têtes HTTP (utile si on n'a pas la possibilité de configurer le serveur HTTP)
- Les balises link permettent de spécifier l'emplacement de ressources liés au document : icône, feuille de style, version dans une autre langue...
- Il est possible d'ajouter des méta-données JSON-LD qui suivent des ontologies disponibles schema.org. Ces méta-données peuvent être utilisées par des moteurs de recherche tels que Google pour afficher des résultats directs.
Balises pour le corps de page
Structuration de la page
Le corps d'une page est compris entre les balises <body> ... </body>. Une page peut comprendre les sections suivantes :
-
Un en-tête encapsulé dans les balises <header> ... </header> comprenant par exemple un menu de navigation, un logo du site...
- Un menu de navigation pourra être inclus entre balises <nav> ... </nav>
-
On peut inclure le contenu principal de la page dans des balises <main> ... </main>
- Ce contenu peut inclure plusieurs unités rédactionnelles indépendantes entre balises <article> ... </article>
- Un pied de page dans les balises <footer> ... </footer> avec par exemple des informations de copyright sur le contenu
<body> <header> <img src="logo.png" alt="Un beau logo" /> <nav> <a href="page1.html">Page 1</a> | <a href="page2.html">Page 2</a> </nav> </header> <main> <h1>Some comments</h1> <article> <h2>Comment0</h2> <p>Very interesting</p> </article> <article> <h2>Comment1</h2> <p>Bad!</p> </article> </main> <footer> <hr /> Copyright John Doe, under CC By-NC-SA license </footer> </body>
- Il est recommandé d'utiliser les balises sémantiques (header, main, article, section, footer, nav...) plutôt que des div (conteneur générique) afin d'améliorer l'accessibilité du site au lecteurs d'écran braille et synthèses vocales
- Il est possible d'ajouter des attributs ARIA (Accessible Rich Internet Applications) pour décrire sémantiquement certains contenus
- Pour plus d'informations concernant l'accessibilité : page de MDN
Sections et titres
Les balises <h1>...</h1> jusqu'à <h6>...</h6> permettent d'indiquer 6 niveaux de titre du plus important (h1) au moins important (h6). On les utilise généralement au début de section pour structurer le document comme présenté ici :
<section> <h1>Le langage HTML</h1> <p>HTML est un langage de description de page sympathique</p> <section> <h2>Partie head</h2> <p> Très important pour indiquer les méta-données de la page. </p> </section> <section> <h2>Partie body</h2> <p> C'est là que l'on a le contenu de la page </p> <section> <h3>Structuration</h3> <p>Blablabla...</p> </section> </section> </section>
Texte
Balises essentielles
Les paragraphes de texte sont inclus entre balises <p>...</p>. Différentes balises peuvent être utilisées pour mettre en valeur des passages de texte :
- <em>...</em> pour mettre en emphase (en italique)
- <strong>...</strong> pour mettre en gras
- <code>...</code>
pour indiquer du code (à mettre avec une police à espacement fixe)
- <samp>...</samp> pour indiquer un exemple de sortie d'un programme
- <kbd>...</kbd> pour indiquer une commande entrée au clavier
- <var>...</var> pour indiquer une variable
- <s>...</s>
pour indiquer quelque chose de faux (barré) - <abbr title="IGM">Institut Gaspard-Monge</abbr> affiche une abbréviation avec la possibilité d'obtenir sa signification en passant le pointeur dessus
- <cite>...</cite> permet d'indiquer le titre d'un œuvre (qui sera mise en italique)
- <q>...</q> delimite
une citation courte
Retour à la ligne
Par défaut les retours à la ligne ne sont pas pris en compte pour le rendu du texte : il faut utiliser la balise <br /> (en XHTML) pour indiquer un retour à la ligne.
Le texte entre balises <pre> ... </pre> est rendu avec les retours à la ligne et utilise par défaut une police à espacement fixe.
Caractères spéciaux
Certains caractères ont un rôle spécial :
- <, > pour les balises
- " et ' pour délimiter les attributs des balises
- & pour introduire une entité XML
Pour utiliser un caractères spécial dans le texte, on le déspécialise en utilisant leur entité HTML :
- < : <
- > : >
- " : "
- ' : '
- & : &
☠ La génération de code HTML depuis une entrée externe impose la déspécialisation de ces caractères ; dans le cas contraire un attaquant contrôlant l'entrée peut injecter du code JavaScript arbitraire dans la page qui peut avoir des conséquences fâcheuses (vol de cookies de session par exemple)
Listes
- <ul>...</ul> (unordered list) permet de délimiter une liste non-numérotée
- <ol>...</ol> (ordered list) délimite une liste numérotée
- Chaque item d'une liste est compris dans des balises <li>...</li> (list item)
- Il est possible d'imbriquer une liste dans un item d'une autre liste
Voici un exemple :
<p>Liste de courses</p> <ol> <li>Fruits <ul> <li>Bananes</li> <li>Pommes</li> <li>Cerises</li> </ul> </li> <li>Légumes <ul> <li>Tomates</li> <li>Oignons</li> </ul> </li> </ol>
☞ Il est possible de modifier le style de numérotation (pour ol) ou de tirets (pour ul) en utilisant le style CSS list-style-type
Tableaux
Les tableaux permettent d'organiser du contenu sur plusieurs lignes et colonnes avec <table> ... </table> :
- <caption> ... </caption> indique une légende pour le tableau
-
<colgroup> ... </colgroup> permet de définir des propriétés stylistiques pour les colonnes
- <col style="..." span="n" /> permet d'indiquer un style pour n colonnes du tableau
-
<thead> ... </thead> définit la ou les lignes d'en-tête
-
Chaque ligne est délimitée par <tr> ... </tr> (table row)
- A l'intérieur d'une ligne d'en-tête, une cellule est délimitée par <th> ... </th>
-
Chaque ligne est délimitée par <tr> ... </tr> (table row)
-
<tbody> ... </tbody> définit les lignes de corps du tableau
-
Chaque ligne est délimitée par <tr> ... </tr>
- A l'intérieur d'un ligne, on définit les cellules avec <td> ... </td>
-
Chaque ligne est délimitée par <tr> ... </tr>
- <tfoot> ... </tfoot> permet d'indiquer des lignes de pied pour le tableau (qui peuvent être un rappel des lignes de thead pour un grand tableau)
Réalisons comme un exemple un tableau récapitulant les différentes versions de HTML ainsi que leur année d'apparition :
<table> <caption>Tableau des différentes versions de HTML</caption> <colgroup> <col style="background-color: gray" /> <col style="" span="2" /> </colgroup> <thead> <tr> <th>Année</th> <th>Version</th> <th>Commentaires</th> </tr> </thead> <tbody> <tr> <td>1993</td> <td>1.0</td> <td>La première version issue des propositions de Tim Berners-Lee</td> </tr> <tr> <td>1995</td> <td>2.0</td> <td>Définie dans la RFC 1866</td> </tr> <tr> <td>1997</td> <td>3.2</td> <td>Standardisation des tables</td> </tr> <tr> <td>1997</td> <td>4.0</td> <td>Introduction des frames, de l'utilisation des scripts</td> </tr> <tr> <td>2008</td> <td>5.0</td> <td>Nouvelles balises pour la structuration des pages, balises multimédia audio et video</td> </tr> </tbody> </table>
Liens hypertextes
Un lien hypertexte renvoie vers une autre ressource. Il est définissable avec la balise <a href="chemin/vers/ressource">Texte du lien</a>. Le chemin vers la ressource peut être exprimé de diverses façons :
- Soit à l'aide d'une URL complète comme https://www.example.com/page.html
- Soit par une URL sans le protocole telle que //www.example.com/page.html (on utilise le même protocole, sécurisé ou non, que la page hébergeant le lien)
- Soit en indiquant le chemin par rapport à la racine du serveur, par exemple /page.html
- Soit par un chemin relatif ; par exemple si la page hébergeant le lien est présente à l'adresse http://www.example.com/site/article.html et veut lier la ressource d'adresse http:///www.example.com/otherdir/page.html, elle peut utiliser le chemin relatif ../otherdir/page.html (le chemin absolu serait /otherdir/page.html)
Il est possible d'ajouter une ancre à l'URL : page.html#anchor. Le navigateur se rendra sur la page et défilera jusqu'à l'élément de la page dont l'identifiant est anchor (par exemple <p id="anchor">blabla</p>). L'ancre n'est pas transmise au serveur et peut aussi être utilisée pour paramétrer le code JavaScript.
Différents attributs peuvent être ajoutés dans un lien hypertexte :
- download="filename" pour indiquer au client HTTP qu'il doit télécharger la ressource plutôt que l'afficher
- hreflang="fr" pour indiquer la langue de la ressource
- rel="..." pour indiquer la relation avec le document réalisant le lien (par exemple license indique une licence pour le document, next la suite du document...). On peut indiquer plusieurs valeurs séparées par des virgules. La valeur non standard nofollow permet d'indiquer à un moteur de recherche que le lien ne doit pas être suivi (généralement utilisé sur les messages postés par les internautes).
Formulaires
Un formulaire permet de recueillir des informations de l'utilisateur. Un formulaire est compris dans des balises <form> ... </form>. La balise ouvrante form peut accueillir des attributs indiquant comment le contenu du formulaire peut être envoyé vers le serveur :
- Attribut method="get|post" pour indiquer la méthode HTTP à utiliser pour l'envoi (la méthode get inclut les données dans l'URL, post dans le corps de la requête)
- Attribut action="..."` pour indiquer le chemin vers la ressource du serveur où envoyer les données
- L'envoi est généralement provoqué en cliquant sur un bouton.
☞ Il est aussi possible d'envoyer les données programmatiquement par du code JavaScript. Un formulaire peut aussi servir à modifier la page localement sans réaliser de requête d'envoi.
Un formulaire peut contenir divers éléments que nous décrivons ci-après.
Entrée de texte
La balise <input name="fieldname" type="text"> permet d'afficher une zone de texte. On peut l'associer avec un label :
<label for="comment">Enter a comment</label> <input type="text" id="comment" name="comment" value="default prefilled value" />
Il existe différentes valeurs de type pour input en fonction des données attendues (certains types ne sont pas supportés par tous les navigateurs) :
- text pour un texte classique (certains attributs permettent d'indiquer des contraintes : maxLength pour une taille maximal, pattern pour indiquer une expression régulière à vérifier, placeholder pour afficher un texte indicatif lorsque le champ est vide)
- color pour sélectionner une couleur
- date, time, datetime-local, month, week pour sélectionner une date ou un horaire
- email qui réalise une vérification élémentaire de l'email entré (en utilisant une expression régulière)
- number, range : pour un nombre saisissable manuellement avec number ou à l'aide d'un curseur avec range
- tel pour un numéro de téléphone
- url
- ...
Pour entrer du texte sur plusieurs lignes, l'élément textarea est plus adapté :
<textarea name="comment" rows="3" cols="50"> Default text </textarea>
On peut récupérer le contenu d'un champ programmatiquement en JavaScript avec sa propriété value (de type string) :
window.alert("You entered " + document.querySelector("input[name='comment']").value);
Autres variantes de la propriété value (autre type que string) :
- valueAsNumber peut être utilisé pour un <input type="number"> ou <input type="range">
- valueAsDate peut être utilisé pour un <input type="date">
Sélection parmi un ensemble de valeur
Nous pouvons afficher des boutons radio pour permettre la sélection d'une valeur parmi un ensemble (une seule valeur peut être cochée parmi boutons du même nom) :
<label><input type="radio" name="power" value="electricity">Electricité</label><br /> <label><input type="radio" name="power" value="oil">Essence</label><br /> <label><input type="radio" name="power" value="gasoil">Diesel</label><br /> <label><input type="radio" name="power" value="hydrogen">Hydrogène</label><br />
Alternativement, nous pouvons afficher une liste déroulante avec l'élément select :
<select name="power"> <option value="electricity">Electricité</option> <option value="oil">Essence</option> <option value="gasoil">Diesel</option> <option value="hydrogen">Hydrogène</option> </select>
select peut utiliser les attributs suivants de configuration :
- mutiple="true" qui permet la sélection de plusieurs éléments dans la liste
- size="n" permet d'afficher n éléments de la liste (avec un ascenseur s'il y a plus d'éléments) ; par défaut un seul élément (l'élément sélectionné) est affiché avec un menu déroulant
Autres éléments de formulaires
Voici d'autres éléments qui peuvent être utilisés dans des formulaires :
- <input type="checkbox" name="mycheckbox" /> pour une case à cocher (possède une propriété checked indiquant si elle est cochée ou non)
- <input type="hidden" name="key" value="some value" /> permet d'avoir un champ caché dont la valeur n'est pas affichée (mais sera soumise lors de l'envoi du contenu du formulaire vers un serveur)
- <input type="reset" name="resetButton" value="Reset the form" /> permet d'avoir un bouton pour réinitialiser les valeurs du formulaire
- <input type="submit" name="submitButton" value="Submit the form" /> affiche un bouton de validation du formulaire.
Eléments multimédias
Une page HTML peut incorporer des images, sons et vidéos. On utilise à cet effet les balises <img>, <audio> et <video> qui peuvent accueillir les attributs suivants :
- src="..." pour indiquer l'adresse de la ressource multimédia
- alt="Text alternatif" permet d'indiquer pour une balise img un texte à afficher si le client web ne supporte pas l'affichage de l'image/vidéo ou le rendu du son (utile pour l'accessibilité aux handicapés visuels/auditifs)
-
Pour les balises audio et video
- controls="true" permet d'afficher des bouton de contrôle de lecture (lecture, pause...)
- muted="true" permet de désactiver le son
- loop="true" permet de lire le contenu en boucle
- autoplay="true" permet de lancer la lecture dès le chargement (pratique plutôt à éviter)
Il existe une API JavaScript afin de contrôler programmatiquement la lecture de sons/vidéos.