Поддержка экранных читалок является важным аспектом доступности веб-приложений. Polymer, как фреймворк для создания Web Components, предоставляет гибкие механизмы для интеграции ARIA-атрибутов и управления фокусом, что делает компоненты совместимыми с технологиями вспомогательного доступа.
ARIA (Accessible Rich Internet Applications) предоставляет способ обозначить семантику компонентов для экранных читалок. В Polymer компоненты можно настраивать с помощью стандартных атрибутов:
import { PolymerElement, html } from '@polymer/polymer/polymer-element.js';
class AccessibleButton extends PolymerElement {
static get template() {
return html`
<button
role="button"
aria-label="Сохранить изменения"
on-click="saveData">
Сохранить
</button>
`;
}
saveData() {
console.log('Данные сохранены');
}
}
customElements.define('accessible-button', AccessibleButton);
Ключевые моменты:
role определяет семантику компонента.aria-label позволяет дать чёткое текстовое описание,
видимое только для экранных читалок.aria-live, чтобы уведомлять пользователей об изменениях
контента:<div aria-live="polite">Загрузка завершена</div>
Screen reader корректно считывает только элементы с доступным
фокусом. В Polymer можно управлять фокусом с помощью стандартного
свойства tabindex и методов focus():
this.shadowRoot.querySelector('#inputField').focus();
Рекомендации:
tabindex="0" для интерактивных элементов,
не являющихся стандартными кнопками или ссылками.tabindex="-1" для элементов, с которыми
пользователь должен взаимодействовать.focus() после динамического
рендеринга, чтобы направить внимание пользователя на новые или
обновлённые элементы.Web Components часто обновляют DOM без полной перезагрузки страницы.
Для совместимости с экранными читалками применяются атрибуты
aria-live и события:
this.set('statusMessage', 'Файл успешно загружен');
<div aria-live="assertive">[[statusMessage]]</div>
aria-live="polite" сообщает экранной читалке о не
срочных обновлениях.aria-live="assertive" немедленно привлекает внимание
пользователя к критической информации.Polymer использует Shadow DOM для инкапсуляции стилей и структуры. Это создаёт особенности для screen reader:
role и aria-* должны быть
прописаны внутри компонента.<slot>) позволяет
передавать доступные элементы внутрь Shadow DOM:<my-dialog>
<p slot="content">Информация для пользователя</p>
</my-dialog>
Для проверки совместимости с экранными читалками применяются следующие инструменты:
Практические советы:
<button>, <a>,
<input>), а не только стилизованные
<div> или <span>.aria-live.class AccessibleModal extends PolymerElement {
static get template() {
return html`
<div role="dialog" aria-modal="true" aria-labelledby="modalTitle" hidden$="[[!opened]]">
<h2 id="modalTitle">Диалоговое окно</h2>
<slot name="content"></slot>
<button on-click="closeModal">Закрыть</button>
</div>
`;
}
static get properties() {
return {
opened: { type: Boolean, value: false }
};
}
openModal() {
this.opened = true;
this.updateComplete.then(() => {
this.shadowRoot.querySelector('button').focus();
});
}
closeModal() {
this.opened = false;
}
}
customElements.define('accessible-modal', AccessibleModal);
В этом примере реализованы ключевые аспекты:
dialog и атрибут
aria-modal.aria-labelledby.Polymer предоставляет богатый набор инструментов для обеспечения совместимости компонентов с экранными читалками. Использование ARIA, контроль фокуса и правильное управление Shadow DOM позволяют создавать доступные и удобные интерфейсы, соответствующие современным требованиям веб-стандартов.