Библиотека fullPage.js предоставляет мощный инструментарий для создания полноэкранных прокручиваемых сайтов, а интеграция видео с платформ YouTube и Vimeo позволяет расширять визуальный опыт, делая страницы более динамичными и интерактивными. Рассмотрим основные подходы и нюансы работы с видео в fullPage.js.
Для начала необходимо добавить контейнеры для видео внутри секций fullPage.js. Простейший пример для YouTube:
<div id="fullpage">
<div class="section">
<div class="video-container">
<iframe src="https://www.youtube.com/embed/VIDEO_ID?enablejsapi=1" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
</div>
</div>
<div class="section">
<div class="video-container">
<iframe src="https://player.vimeo.com/video/VIDEO_ID?api=1&background=0" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe>
</div>
</div>
</div>
Ключевые моменты:
enablejsapi=1, который позволяет управлять видео через
API.api=1 и
background=0 обеспечивают возможность управления и
корректного отображения в секции.new fullpage('#fullpage', {
autoScrolling: true,
navigation: true,
onLeave: function(origin, destination, direction){
handleVideoPlayback(origin.index, destination.index);
}
});
Параметр onLeave используется для управления
воспроизведением видео при смене секций. Это предотвращает одновременное
воспроизведение нескольких роликов.
Для управления YouTube-видео необходимо подключить YouTube IFrame Player API:
<script src="https://www.youtube.com/iframe_api"></script>
Создание объекта плеера:
let players = [];
function onYouTubeIframeAPIReady() {
document.querySelectorAll('.video-container iframe').forEach((iframe, index) => {
players[index] = new YT.Player(iframe, {
events: {
'onReady': onPlayerReady
}
});
});
}
function onPlayerReady(event) {
event.target.pauseVideo();
}
function handleVideoPlayback(originIndex, destinationIndex) {
if(players[originIndex]) players[originIndex].pauseVideo();
if(players[destinationIndex]) players[destinationIndex].playVideo();
}
Особенности:
pauseVideo() останавливает воспроизведение при уходе с
секции.playVideo() запускает видео в активной секции.players позволяет масштабировать
решение для нескольких видео на странице.Для Vimeo используется Vimeo Player API:
<script src="https://player.vimeo.com/api/player.js"></script>
Инициализация и управление:
let vimeoPlayers = [];
document.querySelectorAll('.video-container iframe').forEach((iframe, index) => {
vimeoPlayers[index] = new Vimeo.Player(iframe);
vimeoPlayers[index].pause();
});
function handleVideoPlayback(originIndex, destinationIndex) {
if(vimeoPlayers[originIndex]) vimeoPlayers[originIndex].pause();
if(vimeoPlayers[destinationIndex]) vimeoPlayers[destinationIndex].play();
}
Отличия от YouTube:
Player для каждого
iframe.play() и pause() работают
асинхронно, возвращая промисы, что позволяет обрабатывать ошибки и
состояния воспроизведения.Для создания плавного опыта можно объединить оба API в одной функции:
function handleVideoPlayback(originIndex, destinationIndex) {
// YouTube
if(players[originIndex]) players[originIndex].pauseVideo();
if(players[destinationIndex]) players[destinationIndex].playVideo();
// Vimeo
if(vimeoPlayers[originIndex]) vimeoPlayers[originIndex].pause().catch(()=>{});
if(vimeoPlayers[destinationIndex]) vimeoPlayers[destinationIndex].play().catch(()=>{});
}
Важно: использовать .catch() для промисов Vimeo, чтобы
избежать ошибок при быстром переходе между секциями.
autoplay=1 в URL YouTube или autoplay=1 для
Vimeo.mute=1 помогает
избегать блокировки автозапуска в браузерах.Пример CSS для адаптивного видео:
.video-container {
position: relative;
width: 100%;
height: 100%;
overflow: hidden;
}
.video-container iframe {
position: absolute;
top: 50%;
left: 50%;
width: 177.77%; /* 16:9 ratio */
height: 100%;
transform: translate(-50%, -50%);
}
YouTube:
players[index] = new YT.Player(iframe, {
events: {
'onStateChange': function(event){
if(event.data === YT.PlayerState.ENDED){
console.log('Видео завершено');
}
}
}
});
Vimeo:
vimeoPlayers[index].on('ended', function() {
console.log('Видео завершено');
});
Эти события можно использовать для запуска анимаций, перехода к следующей секции или аналитики.
lazy loading для iframe через
loading="lazy".onLeave.Такой подход обеспечивает полностью интегрированное воспроизведение видео в полноэкранных сайтах с fullPage.js, позволяя создавать эффектные и интерактивные страницы с минимальными усилиями.