Может кто-то предложит вариант по-лучше, но у меня есть такое решение:
<video id='hls-video' style="width: 100%; height: 90vh;" controls>
<source id="change-src" src='https://www.w3schools.com/html/mov_bbb.mp4' title='480p' type='video/mp4'/>
</video>
Проверяем, что наш элемент находится в зоне видимости окна браузера. Если это так, то перезапускаем видео:
const video = document.querySelector('#hls-video');
const source = document.querySelector('#change-src');
const reloadVideo = () => {
video.pause()
source.setAttribute('src', 'https://www.w3schools.com/html/mov_bbb.mp4');
video.load();
video.play();
}
const visible = target => {
let targetPosition = {
top: window.pageYOffset + target.getBoundingClientRect().top,
left: window.pageXOffset + target.getBoundingClientRect().left,
right: window.pageXOffset + target.getBoundingClientRect().right,
bottom: window.pageYOffset + target.getBoundingClientRect().bottom
}
let windowPosition = {
top: window.pageYOffset,
left: window.pageXOffset,
right: window.pageXOffset + document.documentElement.clientWidth,
bottom: window.pageYOffset + document.documentElement.clientHeight
}
if (targetPosition.bottom > windowPosition.top &&
targetPosition.top < windowPosition.bottom &&
targetPosition.right > windowPosition.left &&
targetPosition.left < windowPosition.right) {
console.log('Вы видите элемент :)');
} else {
reloadVideo()
};
}
window.addEventListener('scroll', () => {
visible(video);
});