レスポンシブサイトではウィンドウの幅(画面解像度)によって、レイアウトの調整や動作処理の制御を行います。

ウィンドウサイズ(画面幅/高さ)の取得方法に関しては、スクリプト制御ではjQueryの「.width()」メソッドのほか、JavaScriptの「.innerWidth」メソッドや「.matchMedia」メソッドを使用する方法などがあり、CSSメディアクエリでは「@media only screen and (max-width:○○px)」などといった手法でウィンドウサイズを取得することが可能になります。

それぞれの取得する方法によってすこし厄介なのは、ページ内にスクロールバーがある時とない時で取得する値が変わってくるというもの。

さまざまな場面でウィンドウサイズを取得する機会が増えてきているので、上記のそれぞれ取得方法について比較してみました。

ブラウザのウィンドウサイズを取得する際のjQueryとJavaScriptとCSSメディアクエリの違い

まずは各スクリプト処理とCSSメディアクエリを同時に使って、それぞれウィンドウサイズ取得の値を確認するサンプル画面から。

サンプル画面を開いてウィンドウサイズを伸縮して縦横のそれぞれスクロールバーが出る状態にしたり出ない状態にしたりしてみてください。

「画面サイズを取得する際のjQueryやJavaScriptとCSSメディアクエリの違い」比較画面を別枠で表示

各スクリプト処理で取得したウィンドウサイズ値が画面のテーブルに表示されます。
※幅だけでなく高さ「height」の値も併せて表示しています。

取得する処理は
・「.width()」メソッド(jQuery)
・「.innerWidth」メソッド(JavaScript)
・「.matchMedia」メソッド(JavaScript)
・「@media only screen and (max-width:○○px)」(CSSメディアクエリ)
の4種類になります。

「.matchMedia」メソッドの処理ではウィンドウの幅と高さがそれぞれ600px以上の場合はメッセージが「↑」、600px以下の場合はメッセージが「↓」に変化します。

CSSメディアクエリの処理では、幅の処理については、ウィンドウ幅が600px以上の場合は背景色は白、ウィンドウ幅が600px以下になった場合に背景色を赤に変化します。

高さの処理については、ウィンドウ高さが600px以上の場合は表中のフォント色は黒、ウィンドウ高さが600px以下になった場合に表中のフォントが青になります。

サンプル画面の動作をもとに、それぞれの方法でウィンドウサイズを取得した場合にスクロールバーを含んだ値で取得するか、スクロールバーを含まない値で取得するかの違いについて・・・

$(window).width()

jQuery「.width()」メソッドで取得するウィンドウサイズはスクロールバーを含まない値で取得します。

◆SCRIPT
var windowWidth = $(window).width();

jQueryでは幅の値を取得する際に枠の内側や外側を含んだり含まなかったりさせることができる「.innerWidth()」「.outerWidth()」の各メソッドがありますが、これらは「$(window)」と「$(document)」に対しては適用されないのでウィンドウサイズを取得する際には影響がありません。

window.innerWidth

JavaScriptの「window.innerWidth」メソッドで取得するウィンドウサイズはスクロールバーを含んだ値で画面サイズを取得します。

◆SCRIPT
var windowWidth = window.innerWidth;

IE8以下は、非対応となっていて「undefined」を返します。
「window.outerWidth」もありますが、ブラウザウィンドウの枠全体(ウィンドウ枠のデザイン含む)の幅を取得します。

window.matchMedia

JavaScriptの「.matchMedia」メソッドで取得(比較)するウィンドウサイズはスクロールバーを含んだ値で画面サイズを取得(比較)します。

◆SCRIPT
if(window.matchMedia('(min-width:○○px)').matches){
	~ ここに条件がマッチした場合の処理を記述 ~
} else {
	~ ここに条件がマッチしなかった場合の処理を記述 ~
}

JavaScriptの「.matchMedia」を使うと、CSSメディアクエリと同じ感覚で画面サイズを取得・比較することができます。

IE9以下は非対応の為、機能しません。

CSSメディアクエリ

CSSメディアクエリで取得するウィンドウサイズはスクロールバーを含んだ値で画面サイズを取得します。

◆CSS
@media only screen and (min-width: ○○px) {
	~ ここに ○○px 以上の時の指定を記述 ~
}

@media only screen and (max-width: ○○px) {
	~ ここに ○○px 以下の時の指定を記述 ~
}

上記をふまえてブラウザのウィンドウサイズを取得する際のスクロールバーを含んだ値で取得するか、スクロールバーを含まない値で取得するかの違いについて取得範囲のイメージは以下の図のようになります。

スクリプト処理とCSSメディアクエリを同時に使う場合には対象となるブラウザの問題をふまえて、スクロールバーの値も合わせて取得する必要があるので「window.innerWidth」や「window.matchMedia」を使うことでスクロールバーの有無に影響されずに処理することができます。

スクリプト処理とCSSメディアクエリを同時に使ってウィンドウサイズの処理動作をする際のご参考までに。。。

SHARE

Comments (4)

  • 豆芝 | 2015.12.16 11:48

    いつも興味深い記事掲載ありがとうございます。
    私もレスポンシブのHTMLをコーディングする機会が増え、ブラウザごとの横幅の解釈の違いはいつも悩むポイントでした。
    個人的にはCSSのメディアクエリで表示コントロールをし、動的な箇所については(センスのない手法かもしれませんが…)ハンバーガーメニューなどPCでは表示しない要素のdisplayがblockかnoneかでデバイス判別をするようにしています。

  • BlackFlag | 2015.12.18 1:42

    >豆芝さん
    コメントありがとうございます。

    自分も切り替えがどうしようもない時は
    そのように「display:block;」と「display:none;」で
    表示/非表示をを切り替えてしまうことはありますが
    やはりあまり美しいやり方ではないので
    できるだけ避けたい方法ではありますよね…

    レスポンシブでのメニュー関連ではとくによく悩みます。。

  • りおっち | 2016.06.20 15:42

    いつもありがとうございます!
    しばらく、WEBの仕事からは遠ざかっていました。なので、「必要に迫られた真面目な検索」により、貴サイトにアクセスしたのは本当に何年かぶりです。
    デザインが洗練されましたね!初めて拝見させていただいた時は、もっと黒かったような印象があります。
    でも、コンセプトは変わっておられないようですね!わたしにとっては、うれしいことです。
    検証が緻密で、解説は誤解が生じないように、あまり知識が無い人でも一目でわかるように工夫しておられる。
    解説文を読んだり、添付されている画像を拝見すると、技術が進んでいっても役立つ内容を心がけておられるところがいいです。

    「これが新技術!だからスゴイ!乗り遅れるな!」「これがトレンディ!だから使わなきゃ!乗り遅れるよ!」とか。
    そういう風潮にお付き合いしつつも、振り回されるのではなく、冷静に受け止め、そして、「そういう時は、こうしたらいいんだよ」と、同じ目にあっている人々に教えてくださる。本当にお世話になっています。

    今回も、早速、このページで教えていただいたことを試してみました。
    思い通りにいきました。
    これからも、「オープンソース」でいてくだされませ。
    Vielen Dank !

  • BlackFlag | 2016.06.20 19:52

    >りおっちさん
    コメントありがとうございます。

    当ブログを公開直後からご覧頂いていたとのこと
    大変光栄に思っております。

    自分がWeb制作においてつまづいた点や
    よく必要に駆られる内容をまとめているものもありますので
    そのような同じ状況においてお役立ていただいたという
    お言葉を聞けるだけで本当にうれしく思います。

    ブログ全体から記事の内容まで
    そのようにご評価いただき
    本当にありがとうございます。

    いただいたお言葉を励みにして
    今後もより一層Web制作において役に立つ情報を発信し続けられるように
    精進させていただきます。

    引き続きご贔屓いただけると幸いです。
    今後ともよろしくお願い致します。







コメント内容

※コメントにHTMLタグを直接入力しないでください。
※HTMLタグを入力する際はタグ一つ一つの括弧「<」「>」を全角に変換して入力してください。

コメントは承認制になっているのですぐには反映されません。コメント頂いた内容については出来る限り早めの対応を心掛けていますが、時期によって返答が遅くなってしまうことがありますので、何卒ご了承ください。
» コメントについてのご注意  |  » ライセンスに関して