XHTML ou eXtensible HyperText Markup Language est un langage à/de balises issu de XML,
qui dérive lui-même des concepts du SGML (Standard Generalized Markup Language) conçu à partir de 1969
par Charles Goldfarb travaillant à l'époque chez IBM.
SGML est employé dans les industries de la documentation et de l'édition.
La compréhension d'une langue (français, anglais, ...) repose sur au moins deux points :
la syntaxe : l'ordre dans lequel apparaissent les mots
la sémantique : le sens des mots
L'idée fondamentale soutendue par XML est l'utilisation de balises pour ajouter un contenu sémantique à un texte. Par exemple,
la phrase Le lion mange la gazelle peut être agrémentée de balises :
<articlegenre="masculin"nombre="singulier"> le </article>
<nomtype="animal, domestique"> chat </nom>
</sujet>
<verbegroupe="premier"personne="troisieme"
nombre="singulier"racine="manger"
temps="indicatif-présent"> mange </verbe>
<complement>
<articlegenre="feminin"nombre="singulier"> la </article>
<nomtype="animal, rongeur"> souris </nom>
</complement>
</phrase>
On retrouve la phrase initiale agrémentée d'informations complémentaires :
phrase, sujet, article, ... sont des balises
genre, nombre, type, racine, temps sont des attributs
le chat mange la souris, représente le contenu
Le langage XHTML est l'application de ce principe à la description de pages web.
Ainsi, à partir d'un ensemble de textes, on pourrait en déduire le régime alimentaire des lions. Il suffirait d'utiliser
un outil d'interrogation de fichiers XML en cherchant, dans toutes les phrases, le mot lion/lionne dans le sujet et mange/dévore au niveau du verbe.
Le complément doit alors contenir un animal que les lions mangent.
XHTML 1.0 (2001) est une évolution de HTML version 4.01 basée sur XML. La version XHTML 2.0 qui a été développée pendant près de 8 ans a été abandonnée en 2009 à la faveur de XHTML 5 (2012). XHTML 2.0 n'était pas rétro-compatible avec HTML 4.
Aujourd'hui on parle de manière équivalente de HTML 5 ou XHTML 5. XHTML est simplement plus restrictif dans sa syntaxe. On parle alors de (X)HTML.
Parmi les principaux éléments liés à XHTML 5, on note :
l'introduction d'un canvas qui permet de réaliser des graphiques
l'édition de documents directement dans la page web
la validation automatique de formulaires
le glisser / déposé plus simple
la gestion améliorée des supports média : audio, vidéo
de nouveaux éléments structurels qui évitent l'utilisation des <div>
Les conventions sont les suivantes :
balises et attributs sont écrits en minuscule
une balise est toujours fermée : <p> ... </p>, sauf les balises auto-fermantes (cf. plus avant)
certaines balises qui ne peuvent être fermées comme break rule, passage à la ligne, s'écrivent <br />
les valeurs des attributs sont données entre double quotes attribut="valeur"
3.1.1. DTD
On associe généralement à un fichier XML un fichier DTD (pour Document Type Definition), qui décrit la grammaire du document :
liste des éléments (ou balises)
liste des attibuts, leur contenu et leur agencement
Une DTD permet notamment grâce à des outils spécifiques de vérifier qu'un fichier XML suit l'organisation de la grammaire, on vérifie donc la conformité de la syntaxe.
Dans l'exemple qui suit, on définit un système qui permet de déclarer des classes pour, par
la suite, générer le code C++ ou Java correspondant. On dit par exemple en ligne 1 que la balise ezxml2code contient une
ou plusieurs (+) balises class. En ligne 3, on indique qu'une balise class contient
éventuellement (?) une balise import, suivie d'une balise attributes, suivie éventuellement
d'une balise methods.
En ligne 5, on déclare l'attibut name associé à la balise class. Cet attribut est
de type chaîne de caractère (CDATA) et il est nécessaire de le déclarer (#REQUIRED).
Les fichier (X)HTML prennent l'extension .html ou (parfois .htm), il existe d'autres extensions notamment lorsque l'on utilise des langages de script pour dynamiser les pages web :
.php pour le langage PHP
.py pour Python
.pl pour Perl
.asp Active Server Page, Microsoft
.jsp Java Server Pages (J2EE, Oracle)
3.2. Organisation d'une page XHTML
L'organisation (ou la structure) d'une page web est la suivante :
préambule qui décrit la grammaire de la page et comment le document devra être interprété par le navigateur
En fonction de la version HTML / XHTML, on utilisera un préambule différent :
On voit rapidement qu'il est plus facile d'utiliser XHTML 5.
l'entête head qui décrit des informations supplémentaires qui ne seront pas affichées :
balises meta : description de la page, de l'auteur, mots-clés, encodage des caractères
balises link : référence à des feuilles de styles pour la mise en forme
balises script : référence à du code Javascript pour dynamiser la page côté client
balise title qui permet de définir une chaîne de caractère qui sera affichée dans l'onglet du navigateur qui affiche la page
la partie body qui représente ce qui sera effectivement affiché dans le navigateur
3.2.1. Meta et viewport
Il existe pour la balise meta, attribut name de valeur viewport et
dont l'attribut content contient une valeur qui permet d'optimiser l'affichage sur portable ou tablette.
Ces dernières années, les résolutions d'écran ont atteint une taille telle que les pixels individuels
sont difficiles à distinguer à l'œil nu. Par exemple, les smartphones récents ont généralement un écran de 5
pouces avec des résolutions supérieures à 1920-1080 pixels (~400 dpi). Pour cette raison, de nombreux
navigateurs peuvent afficher leurs pages dans une taille physique plus petite en convertissant plusieurs
pixels matériels pour chaque « pixel » CSS. Au départ, cela a causé des problèmes de convivialité et de
lisibilité sur de nombreux sites Web optimisés pour le tactile.
puis on introduit le document avec la balise html, celle-ci peut comporter plusieurs attributs, ici en l'occurrence on trouve :
dir (optionnelle) qui indique la direction d'affichage du texte ltr (= Left To Right)
lang qui indique la localisation linguistique : le français de France. On aurait pu utiliser :
fr-BE : Français belge
fr-CA : Français canadien
en-GB : Anglais britannique
en-US : Anglais américain
...
vient ensuite la partie entête head qui décrit :
l'encodage des caractères et le titre de la page
l'auteur de la page
les mots clés associés à la page (utile pour le référencement)
la description de la page (utile pour le référencement)
finalement, le contenu body qui contient une balise main qui contient un titre et un paragraphe.
on remarque que les commentaires sont déclarés sous la forme <!-- commentaire -->
On notera la définition de l'encodage des caractères est assez simple. Il existe une autre manière de faire en utilisant le code suivant :
<metahttp-equiv="Content-Type"content="text/html;charset=utf-8"><!-- Préférer la méthode ci-dessous --><metacharset="utf-8" >
3.3. Eléments structurants de la page
Parmi les balises XHTML qui permettent de décrire le contenu d'une page dans body, on trouve les balises structurantes, c'est-à-dire
celles qui permettent d'organiser la page en différentes parties :
Si on suit une organisation classique d'une page, on trouve :
header qui permet de créer une zone plus ou moins haute dans laquelle on place le titre de la page, attention il ne faut pas confondre
cette balise avec la balise head au début du document XHTML
nav qui permet de disposer d'une zone de navigation avec un menu à l'horizontale
aside (on peut ne pas l'utiliser) qui permet de positionner un menu vertical sur le côté qui peut correspondre à une table des matières, ou une liste d'ingrédients pour une recette, ...
main qui correspond au contenu principal, cette partie sera composée d'article et de section
footer qui comme la partie header autorise à disposer d'une zone verticale avec diverses informations (Copyright, adresse de contact, email, téléphone, ...)
Il est à noter que les balises section et article sont interchangeables : une section peut contenir des articles
qui peuvent contenir des sections et inversement. La balise main pourra donc contenir plusieurs sections ou articles.
3.3.1. Autre balise structurante
La balise div est également souvent utilisée pour introduire des éléments structurants qui ne correspondraient pas à l'un des éléments précédents.
On donne généralement un attribut identifiant id à ces balises div afin de pouvoir leur
appliquer un style ou modifier leur contenu (cf. CSS, Javascript).
3.4. Eléments non structurants de la page
Nous allons à présent nous intéresser aux balises liées au texte, aux listes, aux tableaux.
3.4.1. Eléments liés au texte
Les deux éléments principaux liés au texte sont les titres et les paragraphes :
les titres (ou headers, attention là encore, il ne faut pas confondre avec la balise header) sont
introduits par la lettre h suivie par un chiffre de 1 à 6 : h1, ..., h6
D'autres balises à l'intérieur d'un titre ou d'un paragraphe permette de modifier l'apparence de celui-ci :
la balise b (bold) permet de mettre le texte en gras
la balise i (italic) permet de mettre le texte en italique
la balise em (emphasis) permet de mettre le texte en emphase (similaire à l'italique)
la balise s (emphasis) permet de barrer un texte
la balise u (underline) permet de souligner un texte
la balise quote introduit une citation
la balise sub (subscript) met le texte en indice
la balise sup (super-script) met le texte en exposant
la balise span permet de modifier le style du texte (voir CSS)
Il est recommandé de ne plus utiliser certaines de ces balises comme b, u, i, s (et de passer par le CSS) même si elles restes utilisables et bien pratiques.
Voici un exemple qui utilise le style (CSS) défini pour cette page :
<p>Je veux aller au <ahref="#JE_VEUX_ALLER_LA">second paragraphe</a> de la page</p><pid="JE_VEUX_ALLER_LA">Un second paragraphe</p>
3.4.2.c Ouvrir un nouvel onglet
On peut également ouvrir une page dans un nouvel onglet en ajoutant l'attribut target. On recommande d'ajouter rel="noopener noreferrer" pour des raisons de sécurité :
<p>Ouvrir une nouvelle fenêtre vers <ahref="http://yahoo.fr"target="_parent"onclick="window.open('http://yahoo.fr', name='_blank', 'width=600, height=400, toolbar=yes, resizable=no'); return false;">Yahoo</a>.</p>
3.4.3. Les images
Il existe une seule balise auto fermante appelée <img> pour insérer des images. Elle dispose de plusieurs attributs comme :
src (obligatoire) qui donne l'URL de l'image
alt, que l'on conseille de remplir, et qui donne une description sous forme d'un texte de l'image; elle remplacera l'image si celle-ci n'est pas trouvée
width, la largeur de l'image (facultatif), exprimée en pixels; on ne donne que la largeur sans préciser l'unité
height, la hauteur de l'image (facultatif), exprimée en pixels; on ne donne que la hauteur sans préciser l'unité
<pclass="center"><imgsrc="ens/l1/img/bi2_part_2.png"alt="structure des répertoires sous Linux"width="400"height="300"/></p>
Deux nouvelles balises ont été introduites afin de gérer les images :
les listes non numérotées introduites par ul (unordered list)
les listes numérotéesol (ordered list)
les listes de définitions ou de descriptions dl (description list) pour lesquelles on associe un texte explicatif à un terme ou une expression
Pour les listes ul et ol, la balise li (list item) permet de définir
un élément de la liste.
Pour les listes dl on utilise deux autres balises :
dt (data term) définit un terme qui sera mis en gras
dd (data definition) correspond au texte associé à ce terme
L'exemple qui suit montre comment utiliser ces listes :
Liste non numérotée
premier élément
second élément
Liste numérotée
premier élément
second élément
Liste de descriptions
Nos Cafés
Cappuccino
Latté
Latté Machiatto
Nos Thés
English Breakfast
Chaï
Combinaison de listes
Nos Cafés
Capuccino
classique
lait d'amande
lait de coco
Latté
Latté Machiatto
Nos Thés
English Breakfast
Darjeeling
Russian
Chaï
<!-- liste non numérotée --><h5>Liste non numérotée</h5><ul><li>premier élément</li><li>second élément</li></ul><!-- liste numérotée --><h5>Liste numérotée</h5><ol><li>premier élément</li><li>second élément</li></ol><!-- liste de descriptions --><h5>Liste de descriptions</h5><dl><dt>Nos Cafés</dt><dd>Cappuccino</dd><dd>Latté</dd><dd>Latté Machiatto</dd><dt>Nos Thés</dt><dd>English Breakfast</dd><dd>Chaï</dd></dl><!-- Combinaison de listes --><h5>Combinaison de listes</h5><dl><dt>Nos Cafés</dt><dd> Capuccino
<ul><li>classique</li><li>lait d'amande</li><li>lait de coco</li></ul></dd><dd>Latté</dd><dd>Latté Machiatto</dd><dt>Nos Thés</dt><dd>English Breakfast
<ol><li>Darjeeling</li><li>Russian</li></ol></dd><dd>Chaï</dd></dl>
Concernant les listes, on pourra modifier le style de numérotation ou le symbole utilisé pour les listes non numérotées qui peut être un carré, un cercle ou une image.
3.4.4.a listes non numérotées
On utilise la propriété list-style-type qui peut prendre les valeurs suivantes :
none : rien n'est affiché avant le texte
square : un carré précède le texte
circle : un cercle précède le texte, c'est le style par défaut
Remarque : ces valeurs peuvent aussi s'appliquer à des listes numérotées.
3.4.4.b listes numérotées
On modifie le type de numérotation en utilisant la même propriété mais en utilisant les valeurs :
decimal : 1, 2, 3
lower-alpha : a, b, c
upper-alpha : A, B, C
lower-roman : i, ii, iii, iv
upper-roman : I, II, III, IV
3.4.4.c listes avec image
Il est possible de remplacer les cercles ou carrés par une image en définissant la propriété list-style-image. Cependant le texte ne sera pas centré verticalement par rapport à l'image. Il est donc préférable de suivre ce qui est fait dans l'exemple suivant.
3.4.5. Eléments liés aux tableaux
les tableaux sont introduits par la balise table (voir la documentation W3C Tables Module).
De nouvelles balises ont été introduites en XHTML afin de pouvoir afiner les styles des tableaux :
thead concerne les titres des colonnes
tfoot concerne les dernières lignes du tableau, normalement cette balise doit être introduite avant tbody
tbody englobe les lignes de données de la table
caption converne la légende de la table
summary est un texte qui peut être utilisé pour décrire la table et peut également être utilisé par un
système de synthèse vocale pour aider les non voyants
Les balises classiques sont les suivantes :
tr (table row) définit une ligne
th (table header) définit une cellule qui contient le titre d'une colonne
td (table data) définit une cellule de données
Ma première table
Month
Savings
Sum
$180
January
$100
February
$80
<tablestyle="border-collapse: collapse;"width="350"class="center"><caption>Ma première table</caption><!-- l'entête avec les titres des colonnes --><thead><tr><th>Month</th><th>Savings</th></tr></thead><!-- éventuellement le bas de tableau avec des données récapitulatives --><tfoot><trstyle="background: wheat; font-weight: bold;"><td>Sum</td><tdclass="right">$180</td></tr></tfoot><!-- le corps avec les données --><tbody><tr><td>January</td><tdclass="right">$100</td></tr><tr><td>February</td><tdclass="right">$80</td></tr></tbody></table>
Deux attributs sont également utilisés pour les balises td :
colspan qui définit le nombre de cellules que l'on désire agglutiner
rowspan qui définit le nombre de lignes que l'on désire agglutiner
Voici un exemple avec une table de 4 lignes par 3 colonnes :
on fusionne les deux premières colonnes de la première ligne
ainsi que les deux dernières lignes sur la première colonne
Les formulaires permettent de saisir des informations qui seront envoyées au serveur pour y être traitées : il peut s'agir de faire un calcul, d'insérer ou d'extraire des informations d'une base de données.
3.5.1. La balise form
Les formulaires débutent par la balise <form>...</form>, cette balise contient trois attributs :
name qui définit le nom du formulaire, mais qui est optionnel
method qui définit la manière dont seront envoyées les données : post ou get
action qui est l'URL ou envoyer les données
Si les données sont envoyées au format get, elles seront ajoutées à l'URL fournie dans l'attribut action.
Les différents éléments de base qui composent les formulaires sont les suivants :
les champs de saisie de texte comme les input (sur une ligne) ou les textarea sur plusieurs lignes
les boutons (button) ou les champs input de typesubmit
les boites ou listes déroulantes (combo box) appelées select
les cases à cocher :
à choix exclusif (input) de typeradio button
ou multiples de typecheckbox
Nous allons passer en revue ces différents éléments afin de voir comment les utiliser.
3.5.3. Les labels
Le label permet de définir du texte associé à un élément de saisie d'information.
Il dispose d'un attribut for qui spécifie à quel élément le label est associé au travers d'un id ce qui autorise le focus sur l'élément de saisie en cliquant sur le label : "nom (label avec for)".
<formname="label1"method="post"action=""><labelfor="nom">nom (label avec for)</label><inputtype="text"name="nom"value=""id="nom"/><br/><label>prénom (label sans for)</label><inputtype="text"name="prenom"value=""id="prenom"/><br/><br/><label> </label><inputtype="submit"value="Submit"onclick="return _label1();"/></form>
3.5.4. Les champs input
Les champs input permettent de saisir de l'information textuelle en précisant éventuellement un format de saisie.
On doit définir les attibuts suivants pour ce genre de champs :
name qui correspond au nom du champ qui sera réutilisé par le serveur pour extraire l'information soumise
value la valeur initiale du champ, ce champ est bien entendu optionnel
type qui correspond au type de champ
L'attribut type peut prendre plusieurs valeurs :
text : qui signifie qu'on saisit du texte
password : qui cache le texte saisi et donc lié à la saisie des mots de passe
reset : pour une remise à zéro des champs
submit : qui est équivalent à un bouton sur lequel on clique afin d'envoyer les informations du formulaire à un serveur
file et image pour télécharger (upload) des fichiers
checkbox ou radio : pour créer des case à cocher (voir ci-après)
avec HTML5 ont été rajoutés : date, email, url, tel, number, ...