В зависимости от необходимой браузернйо поддержки у вас 2 варианта.
1 - более универсальный, но больше работы руками:
При загрузке документа находить в дереве ваш элемент с id=popup. Сохранить в переменную.
Добавлять обработчик скрола на документ и сверять текущий скролл и позицию элемента сверху от начала документа(
тык и
тык). Совпадает - вызываем модалку.
2 - более современный, но браузер сделает всё за вас:
Воспользоваться
Intersection Observer
Суть ,в целом, та же. Указываете за каким элементом следить, указываете что следить нужно за появлением этого элемента во вьюпорте и указываете функцию обработчик этого события, в которой открываете модалку.
Вот пример кода на Intersection observer
var options = {
root: null, // Не указываем = следим за областью вьюпорта.
rootMargin: '0px', // отступы вокруг root
threshold: 1.0
}
var callback = function(entries, observer) {
// Открываем модалку
};
var observer = new IntersectionObserver(callback, options);
/* Параметр threshold со значением 1.0 означает что функция будет вызвана при 100% пересечении объекта (за которым мы следим) с объектом root */
var target = document.querySelector('#popup'); // элемент, за которым будем следить.
observer.observe(target);
Профит