L’article suivant est la retranscription de l’article que j’ai écrit pour le magazine PHP Solutions, dans le numéro hors série de 2011 consacré à HTML5. Le monde compliqué du droit d’auteur veut que ce texte ne m’appartienne pas, c’est donc avec leur permission express que j’en fait bénéficier mes lecteurs (oui toi). Toute reproduction est donc interdite.
Cet article se veut une introduction générale à HTML5, notamment pour les développeurs PHP qui sont généralement les mieux placés pour prendre au sérieux ce qu’il se passe au frontend. Si vous avez lu mon livre sur HTML5 ou que vous suivez déjà régulièrement l’actualité, je doute que vous y appreniez grand chose. Il explique :
l'origine de la spécification
comment les sites d'aujourd'hui peuvent en bénéficier
le futur des applications Web
les rares synergies entre HTML5 et PHP
Historique
Une définition variable
Le terme même « HTML5 » couvre plusieurs définitions, et nous allons voir que le W3C a surpris tout le monde dans son choix final. Avant que le terme HTML5 n’apparaisse, HTML 4.01 était stabilisé et le W3C planchait sur XHTML 2 car pour eux la syntaxe stricte de XML allait permettre à tous les navigateurs d’être enfin d’accord sur les règles de parsingdes pages.
[caption id=”attachment_924” align=”aligncenter” width=”101” caption=”Le logo volontairement énigmatique du WHATWG”][/caption]
Nous sommes en 2004 et des représentants d’Apple, Opéra et Mozilla, pensant que XHTML 2 est une fausse bonne idée, décident de former un groupe dissident, dénommé non sans ironie WHATWG (What Working Group?). Ils travaillent de leur côté à leur vision du Web : celle d’une plateforme de développement universelle qui pourrait battre les applications natives, aux langages généralement propriétaires et fermés, en étant exécutable sur tous les systèmes et toutes les machines. Leur première spécification est « WebForms 2 », une évolution majeur des formulaires HTML que nous allons aborder plus loin. Vont venir s’ajouter beaucoup de petites spécifications regroupées sous le terme « Web Application 1 ».
En 2006 le terme HTML5 apparaît enfin : c’est la version approuvée par le W3C des spécifications travaillées par le WHATWG. Le Web a eu peur un instant que le W3C soit tellement discrédité par cette affaire que ses spécifications, déjà mal comprises des développeurs Web par la faute des implémentations non conformes de certains navigateurs, ne fassent plus autorité. Désormais cette réconciliation donne un nouveau rythme de travail : les navigateurs (hors Microsoft) testent des implémentations de fonctionnalité à toute vitesse, s’accordent sur les APIs finales et les formalisent, pendant que le W3C garde son rôle de gardien des clés et continue son travail de proposition de spécifications.
En 2009, le W3C accuse le coup du rejet par la communauté des développeurs Web de XHTML 2 et l’abandonne : l’inconvénient majeur de la syntaxe XML était qu’elle ne serait jamais rétrocompatible avec les navigateurs déjà en circulation. A cette époque déjà on a du mal à savoir ce que désigne vraiment HTML5 : des spécifications d’API sont réparties entre trois spécifications (« Web Application », « HTML5 » par le WHATWG et « HTML5 » par le W3C), et certaines devenues trop grosses ou pratiquement finalisées sont carrément sorties de HTML5 pour vivre par elle même.
[caption id=”attachment_925” align=”aligncenter” width=”256” caption=”Le logo officiel de HTML5”][/caption]
En 2011 le terme HTML5 est clairement un terme générique : le W3C déclare officiellement qu’il désigne désormais plus une idée de l’évolution du Web qu’une spécification en particulier, et lui donne par la même occasion un logo. Le WHATWG de soncôté bannit ce terme pour renommer ses spécifications « living standard », ce que l’on pourrait traduire par : « ne cherchez pas la stabilité chez nous, allez plutôt voir le W3C pour ça ».
Le HTML5 dont nous allons parler ici désigne trois choses :
l'évolution de HTML 4, avec une syntaxe assouplie, une nouvelle sémantique et l'introduction des microdata,
de nouvelles interactions utilisateur, avec les nouveaux formulaires, la géolocalisation et le multimédia
l'arrivée des applications Web avec des API JavaScript comme Websocket pour la communication temps réel, la gestion du hors ligne, le stockage d'informations côté client et XMLHTTPRequest 2
Nous avons choisi ces sujets car ce sont que vous pourrez utiliser en production le plus immédiatement, en assurant une compatibilité avec tous les navigateurs depuis Internet Explorer 6.
Quand HTML5 sera-t-il prêt ?
Réponse courte : maintenant, et depuis plusieurs années déjà. Lisez la réponse longue pour comprendre de quoi HTML5 est fait.
2022 ?
A l’époque où le WHATWG commença à travailler sur la spécification en 2004, Ian Hickson, l’éditeur de la spécification, avait annoncé une date qui est restée longtemps dans la mémoire des journalistes : 2022. Il faut bien comprendre qu’il faisait référence aux critères du W3C : des spécifications complètes, finalisées, acceptées, et surtout avec au moins deux implémentations complètement interopérables. Cela semble raisonnable à première vue, mais concrètement ce niveau de qualité repousse très loin les dates de finalisation. Par exemple après 10 ans d’existence et d’utilisation en production, CSS 2.1 vient à peine d’atteindre le niveau final des spécifications : « Recomendation ». Et malgré cela il n’existe pas encore deux navigateurs implémentant toutes les fonctionnalités, et sûrement pas de manière identique. HTML 4.01 lui par contre a bien atteint le niveau « Recomendation » il y a 10 ans, et même si il n’y a pas de test unitaire pour le prouver on peut considérer que plusieurs navigateurs interprètent le même code de la même manière. Mais cela ne change pourtant rien au quotidien des développeurs Web qui doivent assurer le support sur les navigateurs qui ont ignoré ou mal interprété les spécifications.
2011 ?
La mauvaise nouvelle, c’est que l’on vient de voir avec CSS2.1 et HTML 4.01 que l’état d’une spécification du W3C ne signifiait pas grand chose pour le développeur web. La bonne nouvelle, c’est que pour HTML5 non plus l’état de la spécification n’a pas beaucoup d’importance ! Ce qui compte vraiment c’est :
la stabilité des implémentations navigateur,
la possibilité d'émuler la fonctionnalité sur les anciens navigateurs,
à défaut, l'acceptation d'une page non améliorée pour les anciens navigateurs
Autre grande nouvelle : HTML5 n’est pas fait d’un bloc. La spécification se découpe en de nombreuses fonctionnalités séparées, n’ayant parfois pas de lien entre elles, et chaque navigateur avance sur ses sujets favoris. Concrètement il y a aujourd’hui une bonne dizaine de nouvelles fonctionnalités qui sont à la fois suffisamment stables, suffisamment répandues et en même temps simulables sur les anciens navigateurs, ce sont celles que nous allons couvrir rapidement aujourd’hui et qui nous font dire que HTML5 est déjà là.
1999 ?
Poussons le raisonnement jusqu’au bout : en découpant HTML5 en spécifications séparées, on arrive à des conclusions étranges ; Internet Explorer 5.5, sorti en 1999 est compatible avec certaines fonctionnalités HTML5 comme le drag and drop. Évidemment cela s’est fait dans l’autre sens, c’est à dire qu’un des premiers travaux du WHATWG a été de coucher sur le papier des fonctionnalités comme le drag and drop qui n’avaient jamais été écrites. Cet exemple est là pour illustrer que la question du « quand » n’a pas vraiment de sens.
Conclusion : des fonctionnalités majeures associées à HTML5 sont disponibles dès maintenant pour des environnements de production, y compris avec la contrainte du support d’anciens navigateurs.
La philosophie
HTML5 est né dans le conflit et avec la volonté d’être pragmatique pour une adoption rapide. Cela lui confère un certain nombre de principes :
Un assouplissement des règles. En réaction aux travaux sur XHTML 2 qui impliquait la syntaxe stricte de XML dans les pages HTML, HTML5 est clairement permissif et enlève les attributs inutiles, les doctypes compliqués, enlève l'obligation d'utiliser des quotes et autorise les variations de casse.
L'unification des règles de parsing. Les navigateurs respectant HTML5 implémentent le même algorithme d'interprétation du texte HTML pour construire le DOM, c'est à dire la représentation finale du document accessible en CSS et en JavaScript.
La rétro-compatibilité. Au contraire de ce sur quoi s'engageait le W3C à l'époque, les nouvelles fonctionnalités sont introduites avec des syntaxes permettant au parc de navigateurs actuels (en partant de Internet Explorer 6) de ne pas « casser » les pages.
Formalisation de l'existant. Le WHATWG a commencé par écrire les spécifications de fonctionnalités jamais documentées auparavant et pourtant implémentées au prix de longues heures de reverse engineering par tous les navigateurs. Cela va de fonctionnalités complètes comme le drag and drop à des attributs DOM comme .innerHTML.
On le voit, HTML5 a été pensé avec beaucoup de pragmatisme pour une adoption immédiate. Cela est du à la volonté des fabricants de navigateurs de faire avancer le Web. Une fois ces bases saines établies, ils ont maintenant les coudées franches pour rattraper les applications natives en terme de fonctionnalités.
Après HTML4
Avant l’animation 2D, la vidéo ou des piles de JavaScript pour faire du logiciel, HTML5, c’est d’abord du code HTML ! La sémantique est revue, la syntaxe évolue et l’accessibilité est prise en compte.
Nouvelle syntaxe
La modification la plus visible est bien sur l’introduction du nouveau doctype :
<!doctype html>
Cela simplifie les choses et on est même en droit de se demander à quoi servaient les doctypes 4.01 strict ou transitional. Pour la petite histoire, Internet Explorer 6 n’utilisait cette instruction que pour savoir dans quel mode de rendu CSS il fallait se mettre (quirksmode ou mode standard).
Autre simplification : la déclaration de l’encodage de la page.
<meta charset="utf-8">
Certains attributs comme type dont l’absence est universellement bien interprétée peuvent maintenant disparaître :
Plusieurs balises disparaissent carrément car elles ont été accusées de mélanger le fond et la forme. Citons celles qui étaient le plus couramment utilisé : font, center, strike, u, big, frame, frameset ou encore acronym et applet ainsi qu’une petite dizaine d’autres.
Les attributs suivants sont également frappés d’obsolescence :
longdesc et name sur la balise img, scope sur la balise td, classid sur la balise object, target sur la balise link ainsi qu’une dizaine d’autres.
Ont été remplacés pour laisser la place à CSS :
align, bgcolor, background, border, cellpadding et cellspacing sur table, height sur td et th, marginheight et scrolling sur iframe ainsi qu’une vingtaine d’autres.
D’autres changent subtilement de valeur sémantique. Il n’y aurait pas assez de place dans ces colonnes pour ré-expliquer le sens de chacune d’entre elles, aussi prenons la plus célèbre : strong. Avant, elle était censé désigner un mot qui devait se dire avec emphase (sur lequel on mettrait l’accent à l’oral). Cette fonction étant maintenant dévolue à la balise em, strong veut maintenant dire « mot important », ce qui colle avec l’usage effectif qui en était fait aujourd’hui, notamment en référencement.
Enfin et surtout, de nouvelles balises apparaissent, les plus importantes étant les balises dite de section : section, article, aside, header, footer. Elle sont utiles pour préciser un peu les zones de votre site que vous entouriez auparavant d’une div, faute de mieux. Vous pouvez utiliser le chemin de décision suivant pour déterminer la nature de votre balise :
le contenu est il indépendant du site et peut il être exporté sans ce contexte ? Par exemple un article de blog ou une fiche produit. Dans ce cas là, la balise article est toute indiquée
le contenu mérite au moins un titre et regroupe des informations sur la même thématique ? La balise section est faite pour ça et vous permet de marquer par exemple des onglets, des modules de news, une zone de commentaires …
aside, footer et header peuvent être utilisées pour marquer des zones particulières dans les sections que nous venons de voir : un groupe de titres pour header, des métadonnées (copyright, auteur, référence…) pour le footer et des informations complémentaires pour aside (autres articles, produits similaires...)
La div reste d'actualité pour tous les besoins non couverts
Citons également:
la balise nav qui marque les liens de navigation de la page (et non d'une section, footer étant plus indiqué pour cela),
time qui permet de marquer de manière formelle une date (exemple PHP : <time datetime="<?= date( DATE_W3C); ?>">Maintenant !</time>).
figure et figcaption pour les illustrations et leur description (regardez le code source de cet article)
On le voit, ces nouvelles balises peuvent être mises à profit principalement pour les sites à contenu éditorial (journaux, réseaux sociaux…) voire les sites de e-commerce. Le problème que vous rencontrerez sera que dans les anciennes version d’Internet Explorer vous ne pourrez pas appliquer de style à ces éléments (mettre un display:block sur les balises sectionnantes par exemple). Pour cela il suffit d’un court fix Javascript que vous pourrez trouver sur le net en tapant HTML5 shiv.
microdata
Microdata, présenté plus en détails ailleurs dans ce numéro (NDR : le numéro en question étant payant, je vous propose d’aller directement sur le site édité par Google), se propose de remplacer RDFa et microformat. Si vous ne connaissez pas ces projets, il s’agit simplement de marquer sa page d’une manière beaucoup plus précise et libre que ce que la spécification HTML5 peut prévoir. Si par exemple votre site liste des événements, des recettes de cuisine, des personnes ou des avis vous allez pouvoir indiquer très précisément dans votre page où se trouvent les informations intéressantes. Concrètement vous pouvez définir vos propres vocabulaires ou vous rendre sur http://schema.org (maintenu par Google, Bing et Yahoo!) et choisir le vocabulaire adapté à ce que vous voulez décrire. Puis à l’aide de 3 attributs (itemscope, itemtype et itemprop), vous marquez les éléments importants. Par exemple nous allons marquer précisément une page présentant un profil. On commence par marquer la zone avec itemscope :
<div itemscope>../..
</div>
On déclare ensuite le vocabulaire auquel on va se référer grâce à itemtype et une URL. Ici on va prendre le format hCard, probablement le plus répandu des formats. Notez que l’url pointe sur le site microformats : microformat et microdata sont compatibles car définir un vocabulaire ne consiste jamais qu’à lister des clés et leurs valeurs possibles.
Enfin avec itemprop vous marquez chaque information de votre markup pour indiquer où se trouve la valeur de chaque partie du vocabulaire.
Un programme tel que ceux de Google ou certains plugins navigateur vont lire le markup et associer le nom avec le mail.
ARIA
ARIA est une spécification axée sur l’accessibilité et permet de proposer des interfaces riches qui restent accessibles aux utilisateurs de technologie d’assistance. A son niveau le plus basique vous pouvez au moins indiquer les zones principales grâce à l’attribut role: les liens de navigations avec role="navigation", le contenu principal avec role="main", les mentions légales avec role="contentinfo", le titre ou le logo avec role="banner"…
A un niveau un peu plus évolué, vous pouvez marquer des interactions plus complexes et néanmoins répandues comme des barres de progression (role="progressbar"), des curseurs (role="scrollbar", role="slider"), des menus, des boîtes de dialogue (role="dialog"). C’est très utile aux technologies d’assistance pour comprendre des zones de l’écran qui sont plus dynamiques que jamais : imaginez que vous ayez un chat en ligne en Web, comme dans l’exemple suivant.
Sans indication particulière, un lecteur d’écran va lire une seule fois ce code, alors qu’il y a sûrement une routine JavaScript qui met à jour régulièrement cette zone. Avec ARIA, il suffit de rajouter le rôle correspondant (d’après la spécification, c’est log) à cette fonctionnalité classique, et les lecteurs se mettront à lire automatiquement tout dernier élément ajouté au DOM
La bonne nouvelle c’est que certaines librairies JavaScript y compris certains plugins jQuery rajoutent automatiquement des attributs ARIA lorsqu’ils vous proposent des widgets un peu compliqués. C’est à vous de faire attention à ce que l’option soit bien proposée pour garantir une meilleure accessibilité de vos interfaces.
Interaction utilisateur
Les nouveaux formulaires
Les formulaires HTML ont été largement dépoussiérés.
Auparavant on avait surtout des champs de type texte ou mot de passe. HTML5 définit une série de nouveaux types qui se rencontrent couramment sur les formulaires : url, mail, search, date, number&helip; Quel est l’intérêt ? Il offre aux navigateurs et aux technologies d’assistance des points d’attache pour améliorer l’expérience utilisateur : changement de clavier virtuel sur les mobiles pour faciliter la saisie, apparition d’interfaces spécialisées pour sélectionner facilement des dates ou des chiffres …
[caption id=”attachment_926” align=”aligncenter” width=”238” caption=”les adaptations des navigateurs aux champs date et tel”][/caption]
La validation des données a été standardisée. Jusqu’ici les développeurs empilaient une bonne couche de Javascript par dessus chaque formulaire. Ici simplement avec du HTML vous pouvez demander au navigateur d’exécuter un certain nombre de règles de validation et d’afficher des indications à l’utilisateur pour remplir sans se tromper son formulaire.
La simplification de certains comportements jusqu’ici scriptés : mettre le caret automatiquement sur certains formulaires avec l’attribut autofocus, mettre un texte de suggestion par défaut dans les champs texte qui apparaît ou disparaît avec placeholder.
Pour le développeur Web coincé entre PHP et JavaScript il y a ici une vraie opportunité : la validation des données doit bien sur rester côté serveur, et il y a maintenant une manière très simple de réutiliser le même code entre le client et le serveur. Prenons une classe de validation en PHP simpliste que l’on voudrait utiliser, comme ci-après.