埋め込まれたYouTubeの前面に要素を重ねて、その要素がクリックされたらJavaScriptでYouTubeを再生させるという処理を実装しようとしていたのですが、iOSだとうまく再生できないようだったのでいくつか試してみました。
サンプルコード
(1)通常の埋め込み、(2)自動再生処理を追加しているパターン、(3)YouTubeの前にレイヤーを重ねたパターン、(4)再生ボタンを配置したパターンの4種類を試してみます。
HTML
sample01~sample04にYouTubeが埋め込まれます。
<div class="yt-wrap"> <p>通常の埋め込み</p> <div class="yt-inner"> <div id="sample01"></div> </div> </div> <div class="yt-wrap"> <p>自動再生処理を追加しているパターン</p> <div class="yt-inner"> <div id="sample02"></div> </div> </div> <div class="yt-wrap"> <p>YouTubeの前にレイヤーを重ねたパターン</p> <div class="yt-inner"> <div id="sample03"></div> <div id="sample03-layer"></div> </div> </div> <div class="yt-wrap"> <p>再生ボタンを配置したパターン</p> <div class="yt-inner"> <div id="sample04"></div> </div> <div class="yt-control"> <button id="sample04-play">再生</button> </div> </div>
CSS
YouTubeの前にレイヤーを重ねたパターンでは、YouTubeと同じサイズの要素を前面に重ねるようにします。
#sample03-layer {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
box-sizing: border-box;
border: #ff0000 10px solid;
cursor: pointer;
}
JavaScript
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 ytPlayer = [];
// プレーヤーのサイズ
var ytWidth = 640;
var ytHeight = 390;
// 各動画情報
var ytData = [
{
id: 'O_Qr4gdLyRc',
area: 'sample01'
}, {
id: 'eQ-N5rFuM5g',
area: 'sample02'
}, {
id: '1f90nLaHW8U',
area: 'sample03'
}, {
id: 'y-1iyViZJwo',
area: 'sample04'
}
];
// 各プレーヤーの埋め込み
function onYouTubeIframeAPIReady() {
for(var i = 0; i < ytData.length; i++) {
ytPlayer[i] = new YT.Player(ytData[i]['area'], {
width: ytWidth,
height: ytHeight,
videoId: ytData[i]['id'],
playerVars: {
rel: 0
},
events: {
'onReady': onPlayerReady
}
});
}
}
// 各プレーヤー準備完了後の処理
function onPlayerReady(e) {
// 自動再生のパターンだけ再生開始
if(e.target.getIframe().id == ytData[1]['area']) {
ytPlayer[1].playVideo();
}
}
// レイヤークリックで再生
document.getElementById('sample03-layer').addEventListener('click', function() {
ytPlayer[2].playVideo();
});
// ボタンクリックで再生
document.getElementById('sample04-play').addEventListener('click', function() {
ytPlayer[3].playVideo();
});
iOSでJavaScriptからのYouTubeの再生ができるかどうかのデモページ
結果
iOS6.1.6と8.4.1で確認しました。
通常の埋め込み
iOS6、iOS8ともに再生されました。
自動再生処理を追加しているパターン
iOS6ではローディングがずっと表示されたままで自動再生されませんでした。
YouTubeをタップすると再生はできましたが、ローディングの出ているYouTubeの中央あたりをタップしても反応しませんでした。
iOS8では「すぐに再生が開始しない場合は、端末を再起動してください。」と表示され、自動再生されませんでした。
YouTubeをタップすると再生はできました。
YouTubeの前にレイヤーを重ねたパターン
iOS6ではレイヤーをタップしても何も反応しませんでした。
iOS8ではレイヤーをタップすると、「すぐに再生が開始しない場合は、端末を再起動してください。」と表示され、再生できませんでした。
再生ボタンを配置したパターン
iOS6ではボタンをタップするとローディングがずっと表示されたままになり、再生できませんでいた。
その状態でYouTubeをタップすると再生できました。
YouTubeをタップして1回再生した後だと、ボタンのタップでも再生ができるようになりました。
iOS8ではボタンをタップすると、「すぐに再生が開始しない場合は、端末を再起動してください。」と表示され、再生できませんでした。
自動再生のパターンと同じく、その状態でYouTubeをタップすると再生できました。
YouTubeをタップして1回再生した後だと、ボタンのタップでも再生ができるようになりました。
iOSのバージョンによって少し挙動が違っていたりするようなので、注意が必要です。
【参考サイト】
コメントが承認されるまで時間がかかります。