(マイナス)スクロールバーなしで画面幅を取得するにはどうすればよいですか?


102

要素があり、垂直スクロールバーなし(!)の幅が必要です。

Firebugはボディの幅が1280pxであると教えてくれます。

これらはいずれもFirefoxで正常に動作します。

console.log($('.element').outerWidth() );
console.log($('.element').outerWidth(true) );

$detour = $('.child-of-element').offsetParent();
console.log( $detour.innerWidth() );

それらはすべて、私が探している値である1263pxを返します。

ただし、他のすべてのブラウザでは1280pxが表示されます。

垂直スクロールバーなし(!)で全画面幅を取得するクロスブラウザ方法はありますか?


垂直スクロールバーが必要ですか?または、overflow:hiddenを使用して幅を計算できますか?
Filip

あなたはあなたの質問stackoverflow.com/questions/8794338/…の

あなたが試すことができますwidth: 100%;
www139

要素を、スクロールバーを含まない画面の幅全体にしようとしていますか?
www139

回答:


161

.prop("clientWidth") そして .prop("scrollWidth")

var actualInnerWidth = $("body").prop("clientWidth"); // El. width minus scrollbar width
var actualInnerWidth = $("body").prop("scrollWidth"); // El. width minus scrollbar width

JavaScriptを

var actualInnerWidth = document.body.clientWidth;     // El. width minus scrollbar width
var actualInnerWidth = document.body.scrollWidth;     // El. width minus scrollbar width

PS:scrollWidth確実に使用するには、要素が水平方向にオーバーフローしないように注意してください

jsBinデモ


使用することもできます.innerWidth()が、これbody要素でのみ機能します

var innerWidth = $('body').innerWidth(); // Width PX minus scrollbar 

2
何らかの理由でbody要素の幅を変更した場合、これは機能しません。
Konstantin Pereiaslov 2013

4
これは本当にChromeでは機能しないようです。報告された幅は実際にはウィンドウ自体よりも20px大きくなっています。私はこれまで何回も幅の測定を試みました。
Sammaye 2014年

2
@Sammayeは、margin:0を設定するのを忘れた(なぜですか?)BODYまたは一般的なCSSリセットコードを使用します。jsbin.com/homixuqi/2/edit繰り返しになりますが、コードは完全に正常に動作します
Roko C. Buljan

2
@NamanGoelボディ幅でのメサラウンドを防ぐのはウェブデザイナーとしてのあなたの仕事です。難しいことではありません。また、高さに関しては、bodyオーバーフローするかどうかによって異なります。それを制限するよりもオーバーフローする場合。
ロコC.ブルジャン

2
@ RokoC.Buljan私はここであなたに反対していません。もちろん、ボディの幅などをいじる必要のある優れたWebデザイナー/開発者はいません。私のポイントは、利用可能な最も信頼できるAPIを使用することでした。一部のJavaScript開発者はプラグインなどを作成していて、ページ全体を制御できない場合があります。
Naman Goel

36

次のように書くだけで、バニラJavaScriptを使用できます。

var width = el.clientWidth;

これを使用して、次のようにドキュメントの幅を取得することもできます。

var docWidth = document.documentElement.clientWidth || document.body.clientWidth;

出典:MDN

次のように、スクロールバーを含むウィンドウ全体の幅を取得することもできます。

var fullWidth = window.innerWidth;

ただし、これはすべてのブラウザでサポートされているわけではないため、フォールバックとして、docWidth上記のように使用し、スクロールバーの幅を追加することができます。

出典:MDN


スクロールバーがある場合、これは考慮されていません

5
document.documentElement.clientWidth高さでも機能し(innerHeight本文がページに収まらない場合は小さくすることができます)、スクロールバーなしで値を取得できるため、最も役立ちました。
user4642212 2015

1
document.documentElement.clientWidthが本当の勝者です。document.body.clientWidthは、body要素にmin-widthが設定されておらず、ブラウザーが現在その最小幅よりも小さい場合を除き、問題ありません。
Codemonkey

12

ここで想定するいくつかの例であり、$elementあるjQuery要素は:

// Element width including overflow (scrollbar)
$element[0].offsetWidth; // 1280 in your case

// Element width excluding overflow (scrollbar)
$element[0].clientWidth; // 1280 - scrollbarWidth

// Scrollbar width
$element[0].offsetWidth - $element[0].clientWidth; // 0 if no scrollbar

10

これを試して :

$('body, html').css('overflow', 'hidden');
var screenWidth1 = $(window).width();
$('body, html').css('overflow', 'visible');
var screenWidth2 = $(window).width();
alert(screenWidth1); // Gives the screenwith without scrollbar
alert(screenWidth2); // Gives the screenwith including scrollbar

このコードを使用すると、スクロールバーの有無にかかわらず、画面の幅を取得できます。ここでは、bodyスクロールバーがある場合とない場合のオーバーフロー値を変更して幅を取得しています。


私もこれに頼らなければなりませんでした。上記の答えは私にとって
うまくいき

時間を節約しました。トンありがとう!
Xonshiz

7

スクロールバーなしで正しい幅と高さを取得する最も安全な場所は、HTML要素からです。これを試して:

var width = document.documentElement.clientWidth
var height = document.documentElement.clientHeight

ブラウザのサポートはかなりまともで、IE 9以降でサポートされています。OLD IEの場合、ここで説明する多くのフォールバックの1つを使用します。


0

私は同様の問題を経験し、width:100%;解決しました。この質問の答えを試してみたところ、このソリューションに<iframe>たどり着きました。ある種の複雑な関数を使用しないと、これらのjavascript測定ツールが不正確になるためです。100%にすることは、iframeでそれを処理する簡単な方法です。操作しているHTML要素が不明なため、問題についてはわかりません。



0

これが私が使うものです

function windowSizes(){
    var e = window,
        a = 'inner';
    if (!('innerWidth' in window)) {
        a = 'client';
        e = document.documentElement || document.body;
    }
    return {
        width: e[a + 'Width'],
        height: e[a + 'Height']
    };  
}

$(window).on('resize', function () {
    console.log( windowSizes().width,windowSizes().height );
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.