Wie platzieren wir Medienabfragen genau, um Überschneidungen zu vermeiden?
Wenn wir zum Beispiel den Code betrachten:
@media (max-width: 20em) {
/* for narrow viewport */
}
@media (min-width: 20em) and (max-width: 45em) {
/* slightly wider viewport */
}
@media (min-width: 45em) {
/* everything else */
}
Was passiert in allen unterstützenden Browsern bei genau 20em und 45em?
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?)
Ich bin sehr gespannt auf die Antwort hier angesichts der Spezifikation.
max-width: 20em
Definitionen und dann auch diemin-width: 20em
Definitionen angewendet .Antworten:
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. 1Bei 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:
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
überschriebendisplay: none
undfloat: left
angewendet.sidebar
.Sie können sich vorstellen, Regeln anzuwenden, als wären die Medienabfragen zunächst nicht da:
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: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-
undmax-
"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:
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
undmin-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.quelle
Ich habe versucht, wie hier empfohlen:
Ich fand jedoch, dass dies keine gute Idee war, da es derzeit weder auf meinem Ubuntu-Desktop noch auf meinem Android-Handy unter Chrome funktioniert. (wie hier erklärt: calc () funktioniert nicht in Medienabfragen ) Aber ich habe einen besseren Weg gefunden ...
und bam!
quelle
calc()
kann verwendet werden, um dies(min-width: 50em and max-width: calc(50em - 1px)
zu umgehen, wird korrekt gestapelt), aber schlechte Browser-Unterstützung und ich würde es nicht empfehlen.Infos:
Einige andere erwähnten,
em
wenn Sie das Gerät nicht verwenden, können Sie Ihre Fragen besser stapeln.quelle
calc()
ist nicht Teil der Medienabfragespezifikation und funktioniert nicht.