Quali sono le regole per la sovrapposizione delle query multimediali CSS?


90

Come distanziamo accuratamente le media query per evitare sovrapposizioni?

Ad esempio, se consideriamo il codice:

@media (max-width: 20em) {
    /* for narrow viewport */
}

@media (min-width: 20em) and (max-width: 45em) {
    /* slightly wider viewport */
}

@media (min-width: 45em) {
    /* everything else */
}

Cosa succederà, su tutti i browser di supporto, esattamente a 20em e 45em?

Ho visto persone usare: cose come 799px e poi 800px, ma che dire di una larghezza dello schermo di 799,5 px? (Ovviamente non su un display normale, ma su uno retina?)


Sono più curioso della risposta qui considerando le specifiche.


1
Il titolo della tua domanda attuale non sembra corrispondere a quello che stai chiedendo. Sembra che la prima riga del contenuto della tua domanda si adatterebbe meglio al titolo :)
BoltClock

@BoltClock, grazie come sempre - li ho scambiati; ma come hai interpretato la "spaziatura delle media query"?
Baumr

1
@ Baumr: Bella domanda - non capisco completamente cosa intendi, in realtà. Il resto della domanda lo capisco e sto scrivendo una risposta.
BoltClock

1
Presumo che se avessi una larghezza di esattamente 20em, allora applicherebbe prima le max-width: 20emdefinizioni, quindi applicherebbe anche le min-width: 20emdefinizioni.
utente

1
@ Baumr, credo che stia solo ricadendo come le dichiarazioni CSS generali. Poiché una larghezza di 20em soddisfa entrambe le query, verranno applicate entrambe le definizioni di query.
utente

Risposte:


111

Quali sono le regole per la sovrapposizione delle query multimediali CSS?

Cascata.

@mediale regole sono trasparenti alla cascata, quindi quando due o più @mediaregole corrispondono allo stesso tempo, il browser dovrebbe applicare gli stili a tutte le regole che corrispondono e risolvere la cascata di conseguenza. 1

Cosa succederà, su tutti i browser di supporto, esattamente a 20em e 45em?

Con una larghezza di esattamente 20em, la prima e la seconda media query corrisponderanno. I browser applicheranno gli stili in entrambe le @mediaregole e si sovrapporranno di conseguenza, quindi se ci sono regole in conflitto che devono essere sovrascritte, vince l'ultima dichiarata (tenendo conto di selettori specifici !important, ecc.). Allo stesso modo per la seconda e la terza media query quando il viewport è largo esattamente 45em.

Considerando il codice di esempio, con alcune regole di stile effettive aggiunte:

@media (max-width: 20em) {
    .sidebar { display: none; }
}

@media (min-width: 20em) and (max-width: 45em) {
    .sidebar { display: block; float: left; }
}

Quando il viewport del browser è largo esattamente 20em, entrambe queste media query restituiranno true. Dalla cascata, display: blocksovrascrive display: nonee float: leftsi applicherà a qualsiasi elemento con la classe .sidebar.

Puoi pensarlo come l'applicazione di regole come se le query multimediali non fossero lì per cominciare:

.sidebar { display: none; }
.sidebar { display: block; float: left; }

Un altro esempio di come avviene la cascata quando un browser corrisponde a due o più media query può essere trovato in quest'altra risposta .

Tieni presente, tuttavia, che se hai dichiarazioni che non si sovrappongono in entrambe le @mediaregole, verranno applicate tutte quelle regole. Quello che succede qui è un'unione delle dichiarazioni in entrambe le @mediaregole, non solo il secondo che annulla completamente il primo ... il che ci porta alla tua domanda precedente:

Come distanziamo accuratamente le media query per evitare sovrapposizioni?

Se desideri evitare la sovrapposizione, devi semplicemente scrivere query multimediali che si escludono a vicenda.

