2013-08-08 11 views
8

私はウィンドウの幅の決定方法を理解しようとしていましたが、CSSとjQueryで異なるかどうかは疑問でした。jQueryとCSSのメディアクエリーが同期していない

例えば私は、CSSメディアクエリがある場合:

@media (max-width: 979px) { 
    /*my css here*/ 
} 

ともいくつかのjQuery:

if ($(window).width() < 979) { 
    //my jQuery here 
} 

を私は次のことを期待: - ブラウザが980pxで&リフレッシュリサイズされた場合上記の両方が無視されます - ブラウザのサイズを変更すると、&が978pxでリフレッシュされ、上記の両方が有効になります。

しかし、私が見つけたのは です - jQueryとCSSは約964px以下までキックオフしません。 - 時には(私はwindow.resizeが有効になっている)、jQueryとCSSが別々の幅(数ピクセル離れている)でキックしていることがあります。

ここで何が起こっているのか誰にも分かりますか?

ところで、私はFirebugのレイアウトビューアでウィンドウの幅を基準にしています。

+0

私は同じ問題に気づきましたが、報告された解決策はどれも動作していませんでした。メディアクエリで読み取られた値と同じ値を返しません。さらに、document/bodyオブジェクトスタイルに同じ値が含まれていますが、解決策はありますか? – guari

+0

ok、ちょうど原因を見つけた、私は以下の答えで解決策を追加しました。 – guari

+0

あなたはウィンドウの代わりに本体を使ってみましたか? – CyberJunkie

答えて

0

あなたは

$(window).width(); // returns width of browser viewport 
$(document).width(); // returns width of HTML document 

http://api.jquery.com/width/

+0

ええ私はそれを試して、それは私のためのウィンドウの幅と同じ値を返していた。また、CSSメディアのクエリが遅れている理由については説明していません(ファイヤーバグの幅に従って) – Coop

0

メディアクエリは、ビューポートの幅を使用する代わりに$(document).width()を使用したいかもしれないと思います。私は、CSSのメディアクエリと一致させようとすると、HTMLの幅を取得する方がはるかに正確であることがわかります。使用してサイズを変更:

$(window).resize(function() { 
    if ($('html').width() <= 979) { 
    // Do something 
    } 
}); 
+0

OKです。しかし、ファイヤーバグが不正確なボディ幅を与えているのか、CSSが遅れて違う幅を読み込んでいるのか、私は疑問に思います。スクロールバーとは何か? – Coop

8

問題は、スクロールバーの幅に関連している:window.innerWidthはCSSメディアクエリによって読み取られる正しい値を返します。 $(window).innerWidth()が間違った値を返すことに注意してください。クロスブラウザのソリューションについては

はこのような機能を使用することができます。

function viewport() { 
    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' ] }; 
} 

var value = viewport().width; 
+0

私はこの問題を100回google'dしたことを誓い、私はいつもこの解決策を忘れてしまいます。 –

1

ビットトピックオフにしていますが、で何かをしたいので、私はあなたがする場合はJavaScript火災模倣しようとしていると仮定cssのブレークポイントが切り替わるのと同じ時間です。メディアクエリが発生したときにjavascriptに何かをさせたい場合は、メディアクエリの実行方法を模倣しようとするのではなく、CSSによって作成された変更をポーリングするのが最も簡単であることがわかりました(レポートのためにブラウザでは矛盾します)。スクロールバーの幅)。あなたのブレークポイントで、要素-xはposition: fixedposition: relativeから行く場合たとえば、あなたはJavascriptをポーリングするのではなく、文書の幅を

if(elementX.css('position')== 'fixed'){ 
//code 
} 

をテストして、あなたのCSSに沿ったものであることを確認することができます。

+0

私は最大幅の値を持つページ上の目に見えないルーラー要素を使用し、それをポーリングします。 – Sam

関連する問題