Привет, я предполагаю, что вы знакомы с javascript и использовали scrollIntoView в своей работе. Если нет, прочтите эту статью для лучшего понимания.
Этот пост предназначен для вас, если вы столкнулись с проблемой, используя метод element.scrollIntoView () для выделения элемента в представлении экрана.
Проблемы, с которыми вы могли столкнуться, заключаются в следующем:
Иногда поведение scrollIntoView является неожиданным (сама страница перемещается вместо перемещения элемента)
Плохая кросс-браузерная совместимость
Я столкнулся с той же проблемой и попытался решить ее после большого количества исследований в Интернете. Это чисто ванильный javascript, и не нужно беспокоиться о совместимости.
// This is the main function where which pass two ref parameters of Parent element & Child element export const scrollIntoView = (parent, child) => { const parentBounding = parent.getBoundingClientRect(), clientBounding = child.getBoundingClientRect(); const parentBottom = parentBounding.bottom, parentTop = parentBounding.top, clientBottom = clientBounding.bottom, clientTop = clientBounding.top; if (parentTop >= clientTop) { scrollTo(parent, -(parentTop - clientTop), 300); } else if (clientBottom > parentBottom) { scrollTo(parent, clientBottom - parentBottom, 300); } }; function scrollTo(element, to, duration) { let start = element.scrollTop, currentTime = 0, increment = 20; let animateScroll = function() { currentTime += increment; let val = easeInOutQuad(currentTime, start, to, duration); element.scrollTop = val; if (currentTime < duration) { setTimeout(animateScroll, increment); } }; animateScroll(); } // Function for smooth scroll animation with the time duration function easeInOutQuad(time, startPos, endPos, duration) { time /= duration / 2; if (time < 1) return (endPos / 2) * time * time + startPos; time--; return (-endPos / 2) * (time * (time - 2) - 1) + startPos; }
Надеюсь, код чистый и понятный. Если вам сложно понять или вы обнаружили проблему, прокомментируйте ее. Скоро ссылку с работающей моделью.