Modaly
Úvod
Ministerstvo spravedlnosti definuje dva druhy upozorňujících zpráv:
- Čistě informativní: značící, že něco se již stalo (a nevyžaduje žádný vstup ze strany uživatele).
- Vyžadující akci: žádá uživatele, aby vybral postup, ve chvíli, kdy nastalo něco kritického/vyžadující rozhodnutí.
Modaly tvoří druhý druh. Jedná se o modální okno1, které omezuje interakci na sebe, dokud není uživatelem vybrána jedna z možností, které modální okno nabízí. Modaly používejte střídmě a pouze tam, kde je okamžitý vstup od uživatele rozhodující pro pokračování v jejich relaci (sessioně).
Doporučený markup
V následujícím příkladu si představte, že se uživatel pokusil přidat položku do “Oblíbené položky”. Vzhledem k tomu, že tato funkce je k dispozici pouze pro přihlášené uživatele, vyžaduje modální okno po uživateli, aby se přihlásil nebo zaregistroval k tomu, aby mohl pokračovat.
<div class="action-dialog" role="dialog" aria-labelledby="action-dialog__label-1" aria-describedby="action-dialog__desc-1">
<h3 id="action-dialog-label__1" class="action-dialog__title">Přidat do oblíbených</h2>
<div id="action-dialog-desc__1" class="action-dialog__content">
<p>Musíte být příhlášeni pro přidání položky do oblíbených.</p>
</div>
<div class="action-dialog__buttons">
<a href="#/path/to/sign-in">Přihlásit se</a>
or
<a href="#/path/to/register">Registrovat</a>
</div>
<button class="action-dialog__close">
<span class="visually-hidden">zavřít</span>
<svg class="icon icon--text" focusable="false" aria-hidden="true">
<use xlink:href="static/images/icons-all.svg#icon-close"></use>
</svg>
</button>
</div>
</body>
Poznámky
role="dialog"
: Tatorole
je rozhodující pro to, aby se okno chovalo tak, jak předpokládáme v asistivních technologiích, jako je odečítačka obrazovky. Zároveň je modal ohlášen jako dialog, když je otevřen a dostává focus (dovnitř sebe).aria-labelledby
aaria-describedby
: Tyto atributy přidružují text nadpisu/labelu dialogu a obsah k samotnému prvku okna. Spolu s rolí dialog jsou tyto informace oznámeny při otevření okna. Budete muset napsat nebo vygenerovat jedinečné identifikátory proid
, které jsou zde vyžadovány.class="action-dialog__buttons"
: Jednoduchý, nesémantický wrapper pro prvky akce. Prvky akce musí být označeny/napsány jako<button>
, pokud podněcují něco na stejné stránce (například změna nastavení nebo stavu) nebo odkazy, pokud uživatele přivedou na novou stránku.class="action-dialog__close"
: Poskytuje tlačítko zavření, pokud se uživatel rozhodne nic nedělat (v tomto příkladě se nerozhodl přihlásit). Třída visually hiddenvh
2 je uvedena pro poskytování přístupného, přeložitelného textu vedle nepřístupné ikonky (pro odečítačky obrazovek). Tlačítko Zavřít je deprioritizováno ve prospěch jmenovaných akcí a jeví se jako poslední ve zdrojovém a v pořadí focusu.</body>
: Okno musí být potomkem<body>
, aby overlay/inert fungoval správně. Podívejte se na Doporučené chování
Doporučený layout
Modaly se mohou zobrazit uprostřed, nebo v dolní části, stránky. V příkladě níže, hodnota fixed
pozice zajišťuje, že nedojde k odscrollování.
.action-dialog {
position: fixed;
top: auto;
left: 0;
right: 0;
bottom: 0;
}
Konfigurace okna do středu stránky vyžaduje transform
. Prvek je tak umístěn do vertikálního středu bez ohledu na jeho přirozenou výšku:
.action-dialog__center {
top: 50%;
bottom: auto;
left: 50%;
transform: translate(-50%, -50%);
}
Na základě toho, okna se delším obsahem by byla v horní a dolní části viewportu skryta. Vyhnete se tomu tak, že popisný prvek okna (class="action-dialog__desc"
) příjmá max-height
a je mu dovolen vertikální scroll:
.action-dialog__desc {
max-height: 30vh;
overflow-y: auto;
}
Ve chvíli, kdy je okno otevřeno, potomci dostávají atribut inert
(více v doporučeném chování níže). Inert obsah by měl vypadat inertní, tedy měla by mu být ubrána viditelnost. Pro dosažení efektu použijte opacity a/nebo filtering.
.action-dialog--open [inert] {
opacity: 0.3;
}
Všimněte si, že styl je aplikován za použití ‘action-dialog’ namespacu. To zajišťuje, že specifický inert styl je použitý pouze ve chvíli otevřeného dialogu (styl se nechtěně nepřenáší na jiné inert
instance).
Mód Vysokého kontrastu
Testujte modální okno v Módu Vysokého kontrastu ve Windows.
Doporučené chování
Výsledek akce provedené prostřednictvím modálního okna bude záviset na účelu vašeho okna a není zde specifikován.
Když se modální okno otevře
- Okno se objeví na určené pozici
- Okolní stránka se stává inertní (neinteraktivní, nedostupná pro asistenční technologie a není zaostřitelná pomocí klávesnice)
- Focus se přesune na první ovládací prvek (odkaz nebo tlačítko, které není deaktivováno) uvnitř prvku
class="action-dialog__buttons"
Když se modální okno zavře
- Okno je skryté
- Okolní stránka přestane být inertní
- Pokud bylo okno původně vyvoláno jako odpověď na akci uživatele, prvek, který akci vyvolal (jako je tlačítko), je znovu zaměřené.
Okna přerušení
Jedná se o okna, které se objevují spontánně, bez přímého vyvolání (vědomého či jiného) ze strany uživatele. Jsou velmi rušivé a prakticky za všech okolností se jim vyhněte. Jedním z legitimních případů použití by byla informace pro uživatele, že se blíží konec jeho časové relace (sessiony), a vy mu dáte možnost sessionu prodloužit nebo zavřít.
Notifikace a status messages, které nevyžadují zásah uživatele, by neměly “krást” focus. Místo toho zvažte použití ARIA live region3.
Klávesnice a odečítačka obrazovek
Focus je po otevření umístěn dovnitř, což znamená, že uživatelé klávesnice mají přístup k funkcím a uživatelé odečítačky obrazovky jsou informováni o přítomnosti modalu. Když se modal poprvé otevře, uživatel odečítačky obrazovky uslyší oznámení o roli dialogu (“dialog”), přidružený label (název) a popis a roli a label původně zaměřeného ovládacího prvku.
Uživatelé mohou přesouvat focus mezi uvedenými ovládacími prvky (odkaz Přihlásit se/Registrovat) a tlačítkem Zavřít.
Související výzkum
Toto téma nemá související uživatelský výzkum.
Pokračovat ve čtení, jinde na webu
-
“Modal window” (Wikipedia), https://en.wikipedia.org/wiki/Modal_window ↩
-
Gist of the
vh
(visually hidden) class, https://gist.github.com/Heydon/c8d46c0dd18ce96b5833b3b564e9f472 ↩ -
“Notifications” (Inclusive Components blog), https://inclusive-components.design/notifications/ ↩