Этого можно добиться с помощью API iFrame YouTube:
https://developers.google.com/youtube/iframe_api_reference
Этот API-интерфейс становится доступным, когда вы добавляете enablejsapi=1
к URL-адресам вставок видео YouTube.
Чтобы получить доступ к элементам управления для остановки видео, для каждого видео необходимо получить доступ к экземпляру YT.Player
.Для каждого iFrame я создал экземпляр YT.Player
и прикрепил его непосредственно к объекту slide
в качестве параметра с именем video
.
(обратите внимание, что многие разработчики говорят, что вы не должны прикреплять данные напрямуюдля объектов DOM, но я сделал это здесь, потому что это позволило мне более точно соответствовать вашему исходному коду.)
YT.Player
можно получить через специальную функцию, которая должна называться onYouTubeIframeAPIReady
, которую я мог толькоприступить к работе, если он был вне из $(document).ready
.
Я не могу поместить свое решение в JSFiddle, потому что iFrames не играют хорошо, поэтому вот моя реализация на GitHub:
http://robertakarobin.github.io/jquery-video-slider https://github.com/robertakarobin/jquery-video-slider
Вот соответствующие биты:
HTML:
<div class="video-slider">
<!-- SLIDE 1 -->
<div class="slide">
<iframe class="video" src="https://www.youtube.com/embed/YE7VzlLtp-4?ecver=2&enablejsapi=1"></iframe>
</div>
<!-- SLIDE 2 -->
<div class="slide">
<iframe class="video" src="https://www.youtube.com/embed/YE7VzlLtp-4?ecver=2&enablejsapi=1"></iframe>
</div>
<!-- END OF SLIDES -->
<div class="slide-arrow left"></div>
<div class="slide-arrow right"></div>
</div>
JavaScript:
$(document).ready(function () {
var pos = 0,
slides = $('.slide'),
numOfSlides = slides.length;
function nextSlide() {
// `[]` returns a vanilla DOM object from a jQuery object/collection
slides[pos].video.stopVideo()
slides.eq(pos).animate({ left: '-100%' }, 500);
pos = (pos >= numOfSlides - 1 ? 0 : ++pos);
slides.eq(pos).css({ left: '100%' }).animate({ left: 0 }, 500);
}
function previousSlide() {
slides[pos].video.stopVideo()
slides.eq(pos).animate({ left: '100%' }, 500);
pos = (pos == 0 ? numOfSlides - 1 : --pos);
slides.eq(pos).css({ left: '-100%' }).animate({ left: 0 }, 500);
}
$('.left').click(previousSlide);
$('.right').click(nextSlide);
})
function onYouTubeIframeAPIReady() {
$('.slide').each(function (index, slide) {
// Get the `.video` element inside each `.slide`
var iframe = $(slide).find('.video')[0]
// Create a new YT.Player from the iFrame, and store it on the `.slide` DOM object
slide.video = new YT.Player(iframe)
})
}