Welche Regeln gelten für die Überlappung von CSS-Medienabfragen?
Kaskade.
@media
Regeln sind für die Kaskade transparent. Wenn also zwei oder mehr @media
Regeln gleichzeitig übereinstimmen, sollte der Browser die Stile in allen übereinstimmenden Regeln anwenden und die Kaskade entsprechend auflösen. 1
Was passiert in allen unterstützenden Browsern bei genau 20em und 45em?
Bei einer Breite von genau 20 m stimmen sowohl Ihre erste als auch Ihre zweite Medienabfrage überein. Browser wenden Stile sowohl in @media
Regeln als auch in Kaskaden entsprechend an. Wenn also widersprüchliche Regeln überschrieben werden müssen, gewinnt die zuletzt deklarierte (Berücksichtigung bestimmter Selektoren !important
usw.). Ebenso für die zweite und dritte Medienabfrage, wenn das Ansichtsfenster genau 45em breit ist.
In Anbetracht Ihres Beispielcodes wurden einige tatsächliche Stilregeln hinzugefügt:
@media (max-width: 20em) {
.sidebar { display: none; }
}
@media (min-width: 20em) and (max-width: 45em) {
.sidebar { display: block; float: left; }
}
Wenn das Browser-Ansichtsfenster genau 20 cm breit ist, geben diese beiden Medienabfragen true zurück. Durch die Kaskade werden alle Elemente der Klasse display: block
überschrieben display: none
und float: left
angewendet .sidebar
.
Sie können sich vorstellen, Regeln anzuwenden, als wären die Medienabfragen zunächst nicht da:
.sidebar { display: none; }
.sidebar { display: block; float: left; }
Ein weiteres Beispiel dafür, wie die Kaskade stattfindet, wenn ein Browser zwei oder mehr Medienabfragen entspricht, finden Sie in dieser anderen Antwort .
Seien Sie jedoch gewarnt, dass alle diese Regeln gelten , wenn Sie Erklärungen haben, die sich in beiden @media
Regeln nicht überschneiden . Was hier passiert, ist eine Vereinigung der Erklärungen in beiden @media
Regeln, nicht nur die letztere, die die erstere vollständig außer Kraft setzt ... was uns zu Ihrer früheren Frage bringt:
Wie platzieren wir Medienabfragen genau, um Überschneidungen zu vermeiden?
Wenn Sie Überschneidungen vermeiden möchten, müssen Sie lediglich Medienabfragen schreiben, die sich gegenseitig ausschließen.
Denken Sie daran, dass die Präfixe min-
und max-
"Minimum inklusive" und "Maximum inklusive" bedeuten. diese Mittel (min-width: 20em)
und (max-width: 20em)
wird sowohl ein Ansichtsfenster übereinstimmen , das ist genau das , 20em breit.
Es sieht so aus, als hätten Sie bereits ein Beispiel, das uns zu Ihrer letzten Frage bringt:
Ich habe gesehen, wie Leute verwendet haben: Dinge wie 799px und dann 800px, aber was ist mit einer Bildschirmbreite von 799,5 px? (Offensichtlich nicht auf einem normalen Display, sondern auf einer Retina?)
Das bin ich mir nicht ganz sicher; Alle Pixelwerte in CSS sind logische Pixel, und es ist mir schwer gefallen, einen Browser zu finden, der einen gebrochenen Pixelwert für eine Ansichtsfensterbreite meldet. Ich habe versucht, mit einigen Iframes zu experimentieren, konnte mir aber nichts einfallen lassen.
Aus meinen Experimenten geht hervor, dass Safari unter iOS alle gebrochenen Pixelwerte rundet, um sicherzustellen, dass einer von beiden übereinstimmt max-width: 799px
und min-width: 800px
übereinstimmt, auch wenn das Ansichtsfenster tatsächlich 799,5 Pixel groß ist (was anscheinend mit dem ersteren übereinstimmt).
1 Obwohl nichts davon explizit entweder in dem angegebenen Conditional Rules - Modul oder die Cascade - Modul (von denen die letztere derzeit für eine Rewrite geplant), wird die Kaskade implizierten Ort normalerweise zu nehmen, da einfach die Spezifikation sagt Stile in jedem anwenden und alle @media
Regeln, die dem Browser oder den Medien entsprechen.