CSS-Medienabfragen und jQuery-Fenster .width() stimmen nicht überein

Lesezeit: 6 Minuten

Benutzer-Avatar
benoît

Für eine responsive Vorlage habe ich eine Medienabfrage in meinem CSS:

@media screen and (max-width: 960px) {
    body{
       /*  something */
       background: red;
    }
}

Und ich habe eine jQuery-Funktion zur Größenänderung erstellt, um die Breite zu protokollieren:

$(window).resize( function() {
    console.log( $(window).width() );
    console.log( $(document).width() ); /* same result */
    /* something for my js navigation */
}

Und es gibt einen Unterschied zwischen CSS-Erkennung und JS-Ergebnis, ich habe dieses Meta:

<meta content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, width=device-width" name="viewport"/> 

Ich nehme an, es liegt an der Bildlaufleiste (15 px). Wie kann ich das besser machen?

Sie haben Recht mit der Bildlaufleiste, da das CSS die Gerätebreite verwendet, das JS jedoch die Dokumentbreite.

Was Sie tun müssen, ist die Viewport-Breite in Ihrem JS-Code zu messen, anstatt die jQuery-Breitenfunktion zu verwenden.

Dieser Code stammt von http://andylangton.co.uk/articles/javascript/get-viewport-size-javascript/

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' ] };
}

  • Fest. Viel besser als $(document).width(); window.matchMedia() ist wahrscheinlich besser, aber es ist IE10+

    – Bosworth99

    21. Mai 2014 um 19:19 Uhr

  • Dies scheint nicht zu funktionieren, wenn das Fenster Bildlaufleisten hat und Ihre Medienabfragen die maximale Breite überprüfen, zumindest in Chrome. Das Überprüfen von CSS für ein Element, von dem Sie wissen, dass es von einer bestimmten Medienabfrage festgelegt wird, scheint jedoch zu funktionieren.

    – mhenry1384

    14. Oktober 2014 um 18:08 Uhr

  • @mhenry1384 wovon redest du?

    – Jürgen Paul

    23. Juli 2016 um 12:44 Uhr

Benutzer-Avatar
LarS

Ich habe folgenden Code auf gefunden http://www.w3schools.com/js/js_window.asp:

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

Praktisch funktioniert es genauso wie die Antwort in @Michael Birds Antwort, aber es ist einfacher zu lesen.

Bearbeiten: Ich suchte nach einer Methode, um genau die gleiche Breite anzugeben, wie sie für CSS-Medienabfragen verwendet wird. Aber das vorgeschlagene funktioniert nicht perfekt auf Safari mit Bildlaufleisten, sorry. Am Ende habe ich modernizr.js in einer zentralen Funktion verwendet und im Rest des Codes überprüfe ich nur, ob der Anzeigetyp Mobil, Tablet oder Desktop ist. Da mich die Breite nicht interessiert, funktioniert das für mich gut:

getDisplayType = function () {
  if (Modernizr.mq('(min-width: 768px)')){
    return 'desktop';
  }
  else if (Modernizr.mq('(min-width: 480px)')){
    return 'tablet'
  }
  return 'mobile';
};

  • Wenn document.documentElement nicht existiert, schlägt dieses Skript fehl. Vertrauen Sie w3schools nicht, sehen Sie w3fools.com

    – ausi

    28. März 2014 um 10:09 Uhr

  • @ausi: Wären Sie bitte so nett und ausführlicher als “vertraue w3schools nicht”? Ich kann das Problem bisher nicht erkennen. Siehe auch Browserübergreifende Probleme mit document.documentElement

    – LarS

    29. März 2014 um 21:48 Uhr

  • OK, es scheint keinen Browser zu geben, der das nicht hat document.documentElement. Wusste das nicht.

    – ausi

    30. März 2014 um 13:01 Uhr

window.innerWidth ist das, was Sie brauchen.

if (window.innerWidth < 768) funktioniert für 768 Haltepunkt in CSS

  • Warum ist es nicht die beste Antwort? Es ist extrem kurz und funktioniert ohne jQuery. Groß!

    – Dzmitri Kulahin

    13. Januar 2020 um 17:58 Uhr

  • Wenn in Safari die Medienabfrage für 768 Pixel ausgelöst wird, gibt window.innerWidth 783 (nicht 768) zurück.

    – Benutzer0474975

    4. November 2020 um 19:14 Uhr

Benutzer-Avatar
Arsen Pjuskyulyan

Problemumgehung, die immer funktioniert und mit CSS-Medienabfragen synchronisiert wird.

Fügen Sie dem Körper ein div hinzu

<body>
    ...
    <div class="check-media"></div>
    ...
