> Что такое Resize Observer и для чего он нужен? (JavaScript)
Уровень: junior · Роль: frontend · Категория: Технические вопросы
Компании: Сбер
Стек: JavaScript
> Пример ответа
Короткий ответ
Resize Observer - это API браузера, который позволяет отслеживать изменения размеров HTML-элемента. В отличие от window resize event, он работает на уровне конкретного элемента, а не всего окна. Основное назначение - выполнение кастомной логики при изменении ширины, высоты или положения элемента, например, для адаптивной верстки, ресайза графиков или обновления layout.
Подробное объяснение
Resize Observer является частью Observer API и предоставляет асинхронный способ реагировать на изменения размеров элемента. Он создает экземпляр ResizeObserver, которому передается callback-функция. Эта функция вызывается каждый раз, когда размеры наблюдаемого элемента меняются - будь то из-за CSS, JavaScript, изменения контента или ресайза окна. В callback передается массив объектов ResizeObserverEntry, каждый из которых содержит информацию об элементе (target), его новые размеры (contentRect) и границы (borderBoxSize, contentBoxSize, devicePixelContentBoxSize).
Основное отличие от window resize - Resize Observer не зависит от ресайза окна. Он срабатывает при любом изменении размеров элемента, включая динамическое добавление контента, изменение CSS-свойств (например, width, height, padding) или смену класса. Это делает его идеальным для компонентов, которые должны адаптироваться к своему контейнеру, а не к окну браузера.
Resize Observer также оптимизирован для производительности: он не создает бесконечных циклов (как, например, polling через setInterval) и автоматически обрабатывает множественные изменения в одном фрейме. Однако стоит помнить, что он не поддерживается в старых браузерах (IE11) и требует полифилла.
На практике
Resize Observer часто используется в следующих сценариях:
- Адаптивные компоненты: изменение поведения или стилей в зависимости от ширины контейнера (например, переключение между горизонтальным и вертикальным меню).
- Графики и диаграммы: перерисовка canvas или SVG при изменении размеров родительского элемента.
- Виртуальные списки: обновление количества отображаемых элементов при ресайзе контейнера.
- Кастомные layout-алгоритмы: например, masonry grid или динамическое позиционирование элементов.
- Отслеживание изменений в iframe или вложенных компонентах.
Важно: Resize Observer не предназначен для анимаций или частых изменений стилей внутри callback - это может привести к performance issues. Лучше использовать его для обновления состояния или вызова debounced функций.
Пример кода
JAVASCRIPT// Создаем наблюдательconst observer = new ResizeObserver((entries) => {for (const entry of entries) {const { target, contentRect } = entry;console.log(`Элемент ${target.id} изменил размер: ${contentRect.width} x ${contentRect.height}`);// Пример: адаптивное поведениеif (contentRect.width < 600) {target.classList.add('compact');} else {target.classList.remove('compact');}}});// Начинаем наблюдение за элементомconst myElement = document.getElementById('resizable-box');observer.observe(myElement);// Позже можно остановить наблюдение// observer.unobserve(myElement);// observer.disconnect();
Как отвечать на собеседовании
Начни с краткого определения: "Resize Observer - это API для отслеживания изменений размеров конкретного элемента". Затем объясни, чем он отличается от window resize - акцент на элемент, а не на окно. Приведи пример использования (например, адаптация графика). Если спросят про производительность, упомяни, что он работает асинхронно и не вызывает reflow в каждом кадре. Для уровня junior достаточно показать понимание базовой механики и одного-двух практических сценариев.
Что проверяет интервьюер
- Понимание разницы между Resize Observer и window resize event.
- Знание, что Resize Observer работает на уровне DOM-элемента, а не окна.
- Умение объяснить, когда его использовать (адаптивные компоненты, графики, layout).
- Осведомленность о производительности и ограничениях (не для анимаций, нужен полифилл для старых браузеров).
- Базовое знание синтаксиса: создание, observe, unobserve, disconnect.
Типичные ошибки
- Путать с MutationObserver (отслеживает изменения DOM, а не размеров).
- Использовать Resize Observer для ресайза окна - это избыточно, достаточно
window.addEventListener('resize'). - Забывать отключать observer при удалении элемента из DOM (утечка памяти).
- Пытаться изменять стили элемента внутри callback без debounce - это может вызвать бесконечный цикл ресайзов.
- Не учитывать, что
contentRectвключает padding, но не border и scrollbar.
> Похожие задачи по frontend
Может ли Promise одновременно зарезолвиться и зареджектиться в JavaScript?
Как из объекта String получить примитив строки в JavaScript?
Что такое Mutation Observer и для чего он нужен?
Что такое Blob в JavaScript и для чего он используется?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью