Теневой DOM (Shadow DOM) является ключевой технологией веб-компонентов, позволяющей изолировать внутреннюю структуру элемента от остальной части документа. Это создаёт закрытую область, где стили и скрипты не влияют на внешние элементы и наоборот. Для инструментов доступности, таких как библиотека Axe-core, работа с теневым DOM требует особого внимания, поскольку стандартный обход DOM не всегда позволяет корректно анализировать скрытые или инкапсулированные элементы.
Теневой DOM создаётся при помощи метода
attachShadow({ mode: 'open' | 'closed' }).
element.shadowRoot. Axe-core может напрямую анализировать
его содержимое.Внутри теневого DOM содержатся:
<div>,
<section> и другие HTML-элементы, полностью
инкапсулированные.<slot>
используется для распределения внешнего контента в теневом DOM.Библиотека Axe-core начиная с версии 4.0 имеет встроенную поддержку теневого DOM. Основные механизмы:
<slot> корректно отображается как часть визуальной
структуры, что позволяет проверять доступность с точки зрения
пользователей.display: none или aria-hidden="true"
исключаются из анализа, даже если они находятся внутри shadow DOM.MutationObserver, что
позволяет актуализировать результаты проверок.clip-path, opacity: 0 или нестандартные
CSS-трюки.Для интеграции Axe-core с теневым DOM используются стандартные методы библиотеки:
import axe from 'axe-core';
// Запуск анализа конкретного элемента с теневым DOM
const element = document.querySelector('my-component');
axe.run(element, {
// Настройки правил
runOnly: {
type: 'tag',
values: ['wcag2a', 'wcag2aa']
}
}).then(results => {
console.log(results.violations);
});
Особенности применения:
includeShadowDOM: true
для рекурсивного обхода:axe.run(document, { includeShadowDOM: true })
.then(results => console.log(results.violations));
Для теневого DOM особенно важна настройка правил Axe-core. Основные моменты:
aria-label, aria-labelledby и
role, применяемых к элементам внутри shadow root.Рекомендуется явно указывать путь к элементам shadow DOM при необходимости тестирования конкретных интерактивных блоков, чтобы избежать ложноположительных или ложноотрицательных результатов.
Эффективная работа Axe-core с теневым DOM позволяет обнаруживать ошибки доступности даже в сложных веб-компонентах, обеспечивая соответствие стандартам WCAG и улучшая качество пользовательского интерфейса.