Библиотека ally.js предоставляет удобные инструменты
для работы с доступностью веб-приложений, включая управление фокусом,
проверку видимости элементов и определение их состояния для
пользователей с различными потребностями. Одним из ключевых инструментов
является функция ally.when.visibleArea, которая позволяет
отслеживать фактическую видимую площадь элемента на странице.
Функция ally.when.visibleArea используется для
определения того, насколько элемент виден пользователю в пределах
видимой области окна браузера. Это важно для интерфейсов, где элементы
могут быть частично скрыты из-за прокрутки, перекрытия другими блоками
или скрыты с помощью CSS (overflow: hidden,
opacity: 0 и т.д.).
Ключевые моменты работы:
Синтаксис функции:
ally.when.visibleArea(element, options)
Параметры:
element — DOM-элемент или селектор, за которым нужно
отслеживать видимость.
options — объект с настройками:
area (number, по умолчанию 0) —
минимальный процент видимой площади элемента, необходимый для
срабатывания промиса. Значение задаётся от 0 до 1 (0 — любое
прикосновение к видимой области, 1 — полная видимость).context (DOMElement, по умолчанию
document) — область, в пределах которой проверяется
видимость (может быть контейнер с прокруткой).observe (boolean, по умолчанию true) —
использовать ли IntersectionObserver для отслеживания
изменений видимости. Если false, проверка производится
только один раз.Отслеживание появления элемента в области видимости:
const element = document.querySelector('#target');
ally.when.visibleArea(element)
.then(() => {
console.log('Элемент виден хотя бы частично');
});
В этом примере промис разрешается сразу, как только элемент окажется хоть немного видимым на экране.
Отслеживание полной видимости элемента:
ally.when.visibleArea(element, { area: 1 })
.then(() => {
console.log('Элемент полностью виден');
});
Здесь промис срабатывает только тогда, когда элемент полностью входит в видимую область.
Использование с контейнером с прокруткой:
const container = document.querySelector('.scroll-container');
ally.when.visibleArea(element, { context: container })
.then(() => {
console.log('Элемент виден внутри прокручиваемого контейнера');
});
context позволяет отслеживать видимость элемента
относительно конкретного блока, а не всего окна браузера.
IntersectionObserverally.when.visibleArea использует
IntersectionObserver там, где это возможно, что делает
проверку эффективной и не нагружает основной поток
выполнения. В случае старых браузеров, которые не поддерживают
этот API, библиотека выполняет fallback через
периодическую проверку положения элемента на экране.
ally.when.visibleArea(imgElement, { area: 0.1 })
.then(() => {
imgElement.src = imgElement.dataset.src;
});
ally.when.visibleArea(section, { area: 0.5 })
.then(() => section.classList.add('fade-in'));
area выбирается исходя из целей: для триггера
любых действий достаточно 0, для точного взаимодействия
лучше использовать 0.5 или 1.context рекомендуется задавать, если элемент находится
внутри прокручиваемого блока, иначе видимость будет отслеживаться
относительно окна браузера.IntersectionObserver и избегать постоянной проверки
координат вручную.ally.query.focusable или
ally.maintain.tabFocus, чтобы управлять доступностью
элементов, которые появляются динамически.Эта функция является мощным инструментом для создания интерфейсов, чувствительных к видимости элементов, что особенно важно для доступных, интерактивных и оптимизированных веб-приложений. Она обеспечивает точное срабатывание действий только тогда, когда элемент реально находится в зоне видимости пользователя, что повышает UX и производительность страниц.