webexpo 2017 - přístupnost v kódu: ukázky a návrhové vzory

58
Ukázky a návrhové vzory P ř ístupnost v kódu: Martin Michálek WebExpo 2017

Upload: martin-michalek

Post on 22-Jan-2018

1.622 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

Ukázky a návrhové

vzory

Přístupnost v kódu:

Martin Michálek WebExpo 2017

Page 2: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

1. Struktura stránky 2. Tlačítka 3. Schovávání obsahu 4. Klávesnice 5. Našeptávač 6. Testování

Page 3: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

1. Struktura stránky 2. Tlačítka 3. Schovávání obsahu 4. Klávesnice 5. Našeptávač 6. Testování

1. Struktura stránky

Page 4: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<h1>

<h2>

<h3>

<h4>

<h5>

<h6>

Tohle pro vás asi nebude nic nového, že?

Page 5: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

Dobrá struktura nadpisů je jeden z důležitých výstupů práce frontendisty. Tady je vidět struktura jednoho z článků na Vzhůru dolů. Hezky to zpracují vyhledávače nebo třeba odečítače obrazovky zrakově postižených. Těm ale takovéhle zpracování stránky nějaký čas zabere.

Page 6: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

Vezměme tři typy uživatelů: běžní (jen po ránu nevyspalí), krátkozrací a nevidomí.

Page 7: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

pomalejší 5×

Nevidomí uživatelé čteček mohou být až pětkrát pomalejší než vy.

Page 8: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

režimy čtečky 4NadpisyŠipkyCtrl+FOrientační body

Čtečky pro nevidomé mají 4 režimy: Procházají nadpisovou strukturu, používají šipky pro rychlé čtení nebo tabulátor pro procházení aktivních častí. Stejně jako my pak používají CTRL+F, když něco nemohou najít. A ten nejrychlejší režim - navigaci po orientačních bodech.

Page 9: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

role="main"

role="banner"

role="navigation" role="search"

role="complementary"

role="contentinfo"

Co jsou orientační body? Když chce uživatel skočit přímo na navigaci, nemusí procházet nadpisovou strukturu a všechno číst. Prostě půjde přímo na navigaci. Díky role="" atributům, které přidáte na důležitá místa stránky.

Page 10: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<div role="main">

<main>×

Používat role atributy nebo HTML5 strukturální elementy?Já dřív HTML5 elementy nedoporučoval, protože čtečky podporovaly role atributy, ale moc ne HTML5 tagy. A kvůli starších Explorerů bylo nutné používat zbytečné Javascripty. https://www.vzhurudolu.cz/prirucka/html5-struktura

Page 11: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

Mezitím se ale situace s IE vyřešila.

Page 12: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<main role="main">

<header role="banner">

<div role="search">

<aside role="complementary">

<footer role="contentinfo">

<nav role="navigation">

Q

D

Používejte prostě obojí. Jsou tu ještě klávesové zkratky čteček pro přechod na konkrétní prkvy. Skok na hlavní obsah nebo navigaci a jedno tlačítko? Bude tenhle uživatel pořád pětkrát pomalejší než vy?

Page 13: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

@media print {

body > *:not(main) { display: none; }

}

Dá se s tím navíc kreativně pracovat v kodérské praxi. Tady třeba pro tisk schovávám všechno, co není hlavní obsah stránky.

Page 14: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

1. Struktura stránky 2. Tlačítka 3. Schovávání obsahu 4. Klávesnice 5. Našeptávač 6. Testování

2. Tlačítka

Page 15: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<button> Tlačítko </button>

Tohle je tlačítko. To víte.

Page 16: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<a href="#" class="btn"> Tlačítko </a>

Tohle znáte a vsadím se, že i někde používáte. Je ale dobrý nápad stylovat odkaz jako tlačítko? Za chvíli uvidíte, že nemusí být.

Page 17: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<span> Tlačítko </span>

Vezměme to ale z jiné strany - představme si, že jsme prasátka a chceme udělat tlačítko ze spanu. Viděli jste to někde? Ve vlastním kódu ale ne, že ne?

Page 18: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<span class="btn"> Tlačítko </span>

Chybí stylování - přidáme třídu.

Page 19: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<span class="btn" role="button"> Tlačítko </span>

Chybí význam pro čtečky - přidáme role.

Page 20: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<span class="btn" role="button" tabindex="0"> Tlačítko </span>

Chybí možnost zaměření a tabnutí - přidáme tabindex.

Page 21: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<span class="btn" tabindex="0" role="button" onclick="…"> Tlačítko </span>

Chybí možnost přechodu jinam - přidáme onclick.

Page 22: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<span class="btn" tabindex="0" role="button" onclick="…" onkeypress="if(event.keyCode==32){…}"> Tlačítko </span>

Chybí aktivace z klávesnice na space - přidáme onkeypress. Teprve teď jsme udělali plnohodnotné tlačítko. I tak <span> pro tyhle účely opravdu nepoužívejte. Prosím!

Page 23: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<span> ✔

<a> ✔ ✔ ✔

