要素のフルスクリーンでの表示自体は以前記事を投稿していますが、フルスクリーン表示に合わせていろいろ対応をする機会があったので、その際に調べたことをメモしておきます。
対応ブラウザ
Full Screen APIの対応ブラウザはこちら
IEとSafariではベンダープレフィックスが必要で、スマホでも一部で対応していません。
サンプルコード
まずはフルスクリーンでの表示と、フルスクリーン画面内に解除するボタンを設置してみます。
<ul class="list"> <li class="item"> <img src="img/01s.jpg" class="thumb"> <div class="full"> <img src="img/01l.jpg"> <button class="full-close">close</button> </div> </li> 〜 略 〜 </ul>
.fullがフルスクリーン表示する要素でデフォルトはdisplay: none になっていて、.thumbをクリックすると.fullがフルスクリーンで表示される想定です。
次にCSSです。
.full {
display: none;
position: relative;
width: 100vw;
height: 100vh;
background: #000000;
}
.full:-webkit-full-screen {
display: block;
}
.full:fullscreen {
display: block;
}
.full img {
position: absolute;
top: 50%;
left: 50%;
width: auto;
max-width: 100%;
height: auto;
max-height: 100%;
transform: translate(-50%, -50%);
}
:fullscreenがフルスクリーン中の要素に適用されるスタイルになります。
8〜17行目は画像をフルスクリーンにした中央に配置する設定です。
最後にJavaScriptです。
// フルスクリーン表示のイベント設定
const thumbs = document.querySelectorAll('.thumb');
for (var i = 0; i < thumbs.length; i++) {
thumbs[i].addEventListener('click', function(e) {
show_fullscreen(this.nextElementSibling);
}, false);
}
// フルスクリーン解除のイベント設定
const close = document.querySelectorAll('.full-close');
for (var i = 0; i < close.length; i++) {
close[i].addEventListener('click', function(e) {
close_fullscreen(this.parentNode);
}, false);
}
// フルスクリーン表示する関数
function show_fullscreen(target) {
if(document.fullscreenEnabled) {
target.requestFullscreen();
} else if(document.webkitFullscreenEnabled) {
target.webkitRequestFullscreen();
} else {
alert('未対応です');
}
}
// フルスクリーンを解除する関数
function close_fullscreen(target) {
if(document.exitFullscreen) {
document.exitFullscreen();
} else if(document.webkitCancelFullScreen) {
document.webkitCancelFullScreen();
} else {
alert('未対応です');
}
}
17〜37行目でフルスクリーン表示・解除するための関数を用意して、それぞれ.thumbと.full-close のイベントに設定しています。
これでフルスクリーン表示の実装ができました。
フルスクリーン表示のデモページ
未対応端末の対応
先ほどの例では未対応ブラウザの場合はアラートを出すようにしていましたが、position: fixed を使って擬似的な全画面表示の形で対応してみます。
.full {
display: none;
position: relative;
width: 100vw;
height: 100vh;
background: #000000;
}
.full:-webkit-full-screen {
display: block;
}
.full:fullscreen {
display: block;
}
.full.is-fullscreen {
display: block;
position: fixed;
top: 0;
left: 0;
}
.full img {
position: absolute;
top: 50%;
left: 50%;
width: auto;
max-width: 100%;
height: auto;
max-height: 100%;
transform: translate(-50%, -50%);
}
未対応時にはフルスクリーン対象の要素にclassを追加・除去するようにします。
// フルスクリーン表示のイベント設定
const thumbs = document.querySelectorAll('.thumb');
for (var i = 0; i < thumbs.length; i++) {
thumbs[i].addEventListener('click', function(e) {
show_fullscreen(this.nextElementSibling);
}, false);
}
// フルスクリーン解除のイベント設定
const close = document.querySelectorAll('.full-close');
for (var i = 0; i < close.length; i++) {
close[i].addEventListener('click', function(e) {
close_fullscreen(this.parentNode);
}, false);
}
// フルスクリーン表示する関数
function show_fullscreen(target) {
if(document.fullscreenEnabled) {
target.requestFullscreen();
} else if(document.webkitFullscreenEnabled) {
target.webkitRequestFullscreen();
} else {
target.classList.add('is-fullscreen');
}
}
// フルスクリーンを解除する関数
function close_fullscreen(target) {
if(document.exitFullscreen) {
document.exitFullscreen();
} else if(document.webkitCancelFullScreen) {
document.webkitCancelFullScreen();
} else {
target.classList.remove('is-fullscreen');
}
}
フルスクリーン切り替え時のイベント
fullscreenchangeイベントでフルスクリーン切り替え時に発火、さらにdocument.fullscreenElement の値でフルスクリーンモードになったのか解除したのかの判別が行えます。
// フルスクリーン表示のイベント設定
const thumbs = document.querySelectorAll('.thumb');
for (var i = 0; i < thumbs.length; i++) {
thumbs[i].addEventListener('click', function(e) {
show_fullscreen(this.nextElementSibling);
}, false);
}
// フルスクリーン解除のイベント設定
const close = document.querySelectorAll('.full-close');
for (var i = 0; i < close.length; i++) {
close[i].addEventListener('click', function(e) {
close_fullscreen(this.parentNode);
}, false);
}
document.addEventListener('webkitfullscreenchange', function(e) {
switch_fullscreen();
});
document.addEventListener('fullscreenchange', function(e) {
switch_fullscreen();
});
// フルスクリーン表示する関数
function show_fullscreen(target) {
if(document.fullscreenEnabled) {
target.requestFullscreen();
} else if(document.webkitFullscreenEnabled) {
target.webkitRequestFullscreen();
} else {
target.classList.add('is-fullscreen');
}
}
// フルスクリーンを解除する関数
function close_fullscreen(target) {
if(document.exitFullscreen) {
document.exitFullscreen();
} else if(document.webkitCancelFullScreen) {
document.webkitCancelFullScreen();
} else {
target.classList.remove('is-fullscreen');
}
}
// フルスクリーン切り替え時の関数
function switch_fullscreen() {
if(document.fullscreenElement) {
console.log('フルスクリーン時の処理');
} else if(document.webkitFullscreenElement) {
console.log('フルスクリーン時の処理(webkit用)');
} else {
console.log('解除時の処理');
}
}
コメントが承認されるまで時間がかかります。