Я пытаюсь скопировать эту функциональность, с помощью которой можно управлять развитием видео с помощью прокрутки мыши. Необычно, функционал работает безупречно на Safari , но на Firefox, Opera и Brave не работает - на Chrome обновление видео, кажется, блокируется, пока не завершится все событие прокрутки, но он контролирует положение видео. Таким образом, создается впечатление, что он очень зазубренный или отстающий (и, таким образом, можно прокрутить видео прямо на Chrome, не двигаясь вообще). У меня такое ощущение, что мне не хватает чего-то очевидного, связанного с requestAnimationFrame
или Intersection Observer
. Не могла бы какая-нибудь добрая душа взглянуть и сообщить мне, если это так, и если да, то где?
<div id="set-height">
<video width="100%" height="auto" id="v0">
<source src="Video.webm" type="video/webm"></source>
<source src="Video.mp4" type="video/mp4"></source>
</video>
</div>
<script>
const playbackConst = 150, // lower the number, quicker the animation
waveVid = document.querySelector('.index-section--scroll-video'),
vid = document.getElementById('v0');
let frameNumber = 0,
myRequest = window.requestAnimationFrame(scrollPlay);
function scrollPlay() {
frameNumber = ((window.innerHeight * 0.7) - vid.getBoundingClientRect().top) / playbackConst; // position of where the animation starts: 100vh - distance to video
vid.currentTime = frameNumber;
window.requestAnimationFrame(scrollPlay); // recursive call is necessary for functionality
}
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (!entry.isIntersecting) {
window.cancelAnimationFrame(myRequest); // this was needed as Firefox was eating my CPU up on the site
return;
} else {
window.requestAnimationFrame(scrollPlay);
console.log(vid.getBoundingClientRect().top);
}
});
observer.observe(vid);
});
</script>