Media Queriesのブレークポイントの切り替え時に、JavaScriptの処理を実行したいときの方法を考えてみました。
サンプルコード1(失敗例)
まずは$(window).width()を使った場合の失敗例です。
HTML
<div id="contents">コンテンツ中身</div>
CSS
ブレークポイントを480pxと960pxに設定して、それぞれ背景色を変更します。
#contents {
background: #E74C3C;
}
@media screen and (min-width: 480px) {
#contents {
background: #2ECC71;
}
}
@media screen and (min-width: 960px) {
#contents {
background: #3498DB;
}
}
JavaScript
画面幅をconsole.logで表示します。
$(function() {
$(window).on('resize', function() {
var windowWidth = $(window).width();
if(windowWidth < 480) {
console.log('spです' + windowWidth);
} else if(windowWidth < 960) {
console.log('tbです' + windowWidth);
} else {
console.log('pcです' + windowWidth);
}
});
});
背景が切り替わるブレークポイントの幅(480px、960px)と、背景が切り替わるときのconsole.logの数値が10~20pxほどずれています。
これはMedia Queriesのブレークポイントがスクロールバーを含めた画面幅なのに対して、$(window).width()はスクロールバーを省いた画面幅を取得しているためです。
Media QueriesのブレークポイントでJavaScriptを実行するデモページ(うまくいっていない例)
サンプルコード2
ブレークポイントの確認用に空要素を追加して、ブレークポイント毎に要素の表示非表示を切り替えます。
HTML
<div id="contents">コンテンツ中身</div> <div id="breakpoint-check"> <div class="breakpoint-pc"></div> <div class="breakpoint-tb"></div> <div class="breakpoint-sp"></div> </div>
CSS
#contents {
background: #E74C3C;
}
#breakpoint-check .breakpoint-pc {
display: none;
}
#breakpoint-check .breakpoint-tb {
display: none;
}
#breakpoint-check .breakpoint-sp {
display: block;
}
@media screen and (min-width: 480px) {
#contents {
background: #2ECC71;
}
#breakpoint-check .breakpoint-tb {
display: block;
}
#breakpoint-check .breakpoint-sp {
display: none;
}
}
@media screen and (min-width: 960px) {
#contents {
background: #3498DB;
}
#breakpoint-check .breakpoint-tb {
display: none;
}
#breakpoint-check .breakpoint-pc {
display: block;
}
}
JavaScript
$(window).width()ではなく、どの要素が表示されているかでブレークポイントを判断するようにします。
$(function() {
$(window).on('resize', function() {
var windowWidth = $(window).width();
if($('#breakpoint-check .breakpoint-sp').is(':visible')) {
console.log('spです' + windowWidth);
} else if($('#breakpoint-check .breakpoint-tb').is(':visible')) {
console.log('tbです' + windowWidth);
} else {
console.log('pcです' + windowWidth);
}
});
});
console.logの数値部分は$(window).width()のままなのでブレークポイントとずれたままですが、テキスト部分はブレークポイントと一致するようになりました。
Media QueriesのブレークポイントでJavaScriptを実行するデモページ
コメントが承認されるまで時間がかかります。