Ricorda che i prefissi min-e max-significano "minimo compreso" e "massimo compreso"; questo significa (min-width: 20em)e (max-width: 20em)corrisponderanno entrambi a un viewport largo esattamente 20em.

Sembra che tu abbia già un esempio, che ci porta alla tua ultima domanda:

Ho visto persone usare: cose come 799px e poi 800px, ma che dire di una larghezza dello schermo di 799,5 px? (Ovviamente non su un display normale, ma su uno retina?)

Questo non ne sono del tutto sicuro; tutti i valori di pixel in CSS sono pixel logici e ho avuto difficoltà a trovare un browser che segnalasse un valore di pixel frazionario per una larghezza di visualizzazione. Ho provato a sperimentare con alcuni iframe ma non sono riuscito a trovare nulla.

Dai miei esperimenti sembrerebbe che Safari su iOS arrotondi tutti i valori dei pixel frazionari per garantire che uno dei due max-width: 799pxe min-width: 800pxcorrisponderà, anche se il viewport è in realtà 799,5 px (che apparentemente corrisponde al primo).


1 Sebbene niente di tutto ciò sia esplicitamente dichiarato nel modulo Regole condizionali o nel modulo Cascade (l'ultimo dei quali è attualmente previsto per una riscrittura), è implicito che la cascata avvenga normalmente, poiché la specifica dice semplicemente di applicare gli stili in qualsiasi e tutte le @mediaregole che corrispondono al browser o al supporto.


2
@ Baumr: Nessun problema, anche se non avevo ancora finito - mi ero perso la tua domanda sulla sovrapposizione di query multimediali. Ho aggiornato la mia risposta e con quella la chiamo una notte. Oh, solo per divertimento: le media query sono uno dei miei argomenti preferiti in CSS, ma non sopporto il termine RWD;)
BoltClock

BoltClock, potrebbe essere stata la prima volta che ho usato "RWD" in realtà - la tua fredda accoglienza è stata notata, haha! Buona notte, ma quando torni, controlla l'aggiornamento che ho fatto alla domanda originale. Ora per guardare il tuo aggiornamento ...
Baumr

BoltClock, dovrei togliere quell'aggiornamento e renderlo una sua domanda? Sento di farlo in modo contorto
Baumr

@ Baumr: Sì, è molto meglio così.
BoltClock

BoltClock: L'ho estratto e l'ho inserito in una domanda, si spera, più concisa: come evitare la sovrapposizione delle query multimediali? - se hai suggerimenti di modifica per renderlo più applicabile ad altre persone, per favore condividi. PS Non mi permetto di @ te nei commenti.
Baumr

8

Ho provato come consigliato qui:

@media screen and (max-width: calc(48em - 1px)) {
    /*mobile styles*/
}
@media screen and (min-width: 48em) {
    /*desktop styles*/
}

ma ho scoperto che questa non era una buona idea perché non funziona su Chrome in questo momento né sul mio desktop Ubuntu né sul mio telefono Android. (come spiegato qui: calc () non funziona nelle media query ) Ma ho trovato un modo migliore ...

@media screen and (max-width: 47.9999em) {
    /*mobile styles*/
}
@media screen and (min-width: 48em) {
    /*desktop styles*/
}

e bam!


Questa dovrebbe essere la risposta accettata. BoltClock ha fornito la risposta pedante, ma questa risposta è la più utile!
John Henckel

2

calc()può essere utilizzato per aggirare questo problema (min-width: 50em and max-width: calc(50em - 1px)sarà impilato correttamente), ma scarso supporto del browser e non lo consiglierei.

@media (min-width: 20em) and (max-width: calc(45em - 1px)) {
    /* slightly wider viewport */
}

Informazioni:

Alcuni altri hanno menzionato il fatto che non utilizzare l' emunità aiuterebbe a impilare le query.


7
calc()non fa parte delle specifiche della media query e non funzionerà.
Jason T Featheringham
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.