aria-activedescendant
При композитен уиджет сочи към ID на потомъка, който е текущо активен. DOM фокусът остава върху контейнера, докато виртуален фокус се движи между дъщерните елементи. Алтернатива на roving tabindex за listbox-ове, combobox-ове и grid-ове.
Кога да се използва
В композитен уиджет, при който се желае единична точка за Tab, но потребителят трябва да може да движи маркировката между множество елементи — комбобокс с listbox popup, listbox с единична Tab-спирка, treegrid, datagrid. DOM фокусът остава върху контейнерния елемент (полето за въвеждане, listbox-а, grid-а). При натискане на клавиши-стрелки aria-activedescendant се актуализира с ID на новоактивирания дъщерен елемент, а помощните технологии го обявяват така, сякаш фокусът действително е преминал към него.
Алтернативният подход е roving tabindex: реалното преместване на DOM фокуса с коригиране на стойностите на tabindex. Изберете aria-activedescendant, когато задържането на фокуса на браузъра върху контейнера опростява кода — обикновено защото в контейнера потребителят въвежда текст или са прикрепени клавишни комбинации.
Как работи
Стойността е единичен ID на елемент — никога списък. Реферираният елемент трябва да е потомък на контейнера, в който е зададен атрибутът aria-activedescendant (или да е собственост чрез aria-owns). При промяна на стойността „виртуалният фокус” в дървото за достъпност се премества към съответния елемент и помощните технологии обявяват неговото означение, роля и състояние.
Два аспекта остават изцяло в отговорност на разработчика:
- Визуален стил. Помощните технологии знаят къде е виртуалният фокус, но браузърът не изрисува пръстен на фокуса върху потомъка. Необходимо е да се добави собствена CSS маркировка, синхронизирана чрез превключване на клас.
- Превъртане. Ако активният потомък е извън видимата област, той трябва да бъде изведен в нея програмно — браузърът не прави това автоматично.
Когато попапът се затвори или уиджетът загуби фокус, aria-activedescendant трябва да се изчисти до празен низ или атрибутът да се премахне.
Чести грешки
- Посочване на ID, което не е потомък на контейнера и не е собственост чрез
aria-owns. Помощните технологии игнорират такава референция. - Смесване на подходи: задаване на
tabindex="0"на потомъка и едновременноaria-activedescendantна контейнера. Трябва да се избере само една стратегия за фокус; двете в комбинация си противоречат. - Пропуск при актуализиране на визуалната маркировка при промяна на атрибута — потребителите с добро зрение не виждат движение, докато потребителите на помощни технологии чуват преместването.
- Оставяне на остаряло ID след премахване на опцията от списъка (например при филтриране на резултати в combobox).
- Актуализиране на
aria-activedescendantпри преминаване на мишката. Атрибутът трябва да проследява само активния елемент, управляван с клавиатура. - Задаване на атрибута на елемент, в чието дърво за достъпност потомъкът не е включен (пропуснат
aria-ownsза портален списък).
Пример
<label for="fruit">Плод</label>
<input
id="fruit"
role="combobox"
type="text"
aria-controls="fruit-listbox"
aria-expanded="true"
aria-activedescendant="fruit-2"
autocomplete="off"
>
<ul id="fruit-listbox" role="listbox">
<li id="fruit-1" role="option">Apple</li>
<li id="fruit-2" role="option" class="is-active">Banana</li>
<li id="fruit-3" role="option">Cherry</li>
</ul>