<div class="get-started-video" data-behavior="get-started-video" data-video-type="youtube" data-video-id="R7qSx1Zb-NQ">
<div class="get-started-video__player-wrap">
<div id=intro class="get-start-video"></div>
</div>
<div class="get-started-video__control-overlay">
<a class="full-screen" href="#" role="full screen" aria-label="video full screen" tabindex="0"></a>
<a class="close-video" href="#" role="close video" aria-label="video close" tabindex="0"></a>
<div class="play-pause-controls">
<a class="play-pause-controls__play hidden" role="video play" aria-label="video play button" tabindex="0" aria-selected="true"></a>
<a class="play-pause-controls__pause" role="video pause button" aria-label="video pause button" tabindex="0" aria-selected="true"></a>
</div>
</div>
</div>
No notes defined.
{
"videoId": "R7qSx1Zb-NQ",
"type": "youtube",
"id": "intro"
}
import Player from '@vimeo/player';
import { loadYouTubeApi } from '../video/video';
export default parentElement => {
const { videoId, videoType } = parentElement.dataset;
const videoPlayerId = parentElement
.querySelector('.get-start-video')
.getAttribute('id');
const videoControls = parentElement.querySelector(
'.get-started-video__control-overlay'
);
const playVideoCta = document.querySelector('.play-video');
const closeVideo = parentElement.querySelector('.close-video');
const playButton = parentElement.querySelector('.play-pause-controls__play');
const pauseButton = parentElement.querySelector(
'.play-pause-controls__pause'
);
const fullscreenVideo = parentElement.querySelector('.full-screen');
// eslint-disable-next-line no-unused-vars
let videoPlayer;
if (!videoId) {
return;
}
const onPlayerError = () => {
parentElement.classList.remove('video-player-loaded');
};
const onPlayerStateChange = event => {
if (event.data === window.YT.PlayerState.ENDED) {
videoPlayer.playVideo();
}
};
const onPlayerReady = () => {
// To capture error on video
if (videoType === 'youtube') {
videoPlayer.pauseVideo();
videoPlayer.mute();
} else {
videoPlayer.pause();
videoPlayer.setMuted(1);
}
parentElement.classList.add('video-player-loaded');
};
if (playVideoCta) {
playVideoCta.addEventListener('click', () => {
if (videoType === 'youtube') {
videoPlayer.playVideo();
videoPlayer.unMute();
} else {
videoPlayer.play();
videoPlayer.setMuted(0);
}
});
}
closeVideo.addEventListener('click', e => {
e.preventDefault();
if (videoType === 'youtube') {
videoPlayer.pauseVideo();
videoPlayer.mute();
} else {
videoPlayer.pause();
videoPlayer.setMuted(1);
}
});
const initVideo = () => {
videoPlayer = new window.YT.Player(videoPlayerId, {
height: '100%',
width: '100%',
videoId,
playerVars: {
playsinline: 1,
controls: 0,
},
events: {
onReady: onPlayerReady,
onError: onPlayerError,
onStateChange: onPlayerStateChange,
},
});
};
if (videoType === 'youtube') {
if (
window.YouTubeIframeApiReady === undefined ||
window.YouTubeIframeApiReady === false
) {
loadYouTubeApi();
window.onYouTubeIframeAPIReady = () => {
window.YouTubeIframeApiReady = true;
initVideo();
};
} else {
initVideo();
}
} else {
// eslint-disable-next-line no-undef
videoPlayer = new Player(videoPlayerId, {
id: videoId,
muted: 1,
title: 0,
sidedock: 0,
controls: 0,
quality: 'auto',
width: '100%',
height: '100%',
});
videoPlayer
.play()
.then(() => {
parentElement.classList.add('video-player-loaded');
})
.catch(error => {
// eslint-disable-next-line no-console
console.log(error);
});
videoPlayer.on('loaded', () => {
// eslint-disable-next-line no-console
console.log('vimeo loaded');
parentElement.classList.add('video-player-loaded');
});
}
parentElement.addEventListener('mouseover', () => {
videoControls.style.opacity = '1';
});
parentElement.addEventListener('mouseleave', () => {
videoControls.style.opacity = '0';
});
playButton.addEventListener('click', () => {
if (videoType === 'youtube') {
videoPlayer.playVideo();
} else {
videoPlayer.play();
}
playButton.classList.toggle('hidden');
pauseButton.classList.toggle('hidden');
});
pauseButton.addEventListener('click', () => {
if (videoType === 'youtube') {
videoPlayer.pauseVideo();
} else {
videoPlayer.pause();
}
playButton.classList.toggle('hidden');
pauseButton.classList.toggle('hidden');
});
fullscreenVideo.addEventListener('click', e => {
e.preventDefault();
const videoIframe = parentElement.querySelector(
'.get-started-video iframe'
);
if (videoIframe.requestFullscreen) {
videoIframe.requestFullscreen();
} else if (videoIframe.webkitRequestFullscreen) {
videoIframe.webkitRequestFullscreen();
} else if (videoIframe.msRequestFullscreen) {
videoIframe.msRequestFullscreen();
}
});
};
.get-started-video {
position: relative;
width: 100%;
max-width: 69.6rem;
height: 39.1rem;
&__player-wrap {
iframe {
width: 100%;
height: 100%;
position: absolute;
transform: translate(-50%, -50%);
top: 50%;
left: 50%;
pointer-events: none;
.player {
width: 100% !important;
height: 100% !important;
object-fit: cover !important;
}
}
}
&__control-overlay {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
opacity: 0;
transition: opacity 600ms ease-in-out;
.full-screen {
position: absolute;
top: 1.7rem;
left: 2.3rem;
background: url('./assets/images/video-fullscreen.svg') no-repeat center;
width: 1.8rem;
height: 1.8rem;
background-size: 100%;
}
.close-video {
position: absolute;
top: 1.1rem;
right: 1rem;
background: url('./assets/images/close-video.svg') no-repeat center;
width: 3.2rem;
height: 3.2rem;
background-size: 100%;
}
.play-pause-controls {
position: absolute;
cursor: pointer;
&__play {
display: inline-block;
background: url('./assets/images/video-play-btn.svg') no-repeat center;
width: 4rem;
height: 4rem;
background-size: 100%;
}
&__pause {
display: inline-block;
background: url('./assets/images/video-pause-btn.svg') no-repeat center;
width: 4rem;
height: 4rem;
background-size: 100%;
}
}
}
@media screen and (min-width: $mq-medium) {
&__control-overlay {
.full-screen {
top: 4.8rem;
left: 4.8rem;
width: 4rem;
height: 4rem;
}
.close-video {
top: 4.8rem;
right: 4.8rem;
width: 4.8rem;
height: 4.8rem;
}
.play-pause-controls {
&__play {
width: 7.2rem;
height: 7.2rem;
}
&__pause {
width: 7.2rem;
height: 7.2rem;
}
}
}
}
@media screen and (max-width: $mq-small) {
width: 34.2rem;
height: 19.2rem;
}
@media screen and (min-width: 1800px) {
max-width: 120.6rem;
height: 68.1rem;
}
}
<div class="get-started-video" data-behavior="get-started-video" data-video-type="{{type}}" data-video-id="{{videoId}}">
<div class="get-started-video__player-wrap">
<div id={{id}} class="get-start-video"></div>
</div>
<div class="get-started-video__control-overlay">
<a class="full-screen" href="#" role="full screen" aria-label="video full screen" tabindex="0"></a>
<a class="close-video" href="#" role="close video" aria-label="video close" tabindex="0"></a>
<div class="play-pause-controls">
<a class="play-pause-controls__play hidden" role="video play" aria-label="video play button" tabindex="0"
aria-selected="true"></a>
<a class="play-pause-controls__pause" role="video pause button" aria-label="video pause button"
tabindex="0" aria-selected="true"></a>
</div>
</div>
</div>