#javascript #reactjs #scroll
#javascript #reactjs #прокрутка
Вопрос:
Я пытаюсь добиться функциональности, при которой при прокрутке видео приостанавливается, если оно воспроизводилось, и наоборот. В настоящее время я могу сделать это с помощью функции onClick, которая устанавливает состояние true / false. Но проблема в том, что видео продолжает воспроизводиться после прокрутки вниз, пока я не нажму на него, чтобы снова поставить на паузу. Я хочу сохранить функцию onClick такой, какая она есть, а также хочу добавить функцию onScroll. Пытался сделать это с onScroll
, но не работает.
const [playing, setPlaying] = useState(false);
const videoRef = useRef(null);
const handleVideoPress = () => {
if (playing) {
videoRef.current.pause();
setPlaying(false);
} else {
videoRef.current.play();
setPlaying(true);
}
};
return (
<div className="video">
<video
onClick={handleVideoPress}
className="video__player"
loop
ref={videoRef}
src={url}
></video>
);
}
Ответ №1:
Таким образом, это остановит воспроизведение вашего видео при любом событии прокрутки. Если вы хотите, чтобы оно прекратило воспроизведение, если оно покинуло область просмотра, вы можете изучить возможность использования чего-то вроде IntersectionObserver API, чтобы что-то сделать, если оно находится в области просмотра (воспроизведение видео) или за пределами области просмотра (остановка видео).
Примечание: большинство современных браузеров не позволяют Javascript запускать видео, если уже не было хотя бы какого-то взаимодействия пользователя со страницей.
const [playing, setPlaying] = useState(false);
const videoRef = useRef(null);
useEffect(() => {
window.addEventListener('scroll', debounce(handleScroll, 200))
return () => {
window.removeEventListener('scroll', handleScroll);
};
}, []}
const startVideo = () => {
videoRef.current.pause();
setPlaying(false);
}
const pauseVideo = () => {
videoRef.current.play();
setPlaying(true);
}
const handleScroll = (e) => {
if (playing) {
pauseVideo();
}
}
const handleVideoPress = () => {
if (playing) {
startVideo();
} else {
pauseVideo();
}
};
return (
<div className="video">
<video
onClick={handleVideoPress}
className="video__player"
loop
ref={videoRef}
src={url}
></video>
);
}
Я сделал рабочий пример использования IntersectionObserver
с ref-крючками React, которые можно найти здесь:
https://codesandbox.io/s/strange-smoke-p9hmx
Пожалуйста, дайте мне знать, если у вас возникнут еще какие-либо вопросы.
Комментарии:
1. говорит, что debouce не определен. пробовал использовать Intersection observer, интересно, где я ошибся useEffect(() => { пусть video = document.getElementById(«video__player»); пусть observer = new IntersectionObserver( (entry) => { if (entry.intersectionRatio != 1 amp;amp; !воспроизведение) { videoRef.current.pause(); setPlaying(true); } else if (воспроизведение) { videoRef.current.play(); setPlaying(ложь); } }, { пороговое значение: 1 } ); observer.observe(видео); observer.unobserve(видео); }, [воспроизведение]);
2. Debounce — это либо функция, которую вы можете написать самостоятельно, либо вы можете использовать библиотеку Lodash. lodash.com Позвольте мне кое-что закончить, и я приведу вам рабочий пример с IntersectionObserver API.
3. Я обновил свой ответ ссылкой на Codesandbox с рабочим примером, использующим IntersectionObserver.
4. Также смотрите Мою заметку к моему ответу о том, как javascript обрабатывает функциональность воспроизведения / паузы для видео / аудио.
5. песочница работает! большое спасибо