Писал недавно подобное с ресайзом при изменении разрешения, в проекте используется jquery, но в основном для селекторов и слушания событий, можно легко поменять на ванильный.
YouTube.js:
export default class YouTube {
states = Object.freeze({
INIT: 'INIT',
PLAY: 'PLAY',
PAUSE: 'PAUSE',
});
constructor({container, videoId}) {
this.container = container;
this.videoId = videoId;
this.isPlayerReady = false;
this.initState = this.states.INIT;
this.resizeTimeout = null;
this.resizeTimeoutDelay = 500;
YouTube.addScript();
YouTube.onYouTubeIframeAPIReady(() => {
this.player = this.getPlayer();
});
$(window).on('resize', () => {
clearTimeout(this.resizeTimeout);
this.resizeTimeout = setTimeout(() => {
this.setDimensions();
}, this.resizeTimeoutDelay);
});
}
setDimensions() {
$.getJSON(`https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=${this.videoId}&format=json`,
({width, height}) => {
const elm = $(this.player.getIframe());
const elmWidth = elm.width();
const elmHeight = height * elmWidth / width;
elm.height(Math.floor(elmHeight));
});
}
isPauseState() {
return this.states.PAUSE === this.initState;
}
isPlayState() {
return this.states.PLAY === this.initState;
}
onPlayerReady() {
this.isPlayerReady = true;
if (this.isPauseState())
this.pause();
else if (this.isPlayState())
this.play();
this.setDimensions();
}
play() {
if (this.isPlayerReady)
this.player.playVideo();
this.initState = this.states.PLAY;
};
pause() {
if (this.isPlayerReady)
this.player.pauseVideo();
this.initState = this.states.PAUSE;
};
getPlayer() {
return new YT.Player(this.container, {
videoId: this.videoId,
width: 945,
events: {
'onReady': this.onPlayerReady.bind(this),
}
});
}
static onYouTubeIframeAPIReady(fn) {
if (!window.hasOwnProperty('onYouTubeIframeAPIReadyEvents') && !Array.isArray(window.onYouTubeIframeAPIReadyEvents))
window.onYouTubeIframeAPIReadyEvents = [];
if (!window.hasOwnProperty('onYouTubeIframeAPIReady') || !window.onYouTubeIframeAPIReady) {
window.onYouTubeIframeAPIReady = function () {
for (let i = 0; i < window.onYouTubeIframeAPIReadyEvents.length; i++)
window.onYouTubeIframeAPIReadyEvents[i]();
};
}
window.onYouTubeIframeAPIReadyEvents.push(fn);
}
static addScript() {
if (!YouTube.isScriptAdded()) {
const tag = document.createElement('script');
tag.src = 'https://www.youtube.com/iframe_api';
const firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
window.youTubeScriptAdded = true;
}
}
static isScriptAdded() {
return window.hasOwnProperty('youTubeScriptAdded') && window.youTubeScriptAdded;
}
}
место где надо вешать эвенты на кнопку:
import YouTube from '../../../utils/YouTube';
$(window).on('load', () => {
const video = $('.video-js');
const playButton = $('.video_button-js');
const youTube = new YouTube({
container: video.get(0),
videoId: 'ТУТ ВИДЕО ID', // обычно get параметр в ссылке на видео "v=ВИДЕО_ID'"
});
playButton .on('click', () => {
youTube.play();
// youTube.pause();
});
});
место где должно быть видео:
<div class="video-js"></div>
<div class="video_button-js">Play</div>