Quelles sont les règles CSS media query se chevauchent?
Comment pouvons-nous espace media queries avec précision afin d'éviter les chevauchements?
Par exemple, si nous considérons le code:
@media (max-width: 20em) {
/* for narrow viewport */
}
@media (min-width: 20em) and (max-width: 45em) {
/* slightly wider viewport */
}
@media (min-width: 45em) {
/* everything else */
}
Ce qui va se passer, à travers l'appui des navigateurs, à exactement 20em, et 45em?
J'ai vu des gens utiliser: des choses comme 799px et puis 800px, mais ce que sur un écran d'une largeur de 799.5 px? (Évidemment pas sur un affichage normal, mais une rétine une?)
Je suis plus curieux de connaître la réponse ici, compte tenu de la spec.
- Votre question actuelle du titre ne semble pas correspondre à ce que vous demandez. Il semble que la première ligne de votre contenu de la question vaudrait mieux que le titre 🙂
- merci, comme toujours — j'ai changé autour d'eux; mais comment avez-vous interpréter "espacement des requêtes de média"?
- devinez @media (...) est inférieur ou égal, supérieur ou égal. vous feriez mieux d'utiliser de pixels max-width
- Bonne question - je ne comprends pas très bien comprendre ce que tu veux dire par là, en fait. Le reste de la question, je comprends et je suis en train d'écrire une réponse.
- pourquoi ne pas essayer vous-même jsfiddle.net/x2Lz8/2
- ah, je peux voir pourquoi. Par manque d'un meilleur mot, j'ai été en utilisant 'espace' plus ou moins comme un antonyme de se "superposer"
- Je suppose que si vous avait une largeur de exactement 20em, alors il faudrait d'abord appliquer la
max-width: 20em
définitions, puis d'appliquer également lemin-width: 20em
définitions. - mais vous avez ajouté un 10px écart entre chaque requête de média — évidemment, il n'aura aucun arrière-plan. Si vous avez illustré que mal (si pas prévu). Mais un chevauchement excessif pourrait aussi être mauvais.
- du bon sens, mais que serait le spec dire? (Et ce que les différents navigateurs n'en réalité, c'est autre chose, je suis maintenant curieux de savoir.)
- Qui est correct.
- Je crois qu'il est juste en cascade le même que le général de déclarations CSS. Depuis une largeur de 20em satisfait à la fois les requêtes, les deux définitions de requête sont va être appliquée.
Vous devez vous connecter pour publier un commentaire.
Cascade.
@media
les règles sont transparentes à la cascade, de sorte que lorsque deux ou plus de deux@media
règles de correspondance dans le même temps, le navigateur devrait appliquer les styles, dans toutes les règles de ce match, et de résoudre la cascade en conséquence.1Exactement 20em large, votre première et de la deuxième requête de média sera à la fois du match. Les navigateurs appliquer des styles à la fois
@media
règles et cascade en conséquence, donc si il y a un conflit de règles qui doivent être remplacées, ce dernier a déclaré que l'on gagne (comptabilité spécifique des sélecteurs,!important
, etc). De même pour la deuxième et la troisième requête de média lorsque la fenêtre est exactement 45em de large.Compte tenu de votre code d'exemple, avec quelques règles de style ajouté:
Lorsque le navigateur de la fenêtre d'affichage est exactement 20em large, ces deux requêtes de média renvoie la valeur true. Par la cascade,
display: block
remplacedisplay: none
etfloat: left
va s'appliquer sur n'importe quel élément avec la classe.sidebar
.Vous pouvez considérer que l'application des règles comme si les requêtes de média n'étaient pas là pour commencer:
Un autre exemple de la façon dont la cascade a lieu lorsqu'un navigateur correspond à deux ou plusieurs requêtes de média peuvent être trouvés dans cette autre réponse.
Soyez averti, cependant, que si vous avez des déclarations qui ne pas des chevauchements dans les deux
@media
règles, alors toutes ces règles s'appliquent. Ce qui se passe ici est un union des déclarations dans les deux@media
règles, et pas seulement ce dernier complètement contredire l'ancien... ce qui nous amène à votre question précédente:Si vous souhaitez éviter les chevauchements, il vous suffit d'écrire des requêtes de média qui sont mutuellement exclusifs.
Rappelez-vous que le
min-
etmax-
préfixes signifie "minimum", et le "maximum inclusive", ce qui signifie(min-width: 20em)
et(max-width: 20em)
sera à la fois correspondre à une fenêtre qui est exactement 20em de large.Il semble que vous avez déjà un exemple, qui nous amène à votre dernière question:
Cela, je ne suis pas entièrement sûr; toutes les valeurs de pixel dans les CSS sont logiques pixels, et j'ai eu du mal à trouver un navigateur qui ferait rapport à la fraction de valeur de pixel pour une largeur de visualisation. J'ai essayé d'expérimenter avec certains des iframes, mais qui n'ont pas été en mesure de trouver quoi que ce soit.
À partir de mes expériences, il semblerait Safari sur iOS tours de toutes les fractions des valeurs de pixels de s'assurer que l'un des
max-width: 799px
etmin-width: 800px
correspondent, même si la fenêtre est vraiment 799.5 px (qui apparemment correspond à l'ancien).1 Bien que rien de cela n'est indiqué explicitement dans la Règles conditionnelles module ou la Cascade module (dont le dernier est actuellement prévu pour une réécriture), la cascade est implicite avoir lieu normalement, depuis la spec dit simplement à appliquer les styles et dans tous les
@media
règles qui correspondent le navigateur ou les médias.em
et le calcul de celle-ci).calc()
peut être utiliser pour contourner ce(min-width: 50em and max-width: calc(50em - 1px)
sera correctement empilés), mais une mauvaise prise en charge du navigateur et je n'aurais pas à le recommander.Infos:
Certains d'autres l'ont mentionné, et non pas à l'aide de la
em
unité aider dans votre recherche d'empilement.calc()
n'est pas une partie de la requête de média spec et ne fonctionnera pas.J'ai essayé comme recommandé ici:
mais ce n'était pas une bonne idée car il ne fonctionne pas sur Chrome dès maintenant sur mon bureau Ubuntu ou sur mon téléphone Android. (comme expliqué ici: calc() ne fonctionne pas dans les requêtes des médias) Mais, j'ai trouvé une meilleure façon...
et bam!