Возможно, вместо того, чтобы пытаться угадать состояние воспроизведения по тому, нажал ли пользователь на оверлей (что может привести к ошибкам, таким как нажатие на кнопку громкости или полноэкранную кнопку), вы можете использовать действительный официальный API iframe YouTube. . Он содержит множество функциональных возможностей, и, вероятно, вас больше всего интересует событие onStateChange . Прикрепляя его, вы можете надежно проверить, играет ли игрок или находится в режиме паузы (или в любом другом состоянии, например, «буферизация»). На основе документации API и ваших требований я создал codepen , который имеет наложение, которое меняется в зависимости от состояния воспроизведения.
PS. По какой-то причине во встроенном фрагменте stackoverflow возникают проблемы с встраиванием iframes youtube из-за ошибок Failed to execute ‘postMessage’ on ‘DOMWindow’
, но я все же выкладываю приведенный ниже код для полноты картины. Для ознакомления с рабочей версией см. Ссылку на код, указанный выше.
var tag = document.createElement('script');
tag.src = "https://www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
player = new YT.Player('player', {
height: '390',
width: '640',
videoId: 'M7lc1UVf-VE',
events: {
'onStateChange': onPlayerStateChange
}
});
}
let overlay = document.querySelector('.overlay');
function onPlayerStateChange(event) {
if (event.data == YT.PlayerState.PLAYING) {
overlay.classList.remove("paused");
overlay.classList.add("playing");
}
if (event.data == YT.PlayerState.PAUSED) {
overlay.classList.add("paused");
overlay.classList.remove("playing");
}
}
.wrapper {
position: relative;
display: inline-block;
}
.overlay {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
pointer-events:none;
}
.playing:before {
position: absolute;
content:"";
width: 100%;
height: 100%;
left: 0;
top: 0;
opacity: 0.3;
background-color: green;
}
.playing:after{
content: "playing";
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: white;
text-shadow: #000 0px 0px 1px, #000 0px 0px 1px, #000 0px 0px 1px,
#000 0px 0px 1px, #000 0px 0px 1px, #000 0px 0px 1px;
}
.paused:before {
position: absolute;
content: "";
width: 100%;
height: 100%;
left: 0;
top: 0;
opacity: 0.3;
background-color: orange;
}
.paused:after{
content: "paused";
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: white;
text-shadow: #000 0px 0px 1px, #000 0px 0px 1px, #000 0px 0px 1px,
#000 0px 0px 1px, #000 0px 0px 1px, #000 0px 0px 1px;
}
<div class="wrapper">
<div id="player"></div>
<div class="overlay"></div>
</div>
Обновление
В случае добавления iframe из CMS, вы все равно можете использовать методы API youtube и присоединить его к существующему элементу iframe, как показано в этом codepen . По сути, вы предоставляете только определение событий для конструктора YT.Player (вместо предоставления полного списка параметров videoID, height, width и т. Д.):
player = new YT.Player('player', {
events: {
'onStateChange': onPlayerStateChange
}
});