<button> ✔ ✔ ✔ ✔ ✔

Vypadá Kliká Zaměření Význam Mezerník

Není to vidět, ale nativní <button> nebo <input type="submit> v sobě mají nečekanou škálu funkcí. U <spanu> chybějí všechny, ale některé z nich nemá ani <a>: chybí role="button" a možnost aktivace mezerníkem.

Page 24: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<a href="#" class="btn" role="button" onkeypress="if(event.keyCode==32){…}"> Tlačítko </a>

Samozřejmě, může se stát, že tlačítko potřebujeme udělat z odkazu. Pak ale ošetřeme význam a přidejme možnost aktivace mezerníkem.

Page 25: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

Umíte HTML?

Page 26: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

Jak třeba ale v HTML zapíšete záložkovou navigaci nebo tooltip? Tak, aby čtečka pochopila význam? Slouží k tomu WAI-ARIA role pro widgety. Další obsah pro atribut role="". Jsou součástí specifikace HTML5 a velmi doporučuji se všechny naučit.

Page 27: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

alert alertdialog button checkbox dialog gridcell link log marquee menuitem menuitemcheckbox menuitemradio option

progressbar radio scrollbar slider spinbutton status tab tabpanel textbox timer tooltip treeitem

→ vrdl.in/ariawidget

Page 28: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

alert alertdialog button checkbox dialog gridcell link log marquee menuitem menuitemcheckbox menuitemradio option

progressbar radio scrollbar slider spinbutton status tab tabpanel textbox timer tooltip treeitem

→ vrdl.in/ariawidget

Page 29: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

alert alertdialog button checkbox dialog gridcell link log marquee menuitem menuitemcheckbox menuitemradio option

progressbar radio scrollbar slider spinbutton status tab tabpanel textbox timer tooltip treeitem

→ vrdl.in/ariawidget

Page 30: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

1. Struktura stránky 2. Tlačítka 3. Schovávání obsahu 4. Klávesnice 5. Našeptávač 6. Testování

3. Schovávání obsahu

Page 31: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

display: none;

visibility: hidden;

<div hidden>…</div>

⨯ ⨯⨯

Když chcete prvek schovat, použijete asi display: none. Jenže opravdu to chcete? Prvek nebude vidět ve čtečkách, ale i Google dá schovanému obsahu menší váhu. Takže pokud schovávat, nezkusit to dělat chytřeji?

Page 32: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

max-height: 0;

overflow: hidden;

opacity: 0;

⨯ ⨯

Čtečky nijak neřeší ořezaný obsah, takže tohle všechno normálně přečtou. Hlavně max-height: 0; je užitečný pro různé rozklikávání obsahu nebo navigací na mobilech.

Page 33: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<a href="#main" class="skip-link"> Přejít na obsah </a>

.skip-link { position: absolute; top: 0; right: 100%; }

.skip-link:focus { right: auto; }

→ vrdl.cz

Další příklad je obsah jen pro čtečky. Odkazy pro přecházení na obsah se stále hodí. Ne všichni mají čtečky, které umějí ARIA role. Progressive enahancement používáme i při kódování pro zrakově hendikepované.

Page 34: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<span class="icon" aria-hidden="true"> </span>

⨯ ⨯

Některé prvky bývají v kódu jen pro servisní účely. Jako tady span pro ikonku. Je lepší je před čtečkami schovat, nejlépe pomocí atributu aria-hidden="".

Page 35: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<span class="icon" aria-label="Menu"> </span>

Ale ještě lepší je opět neschovávatt a dát ji popisek. aria-label="" je něco jako alt="" u obrázků, jen naprosto univerzální.

Page 36: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

1. Struktura stránky 2. Tlačítka 3. Schovávání obsahu 4. Klávesnice 5. Našeptávač 6. Testování

4. Klávesnice

Page 37: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

• Interaktivní: <a>, <input>, <video>…

• Nejsou „disabled“

• Nejsou „hidden“

TAB:focus &

Které prvky jsou samy od sebe „fokusovatelné“ (zaměřitelné) a je možné k nim přistoupit pomocí tabulátoru?

Page 38: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<button disabled> Tlačítko </button>

Zase příklad s tlačítkem: zakázaný <button> focus automaticky prohlížeč vyloučí ze „zaměřitelných“.

Page 39: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<a href="#" class="btn btn--disabled" tabindex="-1"> Tlačítko </a>

U tlačítka to musíme dodělat ručně pomocí tabindexu. Mrkněme teď na tehle parametr. Tabindex se záporným číslem schová jinak zaměřitelný element.

Page 40: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

Přidání focusu a možnosti tabnutí:

<ul tabindex="0"> … </ul>

tabindex="0" umožní zaměřit jinak klávesnicí nezaměřitelný element. Brzy si ukážeme jedno použití.

Page 41: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

* { outline: none; }

Prosím, nerušte outline.

Page 42: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

* { outline: none; } ❌

Zbavíte se sice (pro někoho) ošklivého okraje, ale znemožníte zaměřit element z klávesnice. Kdyžtak to změňte, ale rozumně.

Page 43: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

TAB TAB

Neotevírejte vrstvy na focus. Znamená to pak, že musím tabulátorem projít všechny otevírané vrstvy. Lepší je použít k otevření vrstev nebo podnavigací mezerník.

Page 44: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

• tabulátor - posun po aktivních elementech

• mezerník - aktivace elementu

• enter - odeslání, přechod jinam

Page 45: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

1. Struktura stránky 2. Tlačítka 3. Schovávání obsahu 4. Klávesnice 5. Našeptávač 6. Testování5. Našeptávač

Page 46: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

Krok 1: Máme „normální“ našeptávač.

Page 47: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<label for="search"> Hledám: <input type="text" value="Hrušky" id="search" autocomplete="off"> </label>

<ul id="results"> <li>Jablka</li> <li id="active">Hrušky</li> </ul>

Krok 1: Máme „normální“ našeptávač. Takto vypadá kód.

Page 48: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<label for="search"> Hledám: <input type="text" value="Hrušky" id="search" autocomplete="off" role="combobox"> </label>

<ul id="results" role="listbox" tabindex="0"> <li role="option">Jablka</li> <li role="option" id="active">Hrušky</li> </ul>

Krok 2: Přidám role="" pro význam.

Page 49: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<label for="search"> Hledám: <input type="text" value="Hrušky" id="search" autocomplete="off" role="combobox" aria-describedby="description"> </label>

<span id="description" class="sr-only"> Z dostupných hodnot vybírejte šipkami nahoru a dolů. Pro výběr zmáčkněte klávesu Enter. Na dotykových zařízení použijte gesto švihnutí nahoru a dolů. </span>

<ul id="results" role="listbox" tabindex="0"> <li role="option">Jablka</li> <li role="option" id="active">Hrušky</li> </ul>

Krok 3: Do #description přidám nápovědu pro ovládání nevidomímy. Pomocí aria-describedby ji pak napojím na input.

Page 50: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<label for="search"> Hledám: <input type="text" value="Hrušky" id="search" autocomplete="off" role="combobox" aria-describedby="description" aria-owns="results"> </label>

<span id="description" class="sr-only"> Z dostupných hodnot vybírejte šipkami nahoru a dolů. Pro výběr zmáčkněte klávesu Enter. Na dotykových zařízení použijte gesto švihnutí nahoru a dolů. </span>

<ul id="results" role="listbox" tabindex="0"> <li role="option">Jablka</li> <li role="option" id="active">Hrušky</li> </ul>

Krok 4: Pomocí aria-owns="" vyrobím propojení mezi inputem a našeptávanými hodnotami.

Page 51: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<label for="search"> Hledám: <input type="text" value="Hrušky" id="search" autocomplete="off" role="combobox" aria-describedby="description" aria-owns="results" aria-activedescendant="active"> </label>

<span id="description" class="sr-only"> Z dostupných hodnot vybírejte šipkami nahoru a dolů. Pro výběr zmáčkněte klávesu Enter. Na dotykových zařízení použijte gesto švihnutí nahoru a dolů. </span>

<ul id="results" role="listbox" tabindex="0"> <li role="option" aria-selected="false">Jablka</li> <li role="option" aria-selected="true" id="active">Hrušky</li> </ul>

→ vrdl.in/autoac

Krok 5: Zvýraznění aktivní položky pomocí aria-selected="" a aria-activedescendant="". Celý nezjednodušený našeptávač je možné si zkusit na haltersweb.github.io/Accessibility.

Page 52: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

1. Struktura stránky 2. Tlačítka 3. Schovávání obsahu 4. Klávesnice 5. Našeptávač 6. Testování6. Testování

Page 53: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

Nadpisy

Pro jednorázové otestování se hodí tenon.io.

Page 54: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

V DevTools teď máte Lighthouse, sadu testů, která umí projít i přístupnost.

Page 55: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

<div class="button" role="button"> Tlačítko </div>

Ale pozor, automaty jsou jen automaty. Jako správný vyhodnotí i třeba takový patvar.

Page 56: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

JAWS Explorer

VoiceOver Safari

TalkBack Chrome

Windows

NVDA Firefox

Apple Android

Úplně nejlepší je testovat to v reálných čtečkách. Na každé platformě nějaké máte. Tady jsou doporučené kombinace od Radka Pavlíčka. Takže Vzhůru do testování.

Page 57: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

1. <main role="main"> 2. Aktivní prvek? <button>! 3. role="" pro UI komponenty 4. display: none NE, aria-hidden ANO 5. Ošetřím :focus a klávesnici 6. aria-label, aria-labelledby 7. Testuju 8. #VzpomenuSi

Page 58: WebExpo 2017 - Přístupnost v kódu: ukázky a návrhové vzory

Díky!vzhurudolu.cz

@machal

Za inspiraci k přednášce děkuji našemu Honzíkovi a za spolupráci Radkovi Pavlíčkovi. Díky! A vzpomeňte si při kódování na ostatní.