Atraskite prieinamas ir patogias kortelių sąsajas. Išmokite geriausių klaviatūros navigacijos, ARIA vaidmenų ir patikimo fokuso valdymo praktikų pasaulinei auditorijai.
Kortelių sąsajų įvaldymas: išsami klaviatūros navigacijos ir fokuso valdymo analizė
Kortelėmis pagrįstos sąsajos yra šiuolaikinio interneto dizaino pagrindas. Nuo produktų puslapių ir vartotojų prietaisų skydelių iki sudėtingų interneto programų jos suteikia elegantišką sprendimą turiniui organizuoti ir vartotojo sąsajai supaprastinti. Nors iš pirmo žvilgsnio jos gali atrodyti paprastos, norint sukurti tikrai veiksmingą ir prieinamą kortelių komponentą, reikia gerai išmanyti navigaciją klaviatūra ir kruopštų fokuso valdymą. Prastai įdiegta kortelių sąsaja gali tapti neįveikiama kliūtimi vartotojams, kurie naudojasi klaviatūra ar pagalbinėmis technologijomis, ir veiksmingai užkirsti jiems kelią prie jūsų turinio.
Šis išsamus vadovas skirtas interneto kūrėjams, UI/UX dizaineriams ir prieinamumo šalininkams, kurie nori žengti toliau nei pagrindai. Išnagrinėsime tarptautiniu mastu pripažintus klaviatūros sąveikos modelius, esminį ARIA (Prieinamų raiškiojo interneto programų) vaidmenį teikiant semantinį kontekstą ir subtilias fokuso valdymo technikas, kurios sukuria sklandžią ir intuityvią vartotojo patirtį visiems, nepriklausomai nuo jų buvimo vietos ar sąveikos su internetu būdo.
Kortelių sąsajos anatomija: pagrindiniai komponentai
Prieš gilinantis į mechaniką, būtina nustatyti bendrą terminiją, pagrįstą WAI-ARIA kūrimo praktikomis. Standartinį kortelių komponentą sudaro trys pagrindiniai elementai:
- Kortelių sąrašas (`role="tablist"`): Tai konteinerio elementas, kuriame yra kortelių rinkinys. Jis veikia kaip pagrindinis valdiklis, su kuriuo vartotojai sąveikauja, norėdami perjungti skirtingus turinio skydelius.
- Kortelė (`role="tab"`): Atskiras paspaudžiamas elementas kortelių sąraše. Suaktyvinus, jis rodo susijusį turinio skydelį. Vizualiai tai yra pati „kortelė“.
- Kortelės skydelis (`role="tabpanel"`): Konteineris turiniui, susijusiam su konkrečia kortele. Vienu metu matomas tik vienas kortelės skydelis – tas, kuris atitinka šiuo metu aktyvią kortelę.
Šios struktūros supratimas yra pirmas žingsnis kuriant komponentą, kuris yra ne tik vizualiai vientisas, bet ir semantiškai suprantamas pagalbinėms technologijoms, tokioms kaip ekrano skaitytuvai.
Nepriekaištingos navigacijos klaviatūra principai
Regiančiam pelės vartotojui sąveika su kortelėmis yra paprasta: spustelite kortelę, kurią norite matyti. Vartotojams, naudojantiems tik klaviatūrą, patirtis turi būti tokia pat intuityvi. WAI-ARIA kūrimo praktikos pateikia tvirtą, standartizuotą klaviatūros sąveikos modelį, kurio tikisi pagalbinių technologijų vartotojai.
Naršymas kortelių sąraše (`role="tablist"`)
Pagrindinė sąveika vyksta kortelių sąraše. Tikslas – leisti vartotojams efektyviai naršyti ir pasirinkti korteles, nereikalaujant pereiti per kiekvieną interaktyvų elementą puslapyje.
- `Tab` klavišas: Tai įėjimo ir išėjimo taškas. Kai vartotojas paspaudžia `Tab`, fokusas turėtų pereiti *į* kortelių sąrašą ir atsidurti ant šiuo metu aktyvios kortelės. Dar kartą paspaudus `Tab`, fokusas turėtų pereiti *iš* kortelių sąrašo į kitą fokusuojamą elementą puslapyje (arba į aktyvų kortelės skydelį, priklausomai nuo jūsų dizaino). Svarbiausia išvada yra ta, kad visas kortelių sąrašo valdiklis turėtų atstoti vieną stotelę bendroje puslapio `Tab` sekoje.
- Rodyklių klavišai (`Kairėn/Dešinėn` arba `Aukštyn/Žemyn`): Kai fokusas yra kortelių sąraše, navigacijai naudojami rodyklių klavišai.
- Horizontaliam kortelių sąrašui `Dešinės rodyklės` klavišas perkelia fokusą į kitą kortelę, o `Kairės rodyklės` klavišas – į ankstesnę.
- Vertikaliam kortelių sąrašui `Apatinės rodyklės` klavišas perkelia fokusą į kitą kortelę, o `Viršutinės rodyklės` klavišas – į ankstesnę.
- `Home` ir `End` klavišai: Siekiant efektyvumo sąrašuose su daug kortelių, šie klavišai suteikia sparčiuosius klavišus.
- `Home`: Perkelia fokusą į pirmąją sąrašo kortelę.
- `End`: Perkelia fokusą į paskutinę sąrašo kortelę.
Aktyvavimo modeliai: automatinis ir rankinis
Kai vartotojas naršo tarp kortelių naudodamas rodyklių klavišus, kada turėtų būti rodomas atitinkamas skydelis? Yra du standartiniai modeliai:
- Automatinis aktyvavimas: Kai tik kortelė gauna fokusą per rodyklės klavišą, rodomas su ja susijęs skydelis. Tai labiausiai paplitęs modelis ir paprastai yra pageidautinas dėl savo greitumo. Jis sumažina klavišų paspaudimų, reikalingų turiniui peržiūrėti, skaičių.
- Rankinis aktyvavimas: Judinant fokusą rodyklių klavišais, kortelė tik paryškinama. Vartotojas tada turi paspausti `Enter` arba `Space`, kad aktyvuotų kortelę ir parodytų jos skydelį. Šis modelis gali būti naudingas, kai kortelių skydeliuose yra daug turinio arba jie sukelia tinklo užklausas, nes tai neleidžia turiniui be reikalo krautis, kol vartotojas tiesiog naršo kortelių parinktis.
Aktyvavimo modelio pasirinkimas turėtų būti pagrįstas jūsų sąsajos turiniu ir kontekstu. Kad ir kurį pasirinktumėte, būkite nuoseklūs visoje savo programoje.
Fokuso valdymo įvaldymas: nepastebimas patogumo herojus
Efektyvus fokuso valdymas yra tai, kas skiria griozdišką sąsają nuo sklandžios. Tai reiškia programinį vartotojo fokuso valdymą, užtikrinantį logišką ir nuspėjamą kelią per komponentą.
Klajojančio `tabindex` technika
Klajojantis `tabindex` yra klaviatūros navigacijos pagrindas komponentuose, tokiuose kaip kortelių sąrašai. Tikslas – kad visas valdiklis veiktų kaip viena `Tab` stotelė.
Štai kaip tai veikia:
- Šiuo metu aktyviam kortelės elementui suteikiamas `tabindex="0"`. Tai padaro jį natūralios `Tab` sekos dalimi ir leidžia jam gauti fokusą, kai vartotojas patenka į komponentą.
- Visiems kitiems neaktyviems kortelių elementams suteikiamas `tabindex="-1"`. Tai pašalina juos iš natūralios `Tab` sekos, todėl vartotojui nereikia spausti `Tab` per kiekvieną iš jų. Juos vis dar galima fokusuoti programiškai, ką mes ir darome naviguodami rodyklių klavišais.
Kai vartotojas paspaudžia rodyklės klavišą, norėdamas pereiti nuo kortelės A prie kortelės B:
- JavaScript logika atnaujina kortelę A, kad jos `tabindex` būtų `"-1"`.
- Tada ji atnaujina kortelę B, kad jos `tabindex` būtų `"0"`.
- Galiausiai, ji iškviečia `.focus()` metodą kortelės B elementui, kad perkeltų ten vartotojo fokusą.
Ši technika užtikrina, kad nesvarbu, kiek kortelių yra sąraše, komponentas visada užima tik vieną poziciją bendroje puslapio `Tab` sekoje.
Fokusas kortelių skydeliuose
Kai kortelė yra aktyvi, kur toliau keliauja fokusas? Tikimasi, kad paspaudus `Tab` ant aktyvaus kortelės elemento, fokusas pereis į pirmąjį fokusuojamą elementą *viduje* atitinkamo kortelės skydelio. Jei kortelės skydelyje nėra fokusuojamų elementų, paspaudus `Tab` fokusas turėtų pereiti į kitą fokusuojamą elementą puslapyje *po* kortelių sąrašo.
Panašiai, kai vartotojas yra susifokusavęs ant paskutinio fokusuojamo elemento kortelės skydelyje, paspaudus `Tab` fokusas turėtų išeiti iš skydelio į kitą fokusuojamą elementą puslapyje. Paspaudus `Shift + Tab` ant pirmojo fokusuojamo elemento skydelyje, fokusas turėtų grįžti į aktyvų kortelės elementą.
Venkite fokuso spąstų: Kortelių sąsaja nėra modalinis langas. Vartotojai visada turėtų galėti naršyti į kortelių komponentą ir jo skydelius bei iš jų naudodami `Tab` klavišą. Neįkalinkite fokuso komponente, nes tai gali klaidinti ir varginti.
ARIA vaidmuo: semantikos perdavimas pagalbinėms technologijoms
Be ARIA, kortelių sąsaja, sukurta su `
Būtiniausi ARIA vaidmenys ir atributai
- `role="tablist"`: Naudojamas ant elemento, kuriame yra kortelės. Jis praneša, „Tai yra kortelių sąrašas.“
- `aria-label` arba `aria-labelledby`: Naudojamas ant `tablist` elemento, kad suteiktų prieinamą pavadinimą, pavyzdžiui, `aria-label="Turinio kategorijos"`.
- `role="tab"`: Naudojamas ant kiekvieno atskiro kortelės valdymo elemento (dažnai `
- `aria-selected="true"` arba `"false"`: Kritiškai svarbus būsenos atributas ant kiekvieno `role="tab"`. `"true"` rodo šiuo metu aktyvią kortelę, o `"false"` – neaktyvias. Ši būsena turi būti dinamiškai atnaujinama naudojant JavaScript.
- `aria-controls="panel-id"`: Naudojamas ant kiekvieno `role="tab"`, jo reikšmė turėtų būti `id` to `tabpanel` elemento, kurį jis valdo. Tai sukuria programinę sąsają tarp valdiklio ir jo turinio.
- `role="tabpanel"`: Naudojamas ant kiekvieno turinio skydelio elemento. Jis praneša, „Tai yra turinio skydelis, susijęs su kortele.“
- `aria-labelledby="tab-id"`: Naudojamas ant kiekvieno `role="tabpanel"`, jo reikšmė turėtų būti `id` to `role="tab"` elemento, kuris jį valdo. Tai sukuria atvirkštinę asociaciją, padedančią pagalbinėms technologijoms suprasti, kuri kortelė žymi šį skydelį.
Neaktyvaus turinio slėpimas
Nepakanka vizualiai paslėpti neaktyvius kortelių skydelius. Jie taip pat turi būti paslėpti nuo pagalbinių technologijų. Efektyviausias būdas tai padaryti yra naudoti `hidden` atributą arba `display: none;` CSS taisyklę. Tai pašalina skydelio turinį iš prieinamumo medžio, neleidžiant ekrano skaitytuvui skelbti turinio, kuris šiuo metu nėra aktualus.
Praktinis įgyvendinimas: aukšto lygio pavyzdys
Panagrinėkime supaprastintą HTML struktūrą, kurioje įtraukti šie ARIA vaidmenys ir atributai.
HTML struktūra
<h2 id="tablist-label">Paskyros nustatymai</h2>
<div role="tablist" aria-labelledby="tablist-label">
<button id="tab-1" type="button" role="tab" aria-selected="true" aria-controls="panel-1" tabindex="0">
Profilis
</button>
<button id="tab-2" type="button" role="tab" aria-selected="false" aria-controls="panel-2" tabindex="-1">
Slaptažodis
</button>
<button id="tab-3" type="button" role="tab" aria-selected="false" aria-controls="panel-3" tabindex="-1">
Pranešimai
</button>
</div>
<div id="panel-1" role="tabpanel" aria-labelledby="tab-1" tabindex="0">
<p>Profilio skydelio turinys...</p>
</div>
<div id="panel-2" role="tabpanel" aria-labelledby="tab-2" tabindex="0" hidden>
<p>Slaptažodžio skydelio turinys...</p>
</div>
<div id="panel-3" role="tabpanel" aria-labelledby="tab-3" tabindex="0" hidden>
<p>Pranešimų skydelio turinys...</p>
</div>
JavaScript logika (pseudo kodas)
Jūsų JavaScript būtų atsakingas už klaviatūros įvykių klausymąsi `tablist` elemente ir atitinkamą atributų atnaujinimą.
const tablist = document.querySelector('[role="tablist"]');
const tabs = tablist.querySelectorAll('[role="tab"]');
tablist.addEventListener('keydown', (e) => {
let currentTab = document.activeElement;
let newTab;
if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {
// Rasti kitą kortelę sekoje, prireikus pereinant į pradžią
newTab = getNextTab(currentTab);
} else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {
// Rasti ankstesnę kortelę sekoje, prireikus pereinant į pabaigą
newTab = getPreviousTab(currentTab);
} else if (e.key === 'Home') {
newTab = tabs[0];
} else if (e.key === 'End') {
newTab = tabs[tabs.length - 1];
}
if (newTab) {
activateTab(newTab);
e.preventDefault(); // Išvengti numatytojo naršyklės elgesio rodyklių klavišams
}
});
function activateTab(tab) {
// Deaktyvuoti visas kitas korteles
tabs.forEach(t => {
t.setAttribute('aria-selected', 'false');
t.setAttribute('tabindex', '-1');
document.getElementById(t.getAttribute('aria-controls')).hidden = true;
});
// Aktyvuoti naują kortelę
tab.setAttribute('aria-selected', 'true');
tab.setAttribute('tabindex', '0');
document.getElementById(tab.getAttribute('aria-controls')).hidden = false;
tab.focus();
}
Globalūs aspektai ir geriausios praktikos
Kuriant pasaulinei auditorijai, reikia mąstyti plačiau nei viena kalba ar kultūra. Kalbant apie kortelių sąsajas, svarbiausias aspektas yra teksto kryptis.
Kalbos, rašomos iš dešinės į kairę (RTL), palaikymas
Kalbomis, tokiomis kaip arabų, hebrajų ir persų, kurios skaitomos iš dešinės į kairę, klaviatūros navigacijos modelis turi būti atspindėtas. RTL kontekste:
- `Dešinės rodyklės` klavišas turėtų perkelti fokusą į ankstesnę kortelę.
- `Kairės rodyklės` klavišas turėtų perkelti fokusą į kitą kortelę.
Tai galima įgyvendinti JavaScript, nustatant dokumento kryptį (`dir="rtl"`) ir atitinkamai apverčiant kairės ir dešinės rodyklių klavišų logiką. Šis, atrodytų, nedidelis pakeitimas yra kritiškai svarbus siekiant suteikti intuityvią patirtį milijonams vartotojų visame pasaulyje.
Vizualus fokuso indikavimas
Nepakanka, kad fokusas būtų teisingai valdomas užkulisiuose; jis turi būti aiškiai matomas. Užtikrinkite, kad jūsų fokusuotos kortelės ir interaktyvūs elementai kortelių skydeliuose turėtų gerai matomą fokuso kontūrą (pvz., ryškų žiedą ar rėmelį). Venkite kontūrų šalinimo su `outline: none;`, nepateikdami tvirtesnės ir prieinamesnės alternatyvos. Tai yra labai svarbu visiems klaviatūros vartotojams, ypač tiems, kurie turi silpną regėjimą.
Išvada: kūrimas siekiant įtraukties ir patogumo
Tikrai prieinamos ir patogios kortelių sąsajos sukūrimas yra apgalvotas procesas. Tam reikia peržengti vizualinio dizaino ribas ir gilintis į komponento pagrindinę struktūrą, semantiką ir elgseną. Taikydami standartizuotus klaviatūros navigacijos modelius, teisingai įgyvendindami ARIA vaidmenis ir atributus bei tiksliai valdydami fokusą, galite sukurti sąsajas, kurios yra ne tik atitinkančios reikalavimus, bet ir iš tiesų intuityvios bei suteikiančios galių visiems vartotojams.
Atsiminkite šiuos pagrindinius principus:
- Naudokite vieną `Tab` stotelę: pasitelkite klajojančio `tabindex` techniką, kad visą komponentą būtų galima naršyti rodyklių klavišais.
- Bendraukite su ARIA: naudokite `role="tablist"`, `role="tab"` ir `role="tabpanel"` kartu su susijusiomis savybėmis (`aria-selected`, `aria-controls`), kad suteiktumėte semantinę prasmę.
- Valdykite fokusą logiškai: užtikrinkite, kad fokusas nuspėjamai judėtų nuo kortelės prie skydelio ir iš komponento.
- Tinkamai slėpkite neaktyvų turinį: naudokite `hidden` arba `display: none`, kad pašalintumėte neaktyvius skydelius iš prieinamumo medžio.
- Testuokite kruopščiai: išbandykite savo įgyvendinimą naudodami tik klaviatūrą ir su įvairiais ekrano skaitytuvais (NVDA, JAWS, VoiceOver), kad įsitikintumėte, jog jis veikia taip, kaip tikėtasi, visiems.
Investuodami į šias detales, mes prisidedame prie įtraukesnio interneto – tokio, kuriame sudėtinga informacija yra prieinama visiems, nepriklausomai nuo to, kaip jie naršo skaitmeniniame pasaulyje.