We are going to write a plugin which shows youtube videos using videojs inside a fancybox popup. You will need
- jQuery
- Fancybox
- VideoJS
- VodeJS Youtube
VideoJS:
//cdnjs.cloudflare.com/ajax/libs/video.js/5.8.0/alt/video-js-cdn.min.css //cdnjs.cloudflare.com/ajax/libs/video.js/5.8.0/video.min.js //cdnjs.cloudflare.com/ajax/libs/videojs-youtube/2.0.8/Youtube.min.js
Fancybox:
//cdnjs.cloudflare.com/ajax/libs/fancybox/2.1.5/jquery.fancybox.min.js
Scriptjs
npm install --save-dev scriptjs
The whole code is
$(() => { const $videoLinks = $('.video-item-link'); if ($videoLinks.length) { const fancyboxConfig = { closeBtn: false, padding: 0, margin: [20, 60, 20, 60], // Increase left/right margin width: '100%', height: '100%', helpers: { overlay: { background: 'rgba(0, 0, 0, 0.9)' } } }; $videoLinks.click((e) => { e.preventDefault(); const $this = $(e.currentTarget); const w = $this.data('width'); const h = $this.data('height'); const videoId = $this.data('id'); const url = $this.attr('href'); $.fancybox.open($.extend(fancyboxConfig, { content: ` <video id="${videoId}" class="video-js vjs-default-skin" controls preload="auto" width="${w}" height="${h}" data-setup='{ "controls": true, "autoplay": true, "preload": "auto", "techOrder": ["youtube"] }'> <source src="${url}" type='video/youtube'> </video> `, afterShow: () => { // do this for the dynamically loaded video const player = window.videojs(`${videoId}`, {}); player.on('ended', () => { $.fancybox.close(true); }); }, beforeClose: () => { // if you do not do this the video will keep downloading in the background window.videojs(`${videoId}`).dispose(); } })); }); } });