モーダルのUIと、YouTube Player APIを掛け合わせて初回のみ表示させるスニペットを作ってみました。
用途としては、CMを初回アクセス時に再生するとかです。
モーダル自体、ユーザー本意のUIでないので気をつけて使う必要がありますが、初回で動画を見せる方法を検討している方は参考にしてもらえたら嬉しいです。
YouTube Player API
YouTube Player APIは、YouTubeの動画を埋め込むことができるAPIです。
APIを使わない場合、HTMLの iframe で埋め込むことができますが、APIはJavaScriptで提供されており、再生や停止の挙動や、再生条件の設定が色々できたりと応用が効くので、非常に便利です。
APIの詳細は以下の公式ガイドがあるので、参考にしてみてください。
外部リンク iframe 組み込みの YouTube Player API リファレンス
初回アクセス時にYouTube動画をモーダルで再生するサンプル
早速サンプルです。この記事の初回アクセス時にモーダルが表示され、そのモーダルにミュートの状態でYouTubeの動画が再生されます。
モーダルの表示後は、モーダル背景にある薄黒いオーバーレイか、「✖️」ボタンをクリックすることで、モーダルが非表示になります。また、非表示になるのと同時に、それまで再生されていたYouTube動画も一時停止します。
再生されるYouTubeの動画は、ミュートで始まってから再度までいくとループ再生されるように設定しています。
この辺の動画の設定は、YouTube APIで好みの設定が可能です。
実装の手順と方法
各コードの解説の前に、実装の手順と方法について簡単にご説明します。
はじめに、設置したい場所にHTMLを記述していきますが、コードは2つです。
まずは、「YouTubeのモーダル」のコードを任意の場所に記述します。記述する場所はどこでもOKですが、HTMLの構造的には main
タグの冒頭の方が良いと思います。
<div class="popup" id="firstTimeModal">
<div class="popup-inner">
<div class="modalCloseButton" id="modalCloseCloss"><span class="lineClose"></span></div>
<div id="movie2"></div>
</div>
<div class="black-background" id="js-black-bg"></div>
</div>
モーダルの記述が完了したら、モーダルを閉じた後にまた再表示するボタンのコードを設置します。
<button id="modalView">モーダルを表示</button>
任意の再表示をさせない場合は、「ボタンのコード」の記述は不要です。
HTMLの記述が終わったら、JavaScriptのコードを記述します。
まずは、初回アクセス時にYouTubeのモーダルが開くコードを記述します。場所はどこでもOKですが、以下のコードを<body>〜</body>
の中このコードも、</body>
の閉じタグ(クロージングタグ)の前に記述しましょう。
// YouTube API
var tag = document.createElement('script');
tag.src = "//www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
var movieId = 'QdmVFlmbIy8';//youtubeの動画のID。再生したい動画のIDを入力。
player = new YT.Player('movie2', {
/*
playerVarsで細かい設定ができます。
コメントはどんな設定をしているか書いているだけです。
*/
playerVars:{
playsinline: 1,
autoplay: 1, // 自動再生
loop: 1, // ループ有効
listType: 'playlist', //リスト再生(ループ再生に必要)
playlist: movieId, // 再生する動画リスト(ループ再生に必要)
controls: 1, // コントロールバー非表示
enablejsapi: 1, //JavaScript API 有効
modestbranding:1,//yutubeロゴの非表示
iv_load_policy: 3, //動画アノテーションを表示しない
disablekb:1, //キーボード操作OFF
showinfo:0, //動画の再生が始まる前に動画のタイトルなどの情報を表示しない
rel:0, //再生終了時に関連動画を表示しない
},
videoId: movieId,
events: {
'onReady': onPlayerReady,//動画の準備ができたらonPlayerReadyを実行
'onStateChange': onPlayerStateChange,
}
});
}
function onPlayerReady(e) {
e.target.mute();//音声ミュート
e.target.playVideo();//動画スタート(SP用)
}
function onPlayerStateChange(e){
if(e.data == 1){
document.getElementById('cover').style.opacity = 1;//動画の再生が始まったら表示
}
}
// 初回モーダル
const keyName = 'viewed';
const keyValue = true;
if (!sessionStorage.getItem(keyName)) {
sessionStorage.setItem(keyName, keyValue);
console.log("初回の閲覧");
window.onload = function() {
var popup = document.getElementById('firstTimeModal');
if(!popup) return;
popup.classList.add('is-show');
var blackBg = document.getElementById('js-black-bg');
var closeBtn = document.getElementById('modalCloseCloss');
var ytplayer = document.getElementById('movie2');
closePopUp(blackBg);
closePopUp(closeBtn);
function closePopUp(elem) {
if(!elem) return;
elem.addEventListener('click', function() {
popup.classList.remove('is-show');
player.pauseVideo(); //一時停止
})
}
}
} else {
console.log("2回目以降の閲覧");
}
次に、モーダルを際表示させるボタンを置きたい場合、以下のコードをページに記述します。
このコードも、</body>
の閉じタグ(クロージングタグ)の前に記述しましょう。
document.getElementById('modalView').addEventListener('click', () => {
const modalbtn = document.getElementById('firstTimeModal');
player.playVideo();
modalbtn.classList.add('is-show');
var blackBg = document.getElementById('js-black-bg');
var closeBtn = document.getElementById('modalCloseCloss');
var ytplayer = document.getElementById('movie2');
closePopUp(blackBg);
closePopUp(closeBtn);
function closePopUp(elem) {
if(!elem) return;
elem.addEventListener('click', function() {
modalbtn.classList.remove('is-show');
player.pauseVideo();
})
}
});
最後に、見た目を整える為CSSを記述します。
.popup {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 9999;
opacity: 0;
visibility: hidden;
transition: .6s;
}
.popup.is-show {
opacity: 1;
visibility: visible;
}
.popup-inner {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
width: 80%;
max-width: 600px;
background-color: #000;
z-index: 2;
border-radius: 3px;
}
.popup-inner img {
width: 100%;
border-radius: 3px 3px 0 0;
}
div#modalCloseCloss:hover {
opacity: 0.7;
}
.modalCloseButton {
position: absolute;
left: 92%;
top: -48px;
width: 50px;
height: 50px;
line-height: 50px;
text-align: center;
cursor: pointer;
}
.lineClose {
display: inline-block;
vertical-align: middle;
color: #FFF;
line-height: 1;
width: 2rem;
height: 0.2rem;
background: currentColor;
border-radius: 0.1rem;
position: relative;
transform: rotate(45deg);
}
.lineClose::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: inherit;
border-radius: inherit;
transform: rotate(90deg);
}
.black-background {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,.6);
z-index: 1;
cursor: pointer;
}
.modalBottom {
padding: 22px 30px;
}
.modalBottom p {
margin: 0;
}
これで完成です。
ざっくりとしたコードの解説
コードはHTML・JavaScript・CSSの3種類です。コードについて解説していきます。
HTML
まずはじめに、2種類あるHTMLのコードについて解説します。
YouTubeの動画が表示されるモーダルは、以下のようなコードになっています。
<div class="popup" id="firstTimeModal">
<div class="popup-inner">
<div class="modalCloseButton" id="modalCloseCloss"><span class="lineClose"></span></div>
<div id="movie2"></div>
</div>
<div class="black-background" id="js-black-bg"></div>
</div>
<div id="movie2"></div>
が、YouTube APIで動画を出力させる要素です。この要素がないか、もしくは要素のid名がJavaScriptのコードと一致しないと、動画が表示されないので注意するようにしましょう。
ボタンは、これだけのコードでOKです。「modalView」のid名がついた button
タグが、後述のJavaScriptのクリックイベントで連動します。
<button id="modalView">モーダルを表示</button>
なので、「modalView」のid名を変更する場合、それに応じてJavaScriptの冒頭にある .getElementById('modalView')
のid名も変更するようにしてください。
JavaScript
続いてJavaScriptのコードについてです。JavaScriptのコードも2種類あるので、順に解説していきます。
初回アクセス時のモーダルのコード量は多めです。というのも、YouTube APIのコードが割合を占めていますが、ここの記述で、動画の細かい設定を行います。
// YouTube API
var tag = document.createElement('script');
tag.src = "//www.youtube.com/iframe_api";
var firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
var player;
function onYouTubeIframeAPIReady() {
var movieId = 'QdmVFlmbIy8';//youtubeの動画のID。再生したい動画のIDを入力。
player = new YT.Player('movie2', {
/*
playerVarsで細かい設定ができます。
コメントはどんな設定をしているか書いているだけです。
*/
playerVars:{
playsinline: 1,
autoplay: 1, // 自動再生
loop: 1, // ループ有効
listType: 'playlist', //リスト再生(ループ再生に必要)
playlist: movieId, // 再生する動画リスト(ループ再生に必要)
controls: 1, // コントロールバー非表示
enablejsapi: 1, //JavaScript API 有効
modestbranding:1,//yutubeロゴの非表示
iv_load_policy: 3, //動画アノテーションを表示しない
disablekb:1, //キーボード操作OFF
showinfo:0, //動画の再生が始まる前に動画のタイトルなどの情報を表示しない
rel:0, //再生終了時に関連動画を表示しない
},
videoId: movieId,
events: {
'onReady': onPlayerReady,//動画の準備ができたらonPlayerReadyを実行
'onStateChange': onPlayerStateChange,
}
});
}
function onPlayerReady(e) {
e.target.mute();//音声ミュート
e.target.playVideo();//動画スタート(SP用)
}
function onPlayerStateChange(e){
if(e.data == 1){
document.getElementById('cover').style.opacity = 1;//動画の再生が始まったら表示
}
}
// 初回モーダル
const keyName = 'viewed';
const keyValue = true;
if (!sessionStorage.getItem(keyName)) {
sessionStorage.setItem(keyName, keyValue);
console.log("初回の閲覧");
window.onload = function() {
var popup = document.getElementById('firstTimeModal');
if(!popup) return;
popup.classList.add('is-show');
var blackBg = document.getElementById('js-black-bg');
var closeBtn = document.getElementById('modalCloseCloss');
var ytplayer = document.getElementById('movie2');
closePopUp(blackBg);
closePopUp(closeBtn);
function closePopUp(elem) {
if(!elem) return;
elem.addEventListener('click', function() {
popup.classList.remove('is-show');
player.pauseVideo(); //一時停止
})
}
}
} else {
console.log("2回目以降の閲覧");
}
細かい設定はスニペットに直接コメントアウトで記述していますが、このように好みの設定ができるので必要に応じて記述内容を変えるようにしましょう。
そして、初回アクセスは、 セッション情報にアクセスする sessionStorage
のプロパティでの条件分岐を行い、動作を分けています。
モーダルを再表示させるコードは、HTMLで設置した button
タグがトリガーになってモーダルが表示されます。
その時使うのが、定番の .addEventListener
クリックイベントで記述して、表示されたモーダルの非表示の時の動作もコードに記述します。
document.getElementById('modalView').addEventListener('click', () => {
const modalbtn = document.getElementById('firstTimeModal');
player.playVideo();
modalbtn.classList.add('is-show');
var blackBg = document.getElementById('js-black-bg');
var closeBtn = document.getElementById('modalCloseCloss');
var ytplayer = document.getElementById('movie2');
closePopUp(blackBg);
closePopUp(closeBtn);
function closePopUp(elem) {
if(!elem) return;
elem.addEventListener('click', function() {
modalbtn.classList.remove('is-show');
player.pauseVideo();
})
}
});
YouTube Player APIには、独自で便利な関数があり、それらの記述で iframe
内のYouTube動画を操作することができます。
以下3つは、動画の再生を操作する関数で、この記事のコードでも使用しています。
関数 | 動作 |
---|---|
player.playVideo(); | 動画を再生 |
player.pauseVideo(); | 動画を一時停止 |
player.stopVideo(); | 動画を停止 |
これ以外にも関数は色々あるので、チェックしてみてください。
CSS
最後にCSSです。モーダルの見た目を整える記述内容です。
.popup {
position: fixed;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 9999;
opacity: 0;
visibility: hidden;
transition: .6s;
}
.popup.is-show {
opacity: 1;
visibility: visible;
}
.popup-inner {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
width: 80%;
max-width: 600px;
background-color: #000;
z-index: 2;
border-radius: 3px;
}
.popup-inner img {
width: 100%;
border-radius: 3px 3px 0 0;
}
div#modalCloseCloss:hover {
opacity: 0.7;
}
.modalCloseButton {
position: absolute;
left: 92%;
top: -48px;
width: 50px;
height: 50px;
line-height: 50px;
text-align: center;
cursor: pointer;
}
.lineClose {
display: inline-block;
vertical-align: middle;
color: #FFF;
line-height: 1;
width: 2rem;
height: 0.2rem;
background: currentColor;
border-radius: 0.1rem;
position: relative;
transform: rotate(45deg);
}
.lineClose::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: inherit;
border-radius: inherit;
transform: rotate(90deg);
}
.black-background {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,.6);
z-index: 1;
cursor: pointer;
}
.modalBottom {
padding: 22px 30px;
}
.modalBottom p {
margin: 0;
}
さいごに
このコードは、別記事の初回アクセスでモーダルを表示させるスニペットと、YouTube APIを組み合わせて作ったスニペットです。
このように掛け合わせてコードを作ると色々できるので、以下の記事もあわせて参考にしてみてください。
JavaScriptのsessionStorageでそのページへ初回アクセス時にモーダルを表示