「BGMを流したい!あ、ちなみにレスポンシブ対応で!」そんな無茶ぶりをするクライアント案件で実装した機能です。
クライアントの要望
今回は、HTML5のaudioタグをカスタマイズして使用。デフォルトのコントロールバーだと独特なサイトの雰囲気をぶち壊すので、自分で作成したボタン画像を使用して、BGMの「ON」と「OFF」の切り替え(正確にはミュートの切り替え)を可能にしてます。
BGMの「ON」と「OFF」の切り替えにはJavaScriptを使用。あとは、PCとスマホではaudioタグの動作が違うので、それぞれに対応させました。またJavaScriptをレスポンシブ対応させるために下記の仕組みを活用。

さらにさらに、サイト訪問時にいきなりBGMが流れると離脱率が怖いので、最初はミュートで開始。そんでもって、BGMは自動で再生されて、一時停止ではなくミュート。つまり、BGMは止まらないい無限ループ。クッソwww
仕様の整理
- 再生位置や音量が表示されるデフォルトのコントロールバーは使わない
- オリジナル画像でBGMのON・OFFボタンにする
- ONボタンとOFFボタンはそれぞれ表示するのではなく1つの画像が切り替わる
- このボタンを押せばミュートにできたり音を出せたり出来るようにする
- BGMは自動再生され無限ループする
- レスポンシブ対応
- スマホはaudioタグの挙動がPCと違うのでフレキシブルに対応
HTMLコード
<script type="text/javascript">
jQuery(document).ready(function($) {
//PCの場合
if (window.matchMedia( '(min-width: 769px)' ).matches) {
$.ajax({
url: 'js/bgm_pc.js',
dataType: 'script',
cache: false
});
//スマホの場合
} else {
$.ajax({
url: 'js/bgm_sp.js',
dataType: 'script',
cache: false
});
};
});
</script>
<span class="bgm_btn_pc"><!--PC用-->
<audio id="sound" autoplay loop muted preload="auto"><source src="audio/sample.mp3"></audio>
<a onclick="mute();"><img class="imgChange" src="img/common/play-btn_off.png"></a>
</span>
<span class="bgm_btn_sp"><!--スマホ用-->
<audio id="sound_sp" preload="metadata"
onpause="console.log('pause');"
onplay="console.log('play');">
<source src="audio/sample.mp3" type="audio/x-mp3">
</audio>
<a onclick="play();"><img class="imgChange" src="img/common/play-btn.png"></a><br>
<a class="d_block mt10" onclick="pause();"><img class="imgChange" src="img/common/play-btn_off.png"></a>
</span>PC用とスマホ用で切り替えるため、画面サイズで切り替えるCSSのdisplay:none;で表示・非表示。CSSはデフォルトのコントロールは使用せず、Javascriptでミュート機能を実装。
さらに、クリックによって画像が切り替わるように。audioタグのカスタマイズなどは前回記事を参考にしてください。

クリックで画像を切り替えるJavascript
//on off img
function smartRollover() {
if(document.getElementsByTagName) {
var images = document.getElementsByTagName("img");
for(var i=0; i < images.length; i++) {
if(images[i].getAttribute("src").match("_off.")) {
images[i].onmouseover = function() {
this.setAttribute("src", this.getAttribute("src").replace("_off.", "_on."));
}
images[i].onmouseout = function() {
this.setAttribute("src", this.getAttribute("src").replace("_on.", "_off."));
}
}
}
}
}
if(window.addEventListener) {
window.addEventListener("load", smartRollover, false);
}
else if(window.attachEvent) {
window.attachEvent("onload", smartRollover);
}common.jsのような名前でPCとスマホの両方に読み込ませます。
PC用のJavascript
var TARGET = document.getElementById('sound');
function mute(){
if(TARGET.muted){
TARGET.muted = false;
}else{
TARGET.muted = true;
}
}
$(function(){
$(".imgChange").click(function(){
var imgSrc = $(this).attr("src");
if($(this).attr("class") == "imgChange_on"){
$(this).attr("class", "imgChange_off")
imgSrc = imgSrc.replace(/(_on)/, '')
$(this).attr("src", imgSrc)
return
}
$(this).attr("class", "imgChange_on")
$(this).attr("src", imgSrc.replace(/(\.gif|\.jpg|\.png)/g, '_on$1'))
});
});PC用に読み込むbgm_pc.jsの中身。クリックで画像が入れ替わり、かつミュートのON・OFFになるようにしています。
スマホ用のJavascript
var TARGET = document.getElementById('sound_sp');
function play(){
TARGET.play();
}
function pause(){
TARGET.pause();
}スマホ用に読み込むbgm_sp.jsの中身。ON用の画像をタップすると再生(ミュート解除)、OFF用の画像をタップすると停止(ミュート)となるように指定しています。
再生状態からスタートする場合
ミュート開始ではなく、離脱率とかいいから再生状態で開始したい場合は下記に変更。PCのミュートを解除して、画像はONをデフォルトに。
<span class="bgm_btn_pc"><!--PC用-->
<audio id="sound" autoplay loop preload="auto"><source src="audio/sample.mp3"></audio>
<a onclick="mute();"><img class="imgChange" src="img/common/play-btn.png"></a>
</span>
<span class="bgm_btn_sp"><!--スマホ用-->
<audio id="sound_sp" preload="metadata"
onpause="console.log('pause');"
onplay="console.log('play');">
<source src="audio/sample.mp3" type="audio/x-mp3">
</audio>
<a onclick="play();"><img class="imgChange" src="img/common/play-btn.png"></a><br>
<a class="d_block mt10" onclick="pause();"><img class="imgChange" src="img/common/play-btn_off.png"></a>
</span>ちなみに、スマホは公共の場での使用を想定してか、audioタグでの自動再生は出来ないようです。やり方によっては可能かもしれませんが、いきなりの音楽再生は、PC以上に嫌がられるのでお勧めはしません。


記事のコメント