Youtube の映像をプラグインを使わずに Lightbox のようなモーダルウィンドウで表示しようと試した際の失敗例。結果的にはプラグインを使用することにしたが、後日何か別の方法が見つかればその際の参考にするためのメモ。
Firefox では問題なく表示・再生できたが、それ以外のブラウザでは以下のような問題が発生。
いろいろと試したところ、iframe を remove() することで音が止まるようになった。但し、一時停止(ポーズ)ボタンをクリックしても映像は止まるが音が止まらないのは、未解決。モーダルウィンドウを閉じると音も止まるが。。。
実用的ではないので、プラグインを探してみたらいいものが見つかったのでそれを使用。
関連ページ:「Magnific Popup を使って見る」
画像をクリックすると、Youtube を表示するようにする。
HTML
<div class="video_image">
<img src="images/jimpat.jpg" alt="Youtube">
<div class="video_info">
<span class="video_src">//www.youtube.com/embed/wuaD9yG4Fdw</span>
</div><!--end of .video_info-->
</div><!--end of .video_image-->
<div class="video_image">
<img src="images/wes.jpg" alt="Youtube">
<div class="video_info">
<span class="video_src">//www.youtube.com/embed/hLWlqBH9nrU</span>
</div><!--end of .video_info-->
</div><!--end of .video_image-->
<div id="top_video" >
<div class="youtube">
<iframe id="player" src="" frameborder="0" allowfullscreen></iframe>
</div><!--end of .youtube-->
<div id="close_link">
<p><a href="#"> 閉じる </a></p>
</div><!--end of #video_link-->
</div><!--end of #top_video-->
iframe はブラウザのサイズにより可変に。
CSS
#graylayer {
display: none;
position: fixed;
left: 0;
top: 0;
height: 100%;
width: 100%;
background: #666;
filter:alpha(opacity=75);
opacity: 0.75;
z-index: 200;
}
* html #graylayer {
position: absolute;
}
#overlayer {
display: none;
width: 80%;
background: #111;
padding: 1em;
border: 2px solid #CCC;
position: fixed;
top: 50%;
left: 50%;
z-index: 300;
height: 90%;
overflow: scroll;
}
* html #overlayer {
position: absolute;
}
#overlayer button.close {
position: absolute;
top: 10px;
right: 10px;
}
.youtube {
position: relative;
padding-bottom: 56.25%;
padding-top: 60px;
height: 0;
overflow: hidden;
margin-top: 3.25%;
margin-bottom: 3.25%;
}
#top_video{
display: none;
}
.youtube iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
#top_video .youtube iframe {
max-width: 600px;
max-height: 450px;
}
jQuery
jQuery(function($){
$('body').append('<div id="graylayer"></div><div id="overlayer"></div>');
function lightBox(target) {
$('#overlayer').data('scroll_top', $(window).scrollTop());
$('#graylayer').fadeIn();
$('#overlayer').fadeIn().html(target).css({
marginTop: "-" + $('#overlayer').height()/2 + "px",
marginLeft: "-" + $('#overlayer').width()/2 + "px"
});
}
$('#graylayer').click(function(){
$(this).fadeOut();
$('#overlayer').fadeOut();
});
$(document).on('click', '#close_link a', function() {
$('#graylayer').fadeOut();
$('#overlayer').fadeOut();
return false;
});
$('.video_image img').click(function(){
$('.youtube iframe').attr('src', $.trim($(this).closest('.video_image').find('.video_info span.video_src').text()) + '?autoplay=1&rel=0');
lightBox($('#top_video').html());
return false;
});
});
モーダルウィンドウを表示する度に、iframe を追加し、閉じる際に削除するようにしてみる。そのため HTML では、iframe の部分を削除して jQuery で追加・削除するようにする。
これで閉じる際には、音も消えるようになったが、Chrome や Safari では「停止ボタン」をクリックしても、音が止まらないのは解決できていない。(実用的には無理)
HTML
<div id="top_video" >
<div class="youtube">
<!-- 削除 <iframe id="player" src="" frameborder="0" allowfullscreen></iframe>-->
</div><!--end of .youtube-->
<div id="close_link">
<p><a href="#"> 閉じる </a></p>
</div><!--end of #video_link-->
</div><!--end of #top_video-->
jQuery では閉じるたびに、remove() する。但し、何故かはわからないが2回実行しないとうまく削除できない。
jQuery(function($){
$('body').append('<div id="graylayer"></div><div id="overlayer"></div>');
function lightBox(target) {
$('#overlayer').data('scroll_top', $(window).scrollTop());
$('#graylayer').fadeIn();
$('#overlayer').fadeIn().html(target).css({
marginTop: "-" + $('#overlayer').height()/2 + "px",
marginLeft: "-" + $('#overlayer').width()/2 + "px"
});
}
$('#graylayer').click(function(){
if($('#player').length > 0){
// iframe を削除(2回)
$('#player').remove();
$('#player').remove();
}
$(this).fadeOut();
$('#overlayer').fadeOut();
});
$(document).on('click', '#close_link a', function() {
if($('#player').length > 0){
// iframe を削除(2回)
$('#player').remove();
$('#player').remove();
}
$('#graylayer').fadeOut();
$('#overlayer').fadeOut();
return false;
});
$('.video_image img').click(function(){
// iframe を追加
$('#top_video .youtube').prepend('<iframe id="player" src="" frameborder="0" allowfullscreen></iframe>');
$('.youtube iframe').attr('src', $.trim($(this).closest('.video_image').find('.video_info span.video_src').text()) + '?autoplay=1&rel=0');
lightBox($('#top_video').html());
return false;
});
});
IFrame player API を使って何とかならないかと試したが、いい方法が見つからなかった。
以下は IFrame player API を使って通常に Youtube を表示して、独自の「停止ボタン」を追加した例。
HTML
<div id="player"></div> <p><a id="stop" href="#">Stop</a></p>
jQuery
var player;
var stopBtn = $('#stop');
//IFrame player API を使うための JavaScript の読み込み
var scriptTag = document.createElement('script');
scriptTag.src = "https://www.youtube.com/player_api";
var fsTag = document.getElementsByTagName('script')[0];
fsTag.parentNode.insertBefore(scriptTag, fsTag);
var vid = 'wuaD9yG4Fdw';
// API のスクリプトが読み込まれたら <iframe> (and YouTube player) を作成する function
function onYouTubePlayerAPIReady() {
player = new YT.Player('player', {
height: '390',
width: '640',
videoId: vid,
playerVars: {
autohide: 2, //コントローラーを常に表示
controls: 1, //コントローラーを表示(デフォルト)
autoplay: 1, //自動再生する
rel: 0 //再生終了後に関連動画を表示しない
}
});
stopBtn.click(function(){
player.stopVideo();
});
}