Прокрутка к элементу
Условие
scrollToItem(container, index): прокручивает контейнер так, чтобы элемент с data-index был виден. Если он выше видимой области - встаёт к верхнему краю, если ниже - к нижнему. Если уже виден целиком - не трогать прокрутку.
Что проверяют тесты
прокручивает вниз к элементу
не трогает прокрутку, если элемент виден
нет такого элемента
Как подойти
scrollIntoView решает задачу в одну строку, но всегда двигает прокрутку, даже когда элемент уже виден - интерфейс дёргается при навигации стрелками. Ручной расчёт даёт поведение «двигать минимально», которое и ожидают в списках и выпадашках. То же самое делает scrollIntoView с block: 'nearest' - назвать этот вариант стоит.
Подсказки: 3
- Сравнивай положение элемента с видимой областью контейнера, а не с окном.
- offsetTop отсчитывается от позиционированного предка - он должен совпадать с контейнером прокрутки.
- Если элемент уже виден, прокрутка не нужна вовсе.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.