Prvek skrytý pomocí HTML5

HTML5 má jednu „skrytou“ vlastnost, o které se moc nemluví. Částečně proto, že pro nováčky je trochu matoucí a pro zkušení kodéry víceméně zbytečná. Mluvím o vlastnosti (atributu) hidden („skrytý„), který můžete nastavit na libovolný prvek a ten se pak bude chovat stejně jako s display:none.

V čem spočívá její smysl (a dalo by se říct i nesmysl)?

Smysl skrytého atributu

HTML definuje atribut hidden jako možnost skrytí prvku, který „není aktuálně relevantní, ale může být zobrazen později.“ Stručně a obecně řečeno, můžete hidden použít stejně jako display: none s tou výhodou, že napsat v HTML hidden je kratší než style="display:none" a v případě CSS nemusíte čekat a spoléhat na načtení CSS souboru.

Skrytý prvek můžete zobrazit pomocí Javaskriptu (nebo CSS, pokud víte jak) stejně, jako byste to udělali s display:none; např. zobrazit informaci o tom, že je uživatel přihlášen:

var el = document.getElementById("myProfileInfo")

//Nastavení vlastnosti
el.hidden = false;

//alternativní zápis přes atribut
el.removeAttribute("hidden");

Stejně tak můžete skrýt prvek, který již není nadále relevantní; například přihlašovací dialog:

var el = document.getElementById("loginButton")

//Nastavení vlastnosti
el.hidden = true;

//alternativní zápis
el.setAttribute("hidden", 1);

Pozor na to, že stejně jako třeba disabled, je i hidden booleová vlastnost, takže při jejím nastavení přes setAttribute() je potřeba zadat jedničku jako hodnotu. Vlastně jakákoliv hodnota znamená, že prvek bude skrytý – včetně hodnoty hidden=0!!!

Poznámka: zde narážíme na to, že vlastnosti jako hidden a disabled jsou v prohlížečích speciální konstrukty, které fungují jak jako vlastnost DOM prvku (el.hidden) tak i jako HTML atribut (<el hidden>), kdy prohlížeč automaticky synchronizuje jejich hodnotu – tedy nastavení vlastnosti el.hidden vytvoří nebo zruší atribut a naopak přidání/odebrání atributu nastaví vlastnosti el.hidden=true/false.

Nesmysl skrytého atributu

Jak jsem již psal výše, vlastnost hidden se chová dost nepochopitelně. Jde o to, že její funkce je stejná jako display:none, ale její priorita je nižší.

To má na jednu stranu výhodu v tom, že když prvek skryjete pomocí atributu hidden, můžete ho zobrazit pomocí existujících javaskriptů nebo CSS, které prvku nastavují styl display:

<label for=adresa">Chci zadat adresu</label>
<input type=checkbox name=adresa>
<figure id=adresa hidden>...</figure>
<style>
    input[name=adresa]:checked + #adresa { 
        display: block; 
    }
</style

Na druhou stranu atribut hidden přestává pracovat v případě, že byste jím chtěli skrýt prvek, který má nějakou speciální vlastnost display; v případě moderních webů se můžete bavit o hodnotách flexbox nebo grid, ale klidně může jít i o obrázek, který chcete zobrazit inline jako ikonu.

<style>
    #sidebar { display: grid; }
</style>

<section id=sidebar hidden>...</section>

V tomto případě vás čeká nemilé překvapení, protože sidebar bude od začátku vidět. Proč? Protože i když jste „později“ nadefinovali, že prvek je skrytý, tak vlastnost display má vyšší prioritu a tudíž se zobrazí coby grid.

Použití skrytého atributu

U atributu hidden, stejně jako u display: none, je důležité uvědomit si, že skrytý prvek je stále dostupný v DOMu a každý trochu zkušenější „hacker“ se k němu dostane. Nejde jím tedy skrýt věci, které nechcete, aby uživatel použil (např. byl by nesmysl skrýt text nebo video, za které musí uživatel nejprve zaplatit, aby se k němu dostal).

Použít se dá tedy na prvky, které nemají smysl v grafické nebo jiné podobě, ale uživatel je může nějakou normální cestou zobrazit (a tudíž ani nevadí, že se k nim dá dostat i nenormální cestou.

Skrytí a zobrazení částí formuláře

Jak už jsem uvedl výše, atribut hidden je skvělý pro skrytí částí formulářů, které se zobrazí až za určité podmínky – např. uživatel vyplní některé jiný prvek (např. zobrazení pole IČO po zaškrtnutí „Nakupuji na firmu“) nebo naopak něco vyplní (teď mluvím o zobrazení chybových hlášek).

Skrytí detailů

Atribut hidden je také skvělý při použití prvků jako je DT-DD u kterých chcete, aby se popis (DD) zobrazil až po kliku na výraz (např. ve stylu harmoniky).

ARIA a skrytá pomoc

Jedna skrytá vlastnost skryté vlastnosti je v tom, že i když je skrytá, může fungovat jako skrytý popis prvku (ještě mě stíháte sledovat?).

Abych to objasnil, libovolný prvek může svojí vlastností aria-labeledby (nebo aria-describedby, které má stejné chování) odkazovat na prvek, který je skrytý (ať už pomocí hidden, display:none nebo visibility:hidden) a asistenční služby obsah tohoto prvku dočasně „zobrazí“ (např. přečtou přes TTS), pokud si uživatel vyžádá bližší popis (resp. labeledby se obvykle přečte při focusu prvku).

<label for=hodnocení>
    Jak jste spokojeni s naší službou? 
    <span aria-hidden="true">Nespokojen</span>
    <input name=hodnocení 
        type=range min=1 max=10
        aria-labeledby=jmenoHodnoceni
        aria-describedBy=popisHodnoceni
    >
    <span aria-hidden="true">Spokojen</span>
</label>
<p hidden id=jmenoHodnocení>
    Hodnocení v rozsahu 1 pro zcela nespokojen
    do 10 pro plně spokojen.</p>
<p hidden id=popisHodnocení>
    V závislosti na vašich možnostech
    a možnostech vašeho prohlížeče
    použijte klávesnici pro posun
    jezdce nebo přímo zadejte hodnotu
    v rozsahu 1 až 10.</p>

Podpora v prohlížečích

Vlastnost hidden byla přidána v HTML5, ale překvapivě ji podporuje i Internet Explorer 11. U ostatních prohlížečů je podpora obdobná (Chrome 6+, Firefox 4+, Opera 11+, Safari/iOS 5+, Android 4+).

Dá se tedy říci, že v dnešní době (2020+) již není potřeba (ne)podporu vlastnosti řešit a lze ji bez problémů používat všude.

Kdyby přeci jenom, stačí do CSS přidat tento polyfill:

[hidden] { display: none; }

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..