2013-04-12 4 views
5

Bei der Arbeit mit Responsive-Designs verwende ich CSS3-Medienabfragen, auch bei älteren Browsern mit respond.js. Es gibt Gelegenheiten, in denen ich JavaScript/jQuery auch benutzen muss, um einige Elemente auf der Seite zu manipulieren. Bei Verwendung von $ (window) .width() weicht dieser Wert jedoch häufig von dem Wert ab, der in der CSS-Medienabfrage aufgrund des Browser-Chroms und/oder des Vorhandenseins einer vertikalen Bildlaufleiste verwendet wird, dh eine CSS-Medienabfrage wird ausgelöst anderer Haltepunkt als die JS-Medienabfrage.CSS- und JS-Medienabfragen browserübergreifend synchronisieren

Ich weiß, dass Modernizr dieses Problem durch die Verwendung von Modernizr.mq behebt, aber das funktioniert nur in Browsern, die CSS-Medienabfragen unterstützen, im Allgemeinen bedeutet es nicht in IE8 und darunter funktioniert. Und wenn Sie einen Polyfill verwenden, um diesen älteren Browsern Unterstützung für die Medienabfrage hinzuzufügen (z. B. respond.js), funktioniert die Funktion Modernizr.mq nicht mehr aufgrund eines Konflikts/Überschreibens zwischen den beiden.

Was ich stattdessen getan habe, ist ein verstecktes Eingabeelement auf der Seite verwendet und es eine CSS-Breite Stil innerhalb jeder der Medienabfragen gegeben. Ich habe dann eine Funktion, die automatisch auf der Seite läuft (und auf Resize), die die Breite Wert erhält und führt die folgenden Schritte aus:

 if (width == "320px") { 
      //Functions 
     } 

     //481px to 600px 
     else if (width == "481px") { 
      //Functions 
     } 

     //601px to 768px 
     else if (width == "601px") { 
      //Functions 
     } 

     //769px to 960px 
     else if (width == "769px") { 
      //Functions 
     } 

     //769 to 1024px 
     else if (width == "961px") { 
      //Functions 
     } 

     //1024px+ 
     else { 
      //Functions 
     } 

Diese im Grunde die JS zwingt vollständig abzuarbeiten der CSS-Medienabfrage, die die Synchronisierung zwei. Dies kann spezifischer und nicht generischer werden als ich es habe, stattdessen wird das Abfeuern basierend auf einem bestimmten Element und einem spezifischen Stil, der sich an diesem Element ändert, abhängig von den individuellen Projektanforderungen.

Meine Frage ist dann, gibt es eine einfachere Möglichkeit, dies zu tun? Ich habe viel Zeit damit verbracht, das zu untersuchen und damit zu experimentieren, und es scheint die bisher beste Option zu sein, die auch ältere Browser berücksichtigt.

Antwort

2

PPK listete eine schöne Art, die CSS & JS auf seinem Blog, die Art sichert Ihre Methode zu paaren:

@media all and (max-width: 900px) { 
// styles 
} 

if (document.documentElement.clientWidth < 900) { 
    // scripts 
} 

Sein vollständiger Beitrag auf es here ist.

Es gibt auch das enquire.js Plug-in.

+0

Ich habe diesen Beitrag gelesen und danke für die Antwort. Screen.width gibt einen konsistenten Wert zurück, da es offensichtlich die Bildschirmbreite über die Fensterbreite auswertet, was bedeutet, dass Sie keine ansprechenden Änderungen sehen werden, wenn Sie die Größe Ihres Browserfensters ändern. Dies ist zwar nicht von Natur aus problematisch, erschwert jedoch den Test, da Sie tatsächliche Geräte mit bestimmten Breiten zum Testen benötigen. – seannachie

+0

Außerdem müssen Sie bei Inquire ein Polyfill zum Hinzufügen der mediaMatch-Unterstützung verwenden. Damit jedoch IE8 und darunter überhaupt keine Medienabfragen erkennen können, müssen Sie auch einen Polyfill für die Unterstützung von Medienabfragen verwenden ... die beiden Polyfills arbeiten nicht zusammen. Wenn ich möchte, dass meine JS/CSS synchronisiert wird, müssten meine Abfragen alle in der JS oder alle in der CSS sein. Wenn das Sinn macht ... lol – seannachie

+0

Wenn OldIE ein Anliegen ist, vielleicht RespondJS? – kaidez