{"id":188,"date":"2024-08-13T15:16:15","date_gmt":"2024-08-13T15:16:15","guid":{"rendered":"https:\/\/www.accessibilita.digital\/?p=188"},"modified":"2024-08-23T12:29:36","modified_gmt":"2024-08-23T12:29:36","slug":"come-creare-popup-e-modali-accessibili","status":"publish","type":"post","link":"https:\/\/www.accessibilita.digital\/come-creare-popup-e-modali-accessibili\/","title":{"rendered":"Come creare popup e modali accessibili"},"content":{"rendered":"<p>Quando navighiamo un sito web ci capita sicuramente di incontrare dei popup, cio\u00e8 <b>delle finestre che appaiono in sovraimpressione<\/b> all\u2019interno di una pagina web, <b>che ci comunicano qualche informazione<\/b>. Un esempio classico \u00e8 il banner di consenso sui cookie, che sia custom o implementato attraverso piattaforme quali Iubenda o Cookiebot.<\/p>\n<p>Un altro esempio molto utilizzato anche dalle Pubbliche Amministrazioni \u00e8 quello di avere <b>una finestra di ricerca nel sito<\/b> che appare quando si clicca l\u2019icona con la lente di ingrandimento.<\/p>\n\n<h2>I modali e le tecnologie assistive<\/h2>\n<p>Anche chiamate \u201cmodali\u201d, queste finestre hanno sicuramente l\u2019utilit\u00e0 di attirare l\u2019attenzione dell\u2019utente. Tuttavia \u00e8 bene comprendere che possono diventare <b>piuttosto fastidiose per l\u2019utente ipovedente<\/b> o che sta visitando il sito tramite <b>tecnologie assistive come gli screen reader<\/b>.<\/p>\n<p>Molto spesso sono poste <b>in cima nella gerarchia HTML<\/b>, rischiando quindi di venire lette come primo contenuto dai software di lettura schermo. In altri casi, <b>non vengono lette del tutto<\/b> perch\u00e9 posizionate <b>in fondo all\u2019HTML<\/b> oppure <b>non vengono annunciate quando appaiono<\/b>. Infine, potrebbero apparire in un momento in cui l\u2019utente \u00e8 concentrato su altro e <b>la sua lettura viene interrotta<\/b> da un contenuto che viene letto improvvisamente.<\/p>\n<p>Dobbiamo quindi capire meglio come rendere questi componenti il pi\u00f9 possibile accessibili.<\/p>\n<p>Le linee guida <b>WAI-ARIA<\/b> offrono alcuni casi d\u2019uso utili per capire come impostare una modale:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.w3.org\/WAI\/ARIA\/apg\/patterns\/dialog-modal\/examples\/dialog\/\" rel=\"nofollow noopener\">Esempio di modale \u201cdialog\u201d<\/a><\/li>\n<li><a href=\"https:\/\/www.w3.org\/WAI\/ARIA\/apg\/patterns\/dialog-modal\/examples\/datepicker-dialog\/\" rel=\"nofollow noopener\">Esempio di modale \u201cdate picker\u201d<\/a><\/li>\n<li><a href=\"https:\/\/www.w3.org\/WAI\/ARIA\/apg\/patterns\/alertdialog\/examples\/alertdialog\/\" rel=\"nofollow noopener\">Esempio di modale \u201calert dialog\u201d<\/a><\/li>\n<\/ul>\n<p>Questi esempi sono gi\u00e0 piuttosto dettagliati, ma proviamo ad analizzare meglio <b>i punti principali<\/b> dal lato tecnico, e vediamo quali sono <b>gli aspetti pi\u00f9 interessanti<\/b> da tenere in considerazione per l\u2019accessibilit\u00e0.<\/p>\n<h2>Esempio pratico: date picker e calendario<\/h2>\n<p>Iniziamo dal <b>date picker<\/b>, che \u00e8 un caso pi\u00f9 particolare ma utile da conoscere:<\/p>\n<ul>\n<li>Abbiamo un <b>&lt;<\/b><b>button&gt;<\/b> che aziona la modale tramite Javascript. Qui non l\u2019hanno inserito, ma potrebbe aver senso aggiungere anche gli attributi <b>aria-expanded<\/b> e <b>aria-controls<\/b> che abbiamo visto in altri casi precedenti. Il \u201cnome accessibile\u201d del button, cio\u00e8 <b>il testo che viene letto<\/b> dalle tecnologie assistive, \u00e8 impostato <b>tramite aria-label<\/b> in \u201cChoose date\u201d, e viene modificato in Javascript quando viene selezionata una data dal calendario<\/li>\n<li>La modale che viene aperta \u00e8 un &lt;div&gt; con <b>role<\/b><b>=\u201ddialog\u201d<\/b> (ancora meglio sarebbe usare il <b>tag HTML &lt;dialog&gt;<\/b>) e usa l\u2019attributo <b>aria-modal=\u201dtrue\u201d<\/b><\/li>\n<li>I pulsanti \u201cEsc\u201d o \u201cInvio\u201d <b>permettono di chiudere<\/b> la modale<\/li>\n<li>Il tag <b>&lt;input&gt;<\/b> della data \u00e8 associato a un testo tramite <b>aria-describedby<\/b>, cos\u00ec che le tecnologie assistive possano leggere questo testo per aiutare l\u2019utente a comprendere lo sc\u00f2po del campo: \u201cdate format: mm\/dd\/yyyy\u201d<\/li>\n<li>La parte iniziale (header) del calendario contiene dei <b>button<\/b> per selezionare mese e anno precedenti e successivi, inoltre contiene un <b>h2 <\/b>con aria-live=\u201dpolite\u201d che <b>comunica alle tecnologie assistive l\u2019eventuale cambiamento del testo<\/b>, ad esempio quando passiamo da \u201cAgosto 2024\u201d a \u201cSettembre 2024\u201d questo verr\u00e0 \u201cannunciato\u201d dagli screen reader e quindi comunicato all\u2019utente<\/li>\n<li>Le celle contenenti i nomi abbreviati dei giorni sono dei tag <a href=\"https:\/\/www.w3schools.com\/tags\/att_th_abbr.asp\" rel=\"nofollow noopener\">&lt;th&gt; che usano l\u2019attributo \u201cabbr\u201d<\/a> per indicare il testo completo, lo stesso risultato si potrebbe ottenere usando all\u2019interno del &lt;th&gt; il <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/abbr#providing_an_expansion\" rel=\"nofollow noopener\">tag &lt;abbr&gt; con l\u2019attributo title<\/a><\/li>\n<li><b>Il focus e l\u2019hover<\/b> dei vari elementi del calendario fanno uso della propriet\u00e0 CSS \u201cborder\u201d per rendere visibile l\u2019effetto e far capire all\u2019utente in modo pi\u00f9 chiaro quale elemento \u00e8 stato selezionato (questo riguarda anche il criterio <a href=\"https:\/\/www.w3.org\/TR\/WCAG22\/#focus-visible\" rel=\"nofollow noopener\">2.4.7 Focus visibile<\/a>)<\/li>\n<li>Da notare anche <b>l\u2019uso del tabindex<\/b> nei tag &lt;td&gt; del calendario: \u00e8 impostato a -1 su tutti i &lt;td&gt; tranne quello selezionato, che prende il valore di 0. <b>Cambiando la data usando le frecce direzionali<\/b>, la cella selezionata passa da un tabindex=\u201d-1\u201d a tabindex=\u201d0\u201d. In effetti, le celle che usano il valore -1 non sono raggiungibili usando il tasto Tabulazione (Tab)<\/li>\n<li>Il testo presente in fondo al calendario fa uso di <b>aria-live<\/b>: <i>&lt;div class=&#8221;dialog-message&#8221; aria-live=&#8221;polite&#8221;&gt;, <\/i>in questo modo, quando il calendario viene aperto, viene letto il testo che informa l\u2019utente della possibilit\u00e0 di <b>cambiare le date usando le frecce direzionali<\/b><\/li>\n<\/ul>\n<h2>L&#8217;uso di aria-live<\/h2>\n<p>Una <b>nota importante<\/b> sull\u2019uso dell\u2019attributo <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-live\" rel=\"nofollow noopener\">aria-live<\/a>: il suo valore pu\u00f2 essere impostato in \u201cpolite\u201d, \u201cassertive\u201d o \u201coff\u201d. Generalmente, si raccomanda di impostarlo su <b>polite<\/b>, e quasi mai su <b>assertive<\/b>. Quest\u2019ultimo valore infatti <b>\u00e8 da utilizzare solo nei casi in cui \u00e8 molto importante interrompere l\u2019azione dell\u2019utente<\/b> per catturare la sua attenzione.<\/p>\n<p>Supponiamo che l\u2019utente stia <b>ascoltando il testo di un paragrafo<\/b> che viene letto dallo screen reader. <b>Una sezione che usa \u201cassertive\u201d viene modificata dinamicamente<\/b> in Javascript (anche senza che l\u2019utente abbia fatto alcunch\u00e9) e <b>questo cambiamento verr\u00e0 immediatamente annunciato<\/b> dal lettore di schermo, che quindi <b>interrompe la lettura<\/b> del paragrafo per leggere il testo modificato. Un esempio pu\u00f2 essere <b>un carosello di immagini<\/b> che ogni 10 secondi cambia slide e presenta un nuovo testo. Parleremo meglio dei caroselli successivamente, ma in un caso di quel genere l\u2019utente potrebbe trovare molto fastidiosa l\u2019interruzione non prevista.<\/p>\n<h2>Esempio pratico: modale dialog classico<\/h2>\n<p>Ora passiamo ai punti pi\u00f9 importanti riguardanti <a href=\"https:\/\/www.w3.org\/WAI\/ARIA\/apg\/patterns\/dialog-modal\/examples\/dialog\/\" rel=\"nofollow noopener\">l\u2019esempio<\/a> di <b>modale \u201c<\/b><b>dialog\u201d<\/b> pi\u00f9 classico, il codice al momento \u00e8 presente su Codepen:<\/p>\n<ul>\n<li>Il <b>focus iniziale<\/b> viene impostato sul primo input<\/li>\n<li>Quando la modale viene chiusa <b>il focus viene riportato sul pulsante di apertura<\/b> della modale (\u201cAdd delivery address\u201d)<\/li>\n<li>Quando clicchiamo su \u201cVerify Address\u201d, <b>il focus viene impostato sul primo paragrafo<\/b>, questo <b>perch\u00e9 il primo \u201celemento focalizzabile\u201d \u00e8 in fondo al testo<\/b> ed \u00e8 un link, l\u2019esempio \u00e8 stato fatto cos\u00ec appositamente per mostrare questo caso particolare<\/li>\n<li>Quando clicchiamo su \u201cAdd\u201d appare una nuova modale \u201cAddress Added\u201d e qui <b>il focus iniziale viene impostato sul pulsante<\/b> \u201cOK\u201d per permettere la chiusura immediata della finestra<\/li>\n<\/ul>\n<p><b>Il codice Javascript usato \u00e8 piuttosto complesso<\/b> e probabilmente poco utilizzabile in un caso reale, se non altro per questioni di tempo di lavoro, che si traduce in maggiori risorse economiche. Il mio suggerimento \u00e8 di <b>fare quello che possiamo<\/b>, in genere non \u00e8 necessario raggiungere la perfezione, che pu\u00f2 richiedere un <a href=\"https:\/\/docs.italia.it\/AgID\/documenti-in-consultazione\/lg-accessibilita-docs\/it\/stabile\/onere-sproporzionato.html\" rel=\"nofollow noopener\">onere sproporzionato<\/a>.<\/p>\n<h2>Esempio pratico: modale alert dialog<\/h2>\n<p>Infine prendiamo in considerazione <a href=\"https:\/\/www.w3.org\/WAI\/ARIA\/apg\/patterns\/alertdialog\/examples\/alertdialog\/\" rel=\"nofollow noopener\">l\u2019esempio<\/a> della modale \u201calert dialog\u201d pi\u00f9 semplice:<\/p>\n<ul>\n<li>Il &lt;div&gt; che contiene la modale usa il <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Roles\/alertdialog_role\" rel=\"nofollow noopener\">role=\u201dalertdialog\u201d<\/a>, inoltre usa <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-modal\" rel=\"nofollow noopener\">aria-modal=\u201dtrue\u201d<\/a> e <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-labelledby\" rel=\"nofollow noopener\">aria-labelledby<\/a> che indica qual \u00e8 il <b>\u201cnome accessibile\u201d<\/b> della modale, cio\u00e8 il testo che viene letto dalle tecnologie assistive<\/li>\n<li>Il <b>focus iniziale<\/b> viene impostato sul pulsante \u201cNo\u201d, che \u00e8 il primo \u201celemento focalizzabile\u201d ed \u00e8 anche <b>l\u2019azione meno distruttiva<\/b>, e <b>previene un possibile errore involontario<\/b> da parte dell\u2019utente. Pensiamo, in un altro caso, a una azione che se attivata per errore elimina il record del database che riguarda un utente (Una azione \u201ccancella utente\u201d con pulsanti \u201cConferma\u201d e \u201cAnnulla\u201d, il focus dovrebbe andare inizialmente su \u201cAnnulla\u201d per evitare una conferma involontaria)<\/li>\n<li>Quando i pulsanti sono <b>disabilitati<\/b>, viene usato solo l\u2019attributo <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-disabled\" rel=\"nofollow noopener\">aria-disabled<\/a> ma non l\u2019attributo <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Attributes\/disabled\" rel=\"nofollow noopener\">disabled<\/a>, questo per mantenere attiva la possibilit\u00e0 di <b>raggiungere i pulsanti tramite tasto Tabulazione<\/b><\/li>\n<\/ul>\n<h2>Conclusioni<\/h2>\n<p>Ci tengo anche a fare un appunto sugli esempi visti finora e che \u00e8 in linea con quanto detto prima sull\u2019onere spoporzionato: per mia esperienza, <b>rendere 100% accessibile ogni componente \u00e8 quasi impossibile<\/b>, ci sono troppi criteri da ricordare e da tenere a mente, e ogni guida riporta delle osservazioni diverse, cos\u00ec come ogni consulente potrebbe interpretare le linee guida in modo diverso.<\/p>\n<p>Ad esempio, sia per esigenze grafiche e sia perch\u00e9 ci \u00e8 molto difficile rendercene conto in fase di sviluppo, pu\u00f2 capitare di dimenticarsi di <b>impostare l\u2019attributo aria-live<\/b> dove necessario, per fare in modo che la tecnologia assistiva comunichi all\u2019utente il cambiamento di un contenuto. Oppure, l\u2019uso di <b>aria-describedby<\/b> in molti casi non \u00e8 richiesto e pu\u00f2 anche essere omesso, risulta utile come \u201cqualcosa in pi\u00f9\u201d per rendere il componente il pi\u00f9 accessibile possibile.<\/p>\n<p>Quello che posso consigliare, in linea generale, \u00e8 di <b>fare quello che si pu\u00f2<\/b> per raggiungere un buon livello di accessibilit\u00e0. Usiamo i <b>tool automatici<\/b>, che abbiamo visto in precedenza, per aiutarci nella scansione e nella correzione degli errori. Se possibile, <b>chiediamo un parere ad altri colleghi<\/b> che si occupano di accessibilit\u00e0, o <b>affidiamoci a partner esterni<\/b> per l\u2019analisi di accessibilit\u00e0.<\/p>\n<p>In fase di analisi e verifica dei requisiti di accessibilit\u00e0, sicuramente <b>non tutto potr\u00e0 venire a galla<\/b>, e cercare l\u2019ago nel pagliaio pu\u00f2 richiedere di investire <b>centinaia di ore di lavoro<\/b> e quindi pu\u00f2 far <b>lievitare il costo economico<\/b>, cosa che le Pubbliche Amministrazioni in particolare non possono permettersi. Dobbiamo quindi conformarci e <b>adattarci al budget disponibile<\/b>, proviamo a lavorare nel modo migliore possibile ma <b>senza ricercare la perfezione<\/b>.<\/p>\n<h2>Link utili<\/h2>\n<ul>\n<li>WAI: <a href=\"https:\/\/www.w3.org\/WAI\/ARIA\/apg\/patterns\/dialog-modal\/examples\/dialog\/\" rel=\"nofollow noopener\">Modal Dialog Example<\/a><\/li>\n<li>WAI: <a href=\"https:\/\/www.w3.org\/WAI\/ARIA\/apg\/patterns\/dialog-modal\/examples\/datepicker-dialog\/\" rel=\"nofollow noopener\">Date Picker Dialog Example<\/a><\/li>\n<li>WAI: <a href=\"https:\/\/www.w3.org\/WAI\/ARIA\/apg\/patterns\/alertdialog\/examples\/alertdialog\/\" rel=\"nofollow noopener\">Alert Dialog Example<\/a><\/li>\n<li>MDN: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-live\" rel=\"nofollow noopener\">aria-live<\/a><\/li>\n<li>W3Schools: <a href=\"https:\/\/www.w3schools.com\/tags\/att_th_abbr.asp\" rel=\"nofollow noopener\">attribute abbr for th<\/a><\/li>\n<li>MDN: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/abbr#providing_an_expansion\" rel=\"nofollow noopener\">abbr tag with expansion<\/a><\/li>\n<li>AGID: <a href=\"https:\/\/docs.italia.it\/AgID\/documenti-in-consultazione\/lg-accessibilita-docs\/it\/stabile\/onere-sproporzionato.html\" rel=\"nofollow noopener\">onere sproporzionato<\/a><\/li>\n<li>MDN: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Roles\/alertdialog_role\" rel=\"nofollow noopener\">alertdialog ARIA role<\/a><\/li>\n<li>MDN: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Element\/dialog\" rel=\"nofollow noopener\">&lt;dialog&gt; HTML tag<\/a><\/li>\n<li>MDN: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-modal\" rel=\"nofollow noopener\">aria-modal<\/a><\/li>\n<li>MDN: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-labelledby\" rel=\"nofollow noopener\">aria-labelledby<\/a><\/li>\n<li>MDN: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/Accessibility\/ARIA\/Attributes\/aria-disabled\" rel=\"nofollow noopener\">aria-disabled<\/a><\/li>\n<li>MDN: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTML\/Attributes\/disabled\" rel=\"nofollow noopener\">disabled attribute<\/a><\/li>\n<\/ul>\n<h2>Leggi anche<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.accessibilita.digital\/come-sviluppare-un-sito-web-accessibile\/\">Come sviluppare un sito web accessibile<\/a><\/li>\n<li><a href=\"https:\/\/www.accessibilita.digital\/come-realizzare-una-navigazione-a-briciole-di-pane-breadcrumbs-accessibile\/\">Come realizzare una navigazione a briciole di pane (breadcrumbs) accessibile<\/a><\/li>\n<li><a href=\"https:\/\/www.accessibilita.digital\/come-realizzare-un-componente-leggi-di-piu-read-more-accessibile\/\">Come realizzare un componente Leggi di pi\u00f9 (read more) accessibile<\/a><\/li>\n<li><a href=\"https:\/\/www.accessibilita.digital\/come-realizzare-un-menu-di-navigazione-con-dropwn-accessibile\/\">Come realizzare un men\u00f9 di navigazione con dropwn accessibile<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Quando navighiamo un sito web ci capita sicuramente di incontrare dei popup, cio\u00e8 delle finestre che appaiono in sovraimpressione all\u2019interno di una pagina web, che ci comunicano qualche informazione. Un esempio classico \u00e8 il banner di consenso sui cookie, che sia custom o implementato attraverso piattaforme quali Iubenda o Cookiebot. Un altro esempio molto utilizzato [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":263,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-188","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/posts\/188"}],"collection":[{"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/comments?post=188"}],"version-history":[{"count":5,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/posts\/188\/revisions"}],"predecessor-version":[{"id":215,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/posts\/188\/revisions\/215"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/media\/263"}],"wp:attachment":[{"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/media?parent=188"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/categories?post=188"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.accessibilita.digital\/wp-json\/wp\/v2\/tags?post=188"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}