Windows 10、モニターサイズ1920 x 1080でそれぞれの数値を検証してみました。
上の数値がフルスクリーンで、下の数値が最大化(スクロールバーやツールバーなどを含む)です。
| window.innerWidth x window.innerHeight |
window.outerWidth x window.outerHeight |
$(window).width() x $(window).height() |
$(document).width() x $(document).height() |
|
| Firefox 49.0 | 1920 x 1079 1920 x 917 |
1920 x 1080 1936 x 1056 |
1903 x 1079 1903 x 917 |
1903 x 1079 1903 x 917 |
| chrome 53.0.2785.116 m | 1920 x 1080 1920 x 974 |
1904 x 1064 1920 x 1040 |
1903 x 1080 1903 x 974 |
1903 x 1080 1903 x 974 |
| IE 11 | 1920 x 1079 1920 x 985 |
1920 x 1080 1936 x 1056 |
1903 x 1079 1903 x 985 |
1903 x 1079 1903 x 985 |
| IE 10 | 1920 x 1079 1920 x 985 |
1920 x 1080 1936 x 1056 |
1903 x 1079 1903 x 985 |
1920 x 1079 1920 x 985 |
| IE 9 | 1920 x 1079 1920 x 985 |
1920 x 1080 1936 x 1056 |
1903 x 1079 1903 x 985 |
1920 x 1079 1920 x 985 |
| IE 8 | undefined | undefined | 1899 x 1075 1899 x 981 |
1920 x 1079 1920 x 985 |
まず高さについてですが、ツールバーやスクロールバーを含めた高さが必要になるケースはあまりないと思われるので、IE 8以上に対応していてIE全バージョンで誤差のない$(document).height()を使っておけば間違いなさそうです。
IE 8を切るならばwindow.innerHeight、$(window).height()、$(document).height()の中から気分で選べます。
横幅はスクロールバーを含めたい場合とそうでない場合があるのでちょっと厄介です。
スクロールバーを含めるとCSSのメディアクエリやvwと合致しますし、コンテンツ領域との比較でなんかしたいときはスクロールバーを除いた横幅が必要になってきます。
それに加え、IE 8への対応によっても選択が変わってきます。
IEとスクロールバーを条件にまとめてみました。
| スクロールバーを含める | スクロールバーを含めない | |
| IE 9以上対応 | window.innerWidth x $(document).height() | $(window).width() x $(document).height() |
| IE 8以上対応 | window.innerWidth x $(document).height() ※IE 8のみ$(document).width() |
jQueryでこんな感じで実装してます。
jQuery(function($) {
var winW, conW, conH;
var resizeTimer = false;
$(window).on('load resize orientationchange', function() {
if (resizeTimer !== false)
clearTimeout(resizeTimer);
resizeTimer = setTimeout(function() {
if (typeof (winW = window.innerWidth) === 'undefined')
winW = $(document).width();
conW = $(window).width();
conH = $(document).height();
}, 200);
});
});
winWはスクロールバーを含めた横幅で、conWはコンテンツ領域の横幅。
conHはコンテンツ領域の高さで、スクロールバーを含む数値は取得しない。
window.innerWidthはIE 8が対応していないので、代わりに$(document).width()を使うようにしてます。