</body>

Fügen Sie Stile hinzu und ändern Sie sie, indem Sie eine bestimmte Medienabfrage eingeben

.check-media{
    display:none;
    width:0;
}
@media screen and (max-width: 768px) {
    .check-media{
         width:768px;
    }
    ...
}

Überprüfen Sie dann in JS den Stil, den Sie ändern, indem Sie in die Medienabfrage eintreten

if($('.check-media').width() == 768){
    console.log('You are in (max-width: 768px)');
}else{
    console.log('You are out of (max-width: 768px)');
}

Im Allgemeinen können Sie also jeden Stil überprüfen, der geändert wird, indem Sie eine bestimmte Medienabfrage eingeben.

Meine Erfahrung war, dass die Breite der Medienabfrage document.body.clientWidth verfolgt. Aufgrund des Kommens und Gehens einer vertikalen Bildlaufleiste kann die Überprüfung von document, window oder viewport().width dazu führen, dass mein Javascript zu spät ausgeführt wird – nachdem sich die Medienabfrageregel geändert hat, abhängig von der Höhe des Fensters.

Durch die Überprüfung von document.body.clientWidth konnte mein Skriptcode konsistent ausgeführt werden, während die Medienabfrageregel wirksam wurde.

@media (Mindestbreite: 873px) {

//einige Regeln
}

if ( document.body.clientWidth >= 873) {

// etwas Code
}

Der Code von Andy Langton hat mich darauf gebracht – danke!

  • Wenn der Körper breiter als der Bildschirm ist, funktioniert dies nicht. Ich habe Lösungen gesehen, bei denen ein unsichtbares div fest positioniert ist und seine Breite auf 100% eingestellt ist. Die Verwendung von clientWidht sollte funktionieren.

    – LarS

    29. März 2014 um 22:01 Uhr

Hallo, ich verwende diesen kleinen Trick, damit JS und CSS auf responsiven Seiten problemlos zusammenarbeiten:

Testen Sie die Sichtbarkeit eines Elements, das unter der Bedingung CSS @media size angezeigt wird oder nicht. Mit Bootstrap CSS teste ich die Sichtbarkeit eines versteckten xs-Klassenelements

var msg = "a message for U";

/* At window load check initial size  */
if ( $('#test-xsmall').is(':hidden')  ) {
  /* This is a CSS Xsmall situation ! */
  msg = "@media CSS < 768px. JS width = " + $(window).width() + " red ! ";
  $('.redthing-on-xsmall').addClass('redthing').html(msg);

} else {
  /* > 768px according to CSS  */
  msg = "@media CSS > 767px. JS width = " + $(window).width() + " not red ! ";
  $('.redthing-on-xsmall').removeClass('redthing').html(msg);
}


/* And again when window resize  */

$(window).on('resize', function() {
  if ($('#test-xsmall').is(':hidden')) {
    msg = "@media CSS < 768px. JS width = " + $(window).width() + " red ! ";
    $('.redthing-on-xsmall').addClass('redthing').html(msg);
  } else {
    msg = "@media CSS > 767px. JS width = " + $(window).width() + " not red ! ";
    $('.redthing-on-xsmall').removeClass('redthing').html(msg);
  }
});
@media (min-width: 768px) {
  .hidden-xs {
    display: block !important;
  }
}
@media (max-width: 767px) {
  .hidden-xs {
    display: none !important;
  }
}
.redthing-on-xsmall {
  /* need a scrollbar to show window width diff between JS and css */
  min-height: 1500px;
}
.redthing {
  color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<!-- the CSS managed Element that is tested by JS --> 
<!-- class hidden-xs hides on xsmall screens (bootstrap) -->

<span id="test-xsmall" class="hidden-xs">THIS ELEMENT IS MANAGED BY CSS  HIDDEN on @media lower than 767px</span>


<!-- the responsive element managed by Jquery  -->
<div class="redthing-on-xsmall">THIS ELEMENT IS MANAGED BY JQUERY RED on @media max width 767px </div>

  • Wenn der Körper breiter als der Bildschirm ist, funktioniert dies nicht. Ich habe Lösungen gesehen, bei denen ein unsichtbares div fest positioniert ist und seine Breite auf 100% eingestellt ist. Die Verwendung von clientWidht sollte funktionieren.

    – LarS

    29. März 2014 um 22:01 Uhr

Benutzer-Avatar
Paul Ghiran

Die CSS-Medienabfrage ist gleich window.innerWidth. CSS Media Queries berechnen auch die Bildlaufleiste.

1017910cookie-checkCSS-Medienabfragen und jQuery-Fenster .width() stimmen nicht überein

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy