DOM и React Senior DOM на практике обновлено

Прокрутка к элементу

Условие

scrollToItem(container, index): прокручивает контейнер так, чтобы элемент с data-index был виден. Если он выше видимой области - встаёт к верхнему краю, если ниже - к нижнему. Если уже виден целиком - не трогать прокрутку.

Что проверяют тесты

  • прокручивает вниз к элементу

  • не трогает прокрутку, если элемент виден

  • нет такого элемента

Как подойти

scrollIntoView решает задачу в одну строку, но всегда двигает прокрутку, даже когда элемент уже виден - интерфейс дёргается при навигации стрелками. Ручной расчёт даёт поведение «двигать минимально», которое и ожидают в списках и выпадашках. То же самое делает scrollIntoView с block: 'nearest' - назвать этот вариант стоит.

Подсказки: 3
  1. Сравнивай положение элемента с видимой областью контейнера, а не с окном.
  2. offsetTop отсчитывается от позиционированного предка - он должен совпадать с контейнером прокрутки.
  3. Если элемент уже виден, прокрутка не нужна вовсе.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.