aria-modal
Talar om för hjälpmedel att behandla resten av sidan som inaktiv medan en dialog är öppen. Sätt till "true" på role="dialog" eller role="alertdialog". Gör inte bakgrunden faktiskt inaktiv — kombinera med attributet inert eller en fokusfälla.
När ska det användas
På ett role="dialog"- eller role="alertdialog"-element som ska blockera interaktion med resten av sidan medan det är öppet. Sätt aria-modal="true" så att skärmläsaren begränsar sin virtuella markör till dialogen och meddelar att bakgrundsinnehållet inte är nåbart.
En modal dialog har tre ansvarsområden:
aria-modal="true"— talar om för hjälpmedel att detta är modalt.- Bakgrunden inaktiv — tillämpas via attributet
inertpå omgivande innehåll, eller med JavaScript-styrd fokusfälla. Utan detta kan tangentbordsanvändare tabba ut ur dialogen. - Inledande fokus — flyttar fokus in i dialogen när den öppnas, och återställer fokus till utlösaren när den stängs.
aria-modal täcker enbart skärmläsarsidan; det hindrar inte en tangentbordsanvändare från att tabba förbi dialogen. Webbläsarstödet för att härleda inaktivitet från aria-modal är inkonsekvent, så kombinera alltid med andra åtgärder.
Det inbyggda HTML-elementet <dialog> med .showModal() hanterar alla tre automatiskt. Föredra det när det är möjligt.
Hur man håller det synkroniserat
Giltiga värden är "true" och "false". Rendera "true" medan dialogen är öppen; ta antingen bort attributet eller sätt "false" medan den är stängd (vanligtvis är den stängda dialogen inte i DOM alls, så attributet saknar betydelse).
aria-modal kombineras med två etiketteringsattribut:
aria-labelledby="<dialog-title-id>"— pekar på den synliga rubriken.aria-describedby="<dialog-body-id>"— valfritt, för en kort beskrivning.
Tillsammans ger de skärmläsaren ett sammanhängande öppningsmeddelande: “Dialog, Ta bort konto?, Den här åtgärden kan inte ångras.”
Vanliga fel
aria-modal="true"utan någon fokusfälla — tangentbordsanvändare kan tabba in i bakgrunden.- Att använda
aria-modalpå ett icke-modalt popover eller ett verktygstips. Användrole="dialog"enbart för verkliga modala dialoger; ett popover är ingen dialog. - Saknat
aria-labelledby— skärmläsaren meddelar “Dialog” utan namn. - Att inte flytta fokus in i dialogen när den öppnas.
- Att inte återställa fokus till den ursprungliga utlösaren när dialogen stängs.
- Att markera bakgrunden med
aria-hidden="true"i stället förinert— tangentbordsfokus kan fortfarande lämna dialogen; enbart skärmläsarmarkören begränsas. - Två samtidigt öppna modaler med
aria-modal="true". Tillgänglighetsträdet förvirras; visa en åt gången.
Exempel
<div
role="dialog"
aria-modal="true"
aria-labelledby="confirm-title"
aria-describedby="confirm-body"
>
<h2 id="confirm-title">Delete account?</h2>
<p id="confirm-body">This action cannot be undone.</p>
<button type="button" autofocus>Cancel</button>
<button type="button">Delete</button>
</div>