JavaScriptコードを使用してブラウザの幅を取得する方法は?


180

現在のブラウザーの幅を取得するJavaScript関数を記述しようとしています。

私はこれを見つけました:

javascript:alert(document.body.offsetWidth);

しかし、ボディの幅が100%の場合、失敗するという問題があります。

他にもっと良い機能や回避策はありますか?

回答:


133

2017年の更新

私の元の答えは2009年に書かれました。それでも動作しますが、2017年に更新したいと思います。ブラウザーの動作は異なる場合があります。私はjQueryチームがブラウザ間の一貫性を維持する上で素晴らしい仕事をすることを信頼しています。ただし、ライブラリ全体を含める必要はありません。jQueryソースの関連部分は、dimension.jsの37行目にあります。ここでは、スタンドアロンで動作するように抽出および変更されています。

function getWidth() {
  return Math.max(
    document.body.scrollWidth,
    document.documentElement.scrollWidth,
    document.body.offsetWidth,
    document.documentElement.offsetWidth,
    document.documentElement.clientWidth
  );
}

function getHeight() {
  return Math.max(
    document.body.scrollHeight,
    document.documentElement.scrollHeight,
    document.body.offsetHeight,
    document.documentElement.offsetHeight,
    document.documentElement.clientHeight
  );
}

console.log('Width:  ' +  getWidth() );
console.log('Height: ' + getHeight() );


元の回答

すべてのブラウザーの動作は異なるため、最初に値をテストしてから、正しい値を使用する必要があります。これを行う関数は次のとおりです。

function getWidth() {
  if (self.innerWidth) {
    return self.innerWidth;
  }

  if (document.documentElement && document.documentElement.clientWidth) {
    return document.documentElement.clientWidth;
  }

  if (document.body) {
    return document.body.clientWidth;
  }
}

同様に高さについて:

function getHeight() {
  if (self.innerHeight) {
    return self.innerHeight;
  }

  if (document.documentElement && document.documentElement.clientHeight) {
    return document.documentElement.clientHeight;
  }

  if (document.body) {
    return document.body.clientHeight;
  }
}

getWidth()またはを使用して、スクリプトでこれらの両方を呼び出しますgetHeight()。ブラウザのネイティブプロパティが定義されていない場合は、が返されundefinedます。


11
ブラウザウィンドウの幅に基づいた単純なリダイレクトに33kライブラリを含める必要がないため、最良の回答
David Aguirre

1
これにより、jQueryの実装と比較して、一貫して正しい(または期待される)結果が生成されます。
エマニュエルジョン

3
...これら3つはそれぞれいくつかの結果を示しており、すべての結果(幅)は異なります。たとえば、Google Chromeのself.innerWidth 423場合、document.documentElement.clientWidth 326およびを参照してくださいdocument.body.clientWidth 406。そのような場合の質問:どちらが正しいか、どちらを使用するか?たとえば、Googleマップのサイズを変更したいと思います。326または423の大きな違い。幅が700を超える場合は、759、735、742を参照してください(それほど大きな違いではありません)
Andris

1
@ user2118559 var pageWidth = Math.max(self.innerWidth || 0, document.documentElement.clientWidth || 0, document.body.clientWidth || 0);およびvar windowWidth = self.innerWidth || -1;//「body」、「screen」、または「document」が原因で、オーバーフローしたhtmlのコンテンツを確認すると、「ウィンドウ」ではないことが理解できます。#i.stack.imgur.com/6xPdH.png
AbdullahAydınApr

1
あなたの例のコピー貼り付けエラー、関数getWidth()参照self.innerHeight
theGecko

309

それはだお尻の痛み。ナンセンスをスキップしてjQueryを使用することをお勧めします$(window).width()


2
私が正しく思い出した場合、jQueryは多くのディメンションをコアに組み込んだことになります。提案していることを実行するために、まだ寸法が必要ですか?
Nosredna 09年

あなたはそうではないことがわかりました。それは素晴らしいです。あたりの編集済み回答。ヘッドアップをありがとう。
混沌

6
jQueryの$(window).width()サポートは、誰かに関係がある場合に備えて、バージョン1.2以降です。
混沌

18
$(window).width()が、以下の回答の例にあるように、innerWidth / clientWidthと同じ値を常に返すとは限らないことがわかりました。jQueryのバージョンは、ブラウザのスクロールバーを考慮していません(とにかくFFで)。これにより、CSS @メディアクエリが間違った幅でトリガーされているように見えて、多くの混乱を引き起こしました。ネイティブコードを使用すると、スクロールバーの外観が考慮されるため、より信頼できるようです。
Coder

5
ウィンドウ幅を取得するために30k行のコードを追加することは悪い解決策です!
codechimp、2018

49
var w = window.innerWidth;
var h = window.innerHeight;
var ow = window.outerWidth; //including toolbars and status bar etc.
var oh = window.outerHeight;

どちらも整数を返し、jQueryを必要としません。クロスブラウザ互換。

jQueryがwidth()およびheight()に無効な値を返すことがよくあります


1
Safari iphoneでこれを使用すると問題が発生します。
nu everest 2017

17

matchMediaについて誰も言及しないのはなぜですか?

if (window.matchMedia("(min-width: 400px)").matches) {
  /* the viewport is at least 400 pixels wide */
} else {
  /* the viewport is less than 400 pixels wide */
}

それほど多くはテストしませんでしたが、AndroidのデフォルトおよびAndroidのクロムブラウザー、デスクトップクロムでテストしたところ、これまでのところ、うまく機能しているようです。

もちろん、数値は返しませんが、ブール値を返します。一致するかどうかにかかわらず、質問に完全には一致しない可能性がありますが、それはとにかく私たちが望んでいることであり、おそらく質問の作成者が望んでいます。


1
IE10 +のみをサポートします。
qarthandso 2017

17
IE9以前を使用している場合、インターネットに値するものではありません。
Darius.V 2017

Safari iphoneはこれをサポートしていないようです。
nu everest 2017

新しいiOS SafariバージョンはmatchMediaをサポートする必要があります。出典:caniuse.com/#feat=matchmedia
Vargr

8

W3schoolsとそのクロスブラウザーからIEの暗黒時代に戻る!

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var w = window.innerWidth
|| document.documentElement.clientWidth
|| document.body.clientWidth;

var h = window.innerHeight
|| document.documentElement.clientHeight
|| document.body.clientHeight;

var x = document.getElementById("demo");
x.innerHTML = "Browser inner window width: " + w + ", height: " + h + ".";

alert("Browser inner window width: " + w + ", height: " + h + ".");

</script>

</body>
</html>

このアプローチは見事に機能し、他のソリューションよりもはるかに短いため(jQueryを使用することを除いて)、受け入れられる答えになる可能性があります。
Simon Steinberger

2
document.documentElementが未定義の場合、エラーをスローしませんか?
PhiLho 2015

6

上記の関数の短いバージョンを次に示します。

function getWidth() {
    if (self.innerWidth) {
       return self.innerWidth;
    }
    else if (document.documentElement && document.documentElement.clientHeight){
        return document.documentElement.clientWidth;
    }
    else if (document.body) {
        return document.body.clientWidth;
    }
    return 0;
}

4
すべての条件がfalseの場合、値を返すことができません。
マイクC

10
elsesは必要ありません:)
Nick

0

トラビスの最新のJSの答えに対する適応ソリューション:

const getPageWidth = () => {
  const bodyMax = document.body
    ? Math.max(document.body.scrollWidth, document.body.offsetWidth)
    : 0;

  const docElementMax = document.documentElement
    ? Math.max(
        document.documentElement.scrollWidth,
        document.documentElement.offsetWidth,
        document.documentElement.clientWidth
      )
    : 0;

  return Math.max(bodyMax, docElementMax);
};

0

トラビスの答えへの重要な追加。ドキュメントの本文にgetWidth()を入れて、スクロールバーの幅がカウントされることを確認する必要があります。そうでない場合は、ブラウザのスクロールバーの幅がgetWidth()から差し引かれます。私がしたこと ;

<body>
<script>
function getWidth(){
return Math.max(document.body.scrollWidth,
document.documentElement.scrollWidth,
document.body.offsetWidth,
document.documentElement.offsetWidth,
document.documentElement.clientWidth);
}
var aWidth=getWidth();
</script>
</body>

その後、任意の場所でaWidth変数を呼び出します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.