Ces deux simples retouches nous ont permis de prendre en compte tous les rôles de repères qu'il semble utile d'exploiter d'exploiter dans le site Retreats 4 Geeks. Au passage, nous avons avons amélioré l'accessibilité l 'accessibilité globale globale de la page en permettant aisément aux utilisateurs des technologies d'assistance de naviguer dans le document.

INDISPENSABLES INDICES ? La spécification ARIA ARI A fournit aux utilisateurs les moyens moyens de naviguer dans les documents, mais elle propose d'autres d 'autres fonctions fonctions utiles, et notamment une collection colle ction de rôles et d'états d' états de widgets. Un rôle de widget (un widget (un composant d'interface) correspond à la description du rôle d'un élément. Ces rôles sont en général classés en deux catégories : ceux qui s'intéressent à la structure et les autres. En d'autres termes, il y a ceux des conteneurs et ceux des contenus que sont les composants. Les Le s conteneurs sont les éléments qui hébergent les composants d'un widget de l'interface. Prenons comme exemple l'interface à onglets de la Figure 5.1. Une interface à onglets se fonde sur deux parties : une liste d'onglets et une collection de panneaux correspondant à ces onglets. Il en résulte trois rôles distincts en ARIA AR IA : les onglets qui portent le rôle de "tab", la liste d'o d 'onglets nglets qui porte le rôle de "tablist", et le panneau correspondant à chaque onglet qui porte le rôle de "tabpanel". Les deux rôles "tab" et "tabpanel" sont des rôles de composants alors que "tablist" est un rôle de conteneur (la liste qui contient les onglets).

CHAPITRE CHAPI TRE 5

AMÉLIORATION AMÉLIORA TION PROGRESSIVE ET ACCESSIBILITÉ

Figure 5.1 : Exemple d'interface d 'interface à onglets. onglets.

La spécification ARIA ARI A définit toute une série de rôles de widgets. Cela vous permet de construire des contrôles complexes de formulaires (par exemple, des curseurs de réglage et des sélecteurs numériques rotatifs) ou bien des menus arborescents, des boîtes de dialogue modales ou même des interfaces glisser-déposer, et tout cela en garantissant l'accessibilité. Au niveau des rôles de structures, ARIA AR IA permet de redéfinir un éléme élément nt HTML n'ayant ayant aucun sens pour qu'il en prenne un en termes fonctionnels.
n"> Je ne suis pas un vrai bouton, mais je fais comme si sur le web


Tout cela est très prometteur, mais pour qu'un widget fonctionne, il faut du code JavaScript. Habituellement, c'est un contexte auquel l'accessibilité n'a pas accès. La principale raison pour laquelle les techniques du type Ajax ne s'entendent pas très bien avec l'accessibilité est liée au fait que le langage HTML ne propose aucun mécanisme permettant au code JavaScript d'informer l'utilisateur (ou la technique d'assistance qu'il a choisie) en temps réel, hormis les deux techniques très élémentaires et intrusives que sont alert() et confirm() (on pourrait les comparer à des perturbateurs qui crient du fond de la classe).

101

 

102

ADAPTIVE WEB DESIGN

Dans ARIA, la gestion du contexte est confiée à des "états". Un état ARIA correspond à un groupe d'attributs pouvant être appliqués à quasiment tous les éléments. Certain Cer tainss états sont globaux (ils s'appliquent appliquent à tous les éléments), éléments), alors que d'autres sont spécifiques au contexte de certains widgets. Tous ces états portent un nom commençant par "aria-". Ils transmettent des informations utiles au visiteur concernant ce qui a changé pour un u n élément désigné. Saviez-vous que vous connaissiez déjà l'un des ces états : aria-hidden ? Cet attribut aria-hidden  a été vu en début de chapitre. Il accepte une valeur booléennee ("true" ou "false") et indique à l'a booléenn l 'agent gent du poste poste client ou la technotechnologie d'assistance s'il faut ou non faire connaître à l'utilisateur le contenu concerné. Parmi les autres états ARIA prédéfinis, nous pouvons citer ariadisabled, aria-expanded, aria-invalid, aria-pressed et aria-selected. Si nous revenons à l'interface à onglets de la Figure 5.1, nous pouvons tirer profit de l'état aria-hidden  pour contrôler l'état des panneaux et de l'état aria-selected pour gérer l'état l' état des onglets. onglets. Mais la spécification ARIA va plus loin encore. Elle définit des attributs d'états, d' états, mais également éga lement un certain nombre de de propriétés pouvant pouvant être associées à un élément. Citons notamment aria-label, aria-labelledby, aria-readonly et aria-required . La lecture de cette liste vous permet de deviner que la plupart de ces propriétés sont destinées aux composants des formulaires, bien que certaines (par exemple aria-controls) puissent s'appliquer à notre interface à onglets. Vous vous doutez sans doute qu' aria-controls  a besoin d'une référence id comme paramètre. Cet identifiant doit correspondre à l'élément dont le contenu ou la présence est contrôlé par un autre élément auquel l'attribut est appliqué. app liqué. Dans notre interface à onglets, c'est l'ong l 'onglet let qui contrôle le panneau associé (comme le montre la Figure 5.2). Une fois que cette relation entre onglets et panneau est établie, nous pouvons établir une autre relation, en exploitant aria-labelledby . Le fonctionnement est exactement le même que pour aria-controls.

CHAPITRE CHAPI TRE 5

AMÉLIORATION AMÉLIORA TION PROGRESSIVE ET ACCESSIBILITÉ

role="tab" id="recipe-0-tab" aria-controls="recipe-0"

role="tabpanel" id="recipe-0" aria-labelledby="recipe-0-tab"

Figure 5.2 : Grâce aux propriétés ARIA, AR IA, nous pouvons mettre en relation les

différents composants différents composants de d e l'interface. l 'interface. Les états et les propriétés ARIA aident beaucoup à maintenir l'utilisateur informé. Voyons un autre concept ARIA qui est simple et dont l'intérêt pratique est évident : les régions actives (Liv (Livee Regions Region s).

MAIS C'EST VIVANT ! L'apparition du mécanisme Ajax et de la recrudescence du JavaScript ont eu pour résultat qu'une des choses les plus désagréables dans l'expérience utilisateur est devenue la mise à jour en temps réel de certaines régions d'une page. Cela entraîne de nombreux problèmes d'usage, les deux principaux étant les suivants suivants : 1) les technologies d'a d 'assistance ssistance n'étaient n'étaient pas informées des changements et n'avaient aucun moyen d'informer l'utilisateur à leur tour ; et 2) un utilisateur qui effectue un zoom ou qui défile sur un appareil à petit écran n'est pas informé des mises à jour du contenu qui se produisent en dehors de la zone affichée. La spécification ARIA propose un attribut qui résout directement ce problème : aria-live.

103

 

104

ADAPTIVE WEB DESIGN

Le plus étonnant dans aria-live  est sa simplicité. Il suffit d'appliquer cet attribut à un élément pour contrôler quand et comment sa mise à jour est communiquée à l'utilisateur. L'attribut aria-live  accepte l'une des trois valeurs suivantes : 1. "off " lorsque les mises à jour sont fréquentes et de peu d'importance, comme dans dan s le cas d'un flux flu x dynamique dynam ique de votre compte Twitter Twitter (n'est-ce est-ce pas ?) ; 2. "polite " pour les mises à jour assez importantes pour en informer l'utilisateur lorsqu lorsqu'il 'il ne fait rien d'autre, d 'autre, ce qui peut être le cas des grands titres d'un magazine web lorsqu'ils sont mis à jour ; 3. "assertive" pour les mises à jour suffisamment importantes pour devoir être immédiatement imméd iatement annoncées, ce qui est le cas des messages de validation de formulaire. Dans notre site Retreats 4 Geeks, nous pouvons valablement appliquer l'attribut aria-live au formulaire de contact :
aria-live="assertive">

Cette simple retouche permet de garantir que l'utilisateur sera informé de toute erreur pendant le remplissage remplissage du formulaire et d 'avoir la confirmation que le formulaire a bien été transmis.

ADOPTION ET MANQUE MANQUESS Depuis son lancement, ARIA a fait l'objet d'un bon accueil de la communauté web. Au jour où nous écrivons ceci, tous les grands navigateurs ont incorporé une certaine dose de support ARIA, de même pour les outils de lecture d'écran répandus tels que JAWS, Windows Eyes, NVDA et Orca. De grandes entreprises comme IBM, IBM , Sun Microsystems, Adobe, Yahoo! Yahoo! et Google travaillent d'arrache-pied à augmenter l'efficacité et l'exhaustivité d'ARIA. La communauté JavaScript a aussi adopté ARIA, ARI A, les deux outils outi ls Dojo Dijits5 et jQuery UI6 ayant incorporé les rôles, états et propriétés ARIA dans leurs composants. La spécification est encore en cours de développement et aucune mise en place n'est encore complète, mais les progrès sont permanents. 5. 6.

http://dojotoolkit.org/widgets http://jqueryui.com/

CHAPITRE CHAPI TRE 5

AMÉLIORATION AMÉLIORA TION PROGRESSIVE ET ACCESSIBILITÉ

Ce serait péché de ma part de ne pas mentionner le principal problème qui empêchee ARIA empêch AR IA de se fondre harmonieusement harmonieusement dans notre approch approchee d'a d 'amémélioration progressive, tout du moins au niveau des rôles et des états des widgets. widg ets. En effet, nous ne disposons d' d 'aucun moyen moyen de tester la disponibilité du support support ARIA ARI A dans le navigateur ou dans la technologie technologie d' d 'a ssistance. Nous Nous ne pouvons pouvons donc pas bien décider comment exploiter au mieux chaque widget. Derek Featherstone avait soulevé ce problème dans son excellent article pour le site A List Apart sous le titre "ARIA and Progressive Enhancement7". J'J 'en conseille la lecture à tous ceux qui veulent mieux comprendre ce problème. Pour le moment, aucune solution n'a encore été trouvée, mais croisons les doigts.

LES RACCOURCIS CLAVIER, C'EST BIEN Le dernier dern ier sujet sujet que je veux aborder avant avant de clore ce chapitre est l'l 'accessibilité au moyen du clavier. L'utilisation systématique de la souris et la multiplication des appareils tactiles tels que les tablettes font qu'il est assez facile d'oublier notre bon vieux clavier, ce qui serait une grav g ravee erreur. Le clavier reste un outil extrêmement pratique, et il constitue l'interface de prédilection de la plupart des utilisateurs non-voyants tout autant que des utilisateurs chevronnés. Nous avons appris beaucoup en ce qui concerne le clavier au cours des dernières années. Nous avons tout d'abord compris que les touches d'accès constituaient une bonne idée, mais que dans la pratique ce n'était pas si intéressant8. Nous avons également compris qu'une application trop rigoureuse de l'attribut tabindex pouvait plonger les utilisateurs dans une frénésie de sauts d'un élément élément à l'autre l 'autre (et un énervement énervement certain)9. Ce que nous avons surtout découvert, c'est que nous pouvions nous servir du code JavaScript pour modifier dynamiquement la valeur de l'attribut tabindex  pour simplifier le cheminement de l'utilisateur parmi les différents composants d'un widget complexe, comme c'est le cas d'une interface à onglets ou d'un formulaire en accordéon. À quoi correspond cette technique appelée jonglage tabindex ? Au cours de l 'a nnée 2005 20 05 (on n'n'a pas retrouvé l'origine exacte), quelqu' quelqu'un un a découvert qu'en en donnant la valeur "-1 "-1" à l 'a'attribut ttribut tabindex d  d'un 'un élément, élément, cela écartait l'élément l 'élément 7. 8. 9.

http://alistapart.com/articles http://alistapa rt.com/articles/aria-and-progr /aria-and-progressive-enhancem essive-enhancement/ ent/ http://www.wats.ca/show.php?contentid=32 http://webaim.org/techniques/k http://webaim.o rg/techniques/keyboard/tabinde eyboard/tabindex x

105

 

106

ADAPTIVE WEB DESIGN

de la séquence de focalisation par la touche TAB dans le document10. Ce qui est intéressant, c'est que bien que le composant concerné ne fasse plus partie de la séquence de tabulation dans le document, on peut encore le cibler en code JavaScript (avec element.focus()), ce qui ouvre de nouvelles nouvelles possibilités pour contrôler précisément l'expérience de l'utilisateur. Parcourons un scénario typique en revisitant l'interface à onglets présentée un peu plus haut : 1. L'utilisateur arrive dans l'interface l'i nterface à onglets et et actionne la touche touche TAB de son clavier, ce qui focalise sur le premier onglet (qui est associé au panneau actuellement affiché) a ffiché).. 2. S' S'ilil actionne actionne à nou nouveau veau la touche touche TAB ou le bouton du clavier tactile, le focus passe à l'élément de contenu ciblable suivant en quittant la section des onglets. Cela ne l'emmène pas à l'onglet suivant dans la liste. 3. S' S'ilil maintient la touch touchee MAJ tout en actionnant la touche TAB, il revient dans la liste des onglets et réactive l'onglet courant. 4. Il peut utiliser utiliser les flèches flèches du curseur curseur pour circuler circuler parmi les différents différents onglets de la liste, en affichant à chaque fois le panneau correspondant. 5. S' S'ilil actionne la touch touchee ENTRÉE pendant qu'il navigue dans la liste des onglets, il focalise sur le panneau correspondant à l'onglet actif.  Je reco reconnais nnais que que cela cela représ représente ente beau beaucou coupp d'utilisation d'utilisation de la touch touchee TAB (et un défi remarquable). Cependant, en jouant bien avec tabindex et en ajoutant un peu de code JavaScript, vous y arrivez aisément. Voici comment : 1. Vous commencez par affecter la valeur "-"-1" au tabindex  de chacun des onglets et panneaux, ce qui les écarte de la séquence de tabulation de la page. 2. Vous réaffectez ensuite ensu ite la valeur valeur "0" "0" à l'onglet courant pour le rapatrier rapatrier dans la séquence de tabulation à sa position par défaut. 3. En JavaScript, JavaScript, vous pouvez pouvez ensuite régler dynam dynamiquement iquement la propriété propriété tabindex  de chacun des onglets en fonction des commandes frappées au clavier par l'utilisateur, par exemple les touches gauche, droite, haut et bas. Vous permettez ainsi à l'utilisateur de se déplacer facilement dans l'interface. 10.Ce comportement a été particulièrement intéressant parce que, selon la spécification spéci fication du W3C, tabindex ne pouvait accepter une valeur qu'entre 0 et 32 767.

CHAPITRE CHAPI TRE 5

AMÉLIORATION AMÉLIORA TION PROGRESSIVE ET ACCESSIBILITÉ

Voici un extrait de la méthode nommée swap() de TabInterface qui montre comment jongler avec tabindex (v  (vous ous y trouv t rouvez ez également un peu de manipuma nipulation des attributs attributs ARIA ARI A et d'interversio d 'interversionn d'éléments d 'éléments class) : function swap( e ) { // ... // Désactivation du panneau et de l'onglet actifs removeClassName( removeClassN ame( old_tab, 'active' ); old_tab.setAttribute( old_tab.setA ttribute( 'aria-selected', 'false' ); old_tab.setAttribute( old_tab.setA ttribute( 'tabindex', '-1' ); removeClassName( removeClassN ame( old_folder, 'visible' ); old_folder.setAttribute( old_folder.s etAttribute( 'aria-hidden', 'true' ); // Activation du nouveau panneau et onglet addClassName( addClassName ( tab, 'active' ); tab.setAttribute( tab.setAttri bute( 'aria-selected', 'true' ); tab.setAttribute( tab.setAttri bute( 'tabindex', '0' ); addClassName( addClassName ( new_folder, 'visible' ); new_folder.setAttribute( 'aria-hidden', 'false' ); // ... }

Pour voir voir cette technique techn ique en pleine action, allez découvrir TabInterface.js TabInterface.js sur  sur le site Github11.

AGISSEZ… ACCESSIBLE L'a ccessibilité est un sujet complexe. complexe. Un peu de temps est nécessaire nécessa ire pour vous y habituer, mais cela deviendra ensuite une seconde nature. Comme toutes les autres techniques de ce livre, l 'a'accessi ccessibilité bilité devra de préférence préférence être app appliquée liquée en plusieurs niveaux, afin de construire l'interface utilisateur progressivement. Vous pourrez ainsi créer un résultat qui répondra aux attentes de tous vos utilisateurs.

11. http://github.c http://github.com/easy-designs om/easy-designs/TabInterface.j /TabInterface.js s

107

"Quand tu veux construire un bateau, ne commence pas par rassembler du bois, couper des planches et distribuer du travail, mais réveille au sein des hommes le désir de la mer grande et belle."  — ANTOINE DE SAINT-EXUPERY

CHAPITRE 6

À EMPORT EMPORTER ER

Nous avons visité bien des aspects durant cette courte promenade ensemble. Nous avons vu l'amélioration progressive en action, en partant d'un simple document texte pour aboutir à une page web attrayante, fonctionnelle et restant accessible à tous. Le rythme de croisière a été soutenu, mais nous espérons que vous repartez avec une idée plus précise de ce qu'est l'amélioration progressive, progressive, pourquoi cela fonctionne et comment l'i l 'incorporer ncorporer dans vos prochains projets, au niveau conception et développement. Vous avez peut-être déjà mis en pratique certaines techniques. Bien que ce livre soit de pagination réduite et que nous ayons la chance de pouvoir pouv oir faire appe appell à un excellent concepteur concepteur d'index, d 'index, vous pourriez aisément a isément ne plus savoir où a été abordé un concept que vous voudriez revoir. Je fournis fourni s à cet effet dans les pages suivantes un rap rapide ide résumé des principales pri ncipales techniques présentées, avec des conseils d'utilisation. Cette checklist de l'amélioration progressive vous permettra de vérifier que vous tenez compte avec toute la considération requise des aspects essentiels de l'a l 'amélio mélioration ration progressiv progressive. e. À votre tour de mettre tout cela en pratique en concevant des choses superbes !

 

110

ADAPTIVE WEB DESIGN

LA CHECKLIST DE L'AMÉLIORATION PROGRESSIVE Contenu & HTML (Chapitre 2) ❏

UN MANUSCRIT MAN USCRIT/TAPUSCRIT /TAPUSCRIT BIEN RÉDIGÉ ET NE PERDANT PAS SON SENS LORSQU'IL EST LU PAR UN LECTEUR L ECTEUR ÉCRAN AUDIO

Il s'agit du niveau fondamental de l'expérience utilisateur ; il doit faire l'objet de tous vos soins. Nous donnons quelques pistes dans la bibliographie. ❏

CHOISISSEZ VOS ÉLÉMENTS HTML EN FONCTION DE LEUR SIGNIFICATION

Le simple fait de tirer profit de la sémantique standard des éléments (balises) HTML repr représente ésente un grand pas vers une meilleure accessiaccessibilité (et optimise le travail des moteurs de recherche). ❏

EXPLOITEZ LES MICRO-FORMATS POUR PALLIER LES MANQUES DU HTML

Les micro-formats forment des extensions au lexique HTML et sont reconnus par de nombreux navigateurs et plusieurs moteurs de recherche. ❏

SERVEZ-VOUS DES CLASSIFICATIONS POUR REGROUPER DES ÉLÉMENTS QUI SERVEZ-VOUS PARTICIPENT À LA MÊME FONCTION

La classification (au (au moyen de l'attr l 'attribu ibutt class, par exemple) donne du sens aux éléments HTML pour lesquels le standard n'en fournit pas assez et lorsqu'il n'existe pas de micro-format approprié. ❏

IDENTIFIEZ LES ÉLÉMENTS STRUCTURANTS

L'identification (par exemple par l'utilisation de l'attribut id) est une excellente solution pour ajouter du contexte à une région de page ou une instance spécifique d'un d 'un élément élément de classification.

CHAPITRE CHAPI TRE 6

À EMPORTER

CSS (Chapitre 3) ❏

VÉRIFIEZ MINUTIEUSEMENT VOS SÉLECTEURS COMPOSITES

Vous prenez des risques en mélangeant des sélecteurs de niveaux de complexité comp lexité très différents, di fférents, car lorsque le navigateur ne comprend pas un des sélecteurs, il ignore tout le jeu de règles. Cela devient en revanche une bonne astuce si votre but est de masquer tout un jeu de règles pour les anciens navigateurs. ❏

ORGANISEZ VOS RÈGLES CSS EN PENSANT AU MÉCANISME M ÉCANISME DE CASCADE

L'ordre d'apparition est significatif. Une bonne organisation de vos règles de styles vous aidera à concevoir une structure à amélioration progressive, ce qui rendra votre code CSS plus facile à maintenir. ❏

MASQUEZ LES JEUX DE RÈGLES CSS RÉCENTES AUX ANCIENS NAVIGATEURS

Un des plus puissants outils CSS pour masquer sélectivement sélectivement des jeux de règles est le bloc @media. ❏

GÉREZ LES DIVERGENCES D'IE AVEC AVEC DES COMMENTAIRES COMMEN TAIRES CONDITIONNELS

Les anciennes versions d'Internet Explorer sont réputées pour leurs imperfections. Les Commentaires Conditionnels du type