modal se čte „modl“, modální okno se čte českyTakéModal dialog, Modální dialog, Dialogové okno, Popup okno, LightboxPokročilý

Definice

Modální okno je vrstva rozhraní, která překryje stránku nebo aplikaci a dočasně zablokuje interakci se vším pod sebou, dokud uživatel neprovede volbu nebo okno nezavře. Používá se pro potvrzení nevratné akce, přihlášení, krátký formulář nebo detail položky. Ovládání klávesnicí, fokus a klávesa Escape jsou u něj povinné, ne volitelné.

Kategorie: UX/UI designAktualizováno

Nezaměňujte: V uživatelských rozhraních jde o blokující dialog, zatímco v logice a lingvistice označuje slovo „modální“ vyjádření možnosti či nutnosti; obojí spolu nesouvisí.

Co dělá okno modálním

Modální okno se od běžného panelu liší jedinou vlastností: modalitou. Obsah pod oknem přestává být dostupný, nedá se na něj kliknout ani se na něj nedostane fokus tabulátorem, a čtečka obrazovky by ho neměla předčítat. Vizuální ztmavení pozadí (overlay) je jen následek, nikoli podstata. Nemodální panel naproti tomu zůstává otevřený vedle práce uživatele a nic neblokuje: typicky postranní panel s filtry nebo chatové okno.

Fokus jako jádro celé implementace

Po otevření musí fokus přejít do okna, obvykle na první ovládací prvek nebo na samotný kontejner dialogu. Uvnitř se fokus cyklí (focus trap): z posledního prvku vede Tab na první, ne do stránky pod oknem. Po zavření se fokus vrací na prvek, který okno otevřel, aby uživatel klávesnice neztratil místo. Klávesa Escape zavírá okno vždy, s výjimkou situace, kdy by tím uživatel přišel o rozepsaná data bez varování.

Nativní prvek <dialog> s metodou showModal() tohle řeší za vás: přidá prvek do takzvané top layer, vykreslí pseudoelement ::backdrop, znepřístupní zbytek dokumentu a naváže Escape. Vlastní implementace přes div musí totéž doplnit ručně pomocí atributů role="dialog", aria-modal="true" a popisku přes aria-labelledby.

Kdy modální okno rozhraní zhorší

Modalita je z definice přerušení. Vyplatí se, když je rozhodnutí krátké a souvisí s tím, co uživatel právě dělá: potvrzení smazání, výběr varianty produktu, zadání hesla. Škodí, když do okna nacpete dlouhý formulář, průvodce o pěti krocích nebo obsah, který si uživatel potřebuje porovnat s tím, co je pod ním. Na mobilu je modál navíc téměř celá obrazovka, takže vlastně nahrazuje stránku, ale bez vlastní URL a bez funkčního tlačítka Zpět.

Samostatná kapitola jsou vynucené interstitialy hned po načtení stránky, tedy nabídky newsletteru a slevových kódů. Ty přerušují uživatele dřív, než stihl zjistit, kde je, a Google je na mobilu explicitně uvádí jako vzorec, který může poškodit hodnocení stránky. Souhlasové lišty vyžadované právem jsou z tohoto pohledu výjimkou.

Detaily, které se v praxi zapomínají

  • Zamknout scroll pozadí, jinak se stránka pod otevřeným oknem posouvá při kolečku myši.
  • Nezavírat okno kliknutím do overlaye, pokud je uvnitř rozepsaný formulář: kliknutí vedle je snadný omyl.
  • Nevnořovat modál do modálu. Druhá vrstva rozbije návrat fokusu a uživatel ztratí přehled o tom, kterou volbu vlastně potvrzuje.
  • Popisovat tlačítka slovesem akce („Smazat objednávku“) místo „OK“ a „Zrušit“, kde není jasné, co se právě zruší.
  • Ve Progressive Web App a jednostránkových aplikacích zvážit propojení stavu okna s historií prohlížeče, aby gesto zpět zavřelo okno, ne celou obrazovku.

Příklady z praxe

  1. Potvrzení smazání objednávky v administraci

    Administrátor klikne na koš u objednávky a otevře se modální okno s otázkou a dvěma tlačítky. Nativní prvek dialog zajistí ztmavené pozadí, návrat fokusu na tlačítko koše a zavření klávesou Escape. Tlačítka pojmenovaná slovesem snižují riziko, že někdo potvrdí něco jiného, než čekal.

    <dialog id="confirmDelete" aria-labelledby="del-title">
      <h2 id="del-title">Smazat objednávku 2024-1187?</h2>
      <p>Akce je nevratná, doklady zůstanou v archivu.</p>
      <form method="dialog">
        <button value="cancel">Ponechat</button>
        <button value="delete">Smazat objednávku</button>
      </form>
    </dialog>
    
    <script>
      const dlg = document.getElementById('confirmDelete');
      document.querySelector('#trash').addEventListener('click', () => dlg.showModal());
      dlg.addEventListener('close', () => {
        if (dlg.returnValue === 'delete') deleteOrder('2024-1187');
      });
    <\/script>
  2. Rychlý náhled produktu v e-shopu

    Modální okno s detailem produktu nechá zákazníka vybrat velikost bez opuštění výpisu kategorie, takže se po přidání do košíku vrátí přesně na místo, kde skončil. Problém nastane ve chvíli, kdy okno nemá vlastní adresu: zákazník pošle odkaz kamarádovi a ten uvidí jen kategorii. Řešením je při otevření přepsat URL přes History API a při zavření ji vrátit zpět.

    function openQuickView(slug) {
      history.pushState({ quickView: slug }, '', `/produkt/${slug}`);
      dialog.showModal();
    }
    
    window.addEventListener('popstate', () => {
      if (dialog.open) dialog.close();
    });

Časté omyly

MýtusStačí ztmavit pozadí a vycentrovat div, modál je hotový.
Ve skutečnostiZtmavené pozadí řeší jen vzhled. Bez přesunu a uvěznění fokusu, návratu fokusu po zavření, obsluhy Escape a atributu aria-modal je okno pro uživatele klávesnice a čteček obrazovky nepoužitelné, protože se z něj dá vytabovat do neaktivního obsahu pod ním.
MýtusModální okno a popup je totéž.
Ve skutečnostiPopup v prohlížeči je samostatné okno otevřené funkcí window.open a blokovače reklam ho běžně potlačí. Modální okno je součást téhož dokumentu, prohlížeč ho neblokuje a na rozdíl od popupu blokuje interakci se stránkou pod sebou.
MýtusModální okno vždy zhorší konverze, protože otravuje.
Ve skutečnostiZhorší je vynucený interstitial hned po vstupu na stránku. Modál vyvolaný akcí uživatele, typicky potvrzení objednávky nebo výběr varianty, konverzi naopak často zvyšuje, protože drží pozornost u jednoho rozhodnutí.

Časté dotazy

Kdy použít nativní prvek dialog a kdy vlastní komponentu?
Nativní prvek dialog s metodou showModal je dnes výchozí volba: prohlížeč sám zajistí vrstvu nad zbytkem stránky, backdrop, znepřístupnění obsahu pod oknem a zavírání klávesou Escape. Vlastní komponenta dává smysl, když potřebujete netriviální animaci vstupu a odchodu, vlastní správu vrstev u více současných panelů nebo integraci se stavovou knihovnou, která vykresluje obsah přes portál. V takovém případě počítejte s tím, že fokus, atributy ARIA i zamknutí scrollu musíte dodělat ručně a otestovat pouze klávesnicí.
Jak modální okno ovlivňuje SEO?
Obsah modálního okna, který je v HTML přítomen od začátku, vyhledávač zpravidla načte, ale skrytý obsah za interakcí má obvykle menší váhu než text viditelný na první pohled. Zásadnější je jiná věc: rušivé interstitialy, které na mobilu překryjí hlavní obsah hned po příchodu z vyhledávání, Google uvádí jako vzorec poškozující hodnocení stránky. Právně vyžadovaná oznámení, jako je souhlas s cookies nebo ověření věku, mezi problematické případy nepatří.
Má se modální okno zavírat kliknutím mimo něj?
Zavírání kliknutím do překryvné vrstvy je vhodné u nedestruktivních oken, kde uživatel nic nerozepsal: náhled obrázku, detail produktu, nápověda. U formulářů a potvrzení nevratných akcí je lepší tuto zkratku vypnout nebo se zeptat, protože kliknutí vedle okna je velmi častý omyl a ztráta vyplněných dat působí jako chyba aplikace. Klávesa Escape by naopak měla fungovat téměř vždy, případně s dotazem na zahození rozepsaného obsahu.
Jak se modální okno testuje?
Testování modálního okna začíná odloženou myší. Otevřete okno klávesnicí, ověřte, že fokus skočil dovnitř, projděte tabulátorem celý obsah a zkontrolujte, že se fokus cyklí a neuteče na odkazy pod oknem. Po zavření musí fokus přistát na spouštěcím prvku. Následuje čtečka obrazovky, kde se ověří, že se přečte název dialogu a že obsah pod ním není dostupný. Automatizovaně se hlídá zamčený scroll pozadí, funkce klávesy Escape a chování tlačítka Zpět v prohlížeči.

Zdroje

  1. The dialog element(otevře se v novém okně)WHATWG HTML Standard
  2. <dialog>: The Dialog element(otevře se v novém okně)MDN Web Docs
  3. ARIA Authoring Practices Guide: Dialog (Modal) Pattern(otevře se v novém okně)W3C Web Accessibility Initiative
  4. Web Content Accessibility Guidelines (WCAG) 2.2(otevře se v novém okně)W3C, 2023
  5. History API(otevře se v novém okně)MDN Web Docs

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.