CSS メディアクエリのオーバーラップのルールは何ですか?
カスケード。
@media
ルールはカスケードに対して透過的であるため、2 つ以上の@media
ルールが同時に一致する場合、ブラウザは一致するすべてのルールにスタイルを適用し、それに応じてカスケードを解決する必要があります。1
サポートしているすべてのブラウザーで、正確に 20em と 45em で何が起こるでしょうか?
幅がちょうど 20em の場合、最初と 2 番目のメディア クエリは両方とも一致します。ブラウザーは両方のルールにスタイルを適用し@media
、それに応じてカスケードします。そのため、オーバーライドする必要がある競合するルールがある場合は、最後に宣言されたルールが優先されます (特定のセレクター!important
などを考慮して)。ビューポートの幅が正確に 45em の場合の 2 番目と 3 番目のメディア クエリについても同様です。
サンプルコードを考慮して、いくつかの実際のスタイルルールを追加します:
@media (max-width: 20em) {
.sidebar { display: none; }
}
@media (min-width: 20em) and (max-width: 45em) {
.sidebar { display: block; float: left; }
}
ブラウザーのビューポートの幅がちょうど 20em の場合、これらのメディア クエリはどちらも true を返します。カスケードによってdisplay: block
オーバーライドdisplay: none
さfloat: left
れ、 class を持つすべての要素に適用されます.sidebar
。
メディア クエリが最初から存在しないかのようにルールを適用すると考えることができます。
.sidebar { display: none; }
.sidebar { display: block; float: left; }
ブラウザが 2 つ以上のメディア クエリに一致するときにカスケードが発生する方法の別の例は、この他の回答にあります。
ただし、両方のルールで重複しない@media
宣言がある場合は、それらのすべてのルールが適用されることに注意してください。ここで起こることは、両方のルールの宣言の結合@media
であり、後者が前者を完全に却下するだけではありません...これはあなたの以前の質問に私たちをもたらします:
重複を避けるためにメディア クエリを正確に配置するにはどうすればよいでしょうか?
重複を避けたい場合は、相互に排他的なメディア クエリを作成する必要があります。
min-
およびmax-
接頭辞は、「最小の包括的」および「最大の包括的」を意味することに注意してください。これは、正確に 20em 幅のビューポートに一致することを意味(min-width: 20em)
します。(max-width: 20em)
あなたはすでに例を持っているようです。それがあなたの最後の質問につながります。
799px に続いて 800px を使用している人を見てきましたが、799.5 px の画面幅はどうでしょうか? (明らかに通常のディスプレイではなく、Retina ディスプレイですか?)
これは完全にはわかりません。CSS のすべてのピクセル値は論理ピクセルであり、ビューポート幅の小数ピクセル値を報告するブラウザーを見つけるのに苦労しました。いくつかの iframe を試してみましたが、何も思いつきませんでした。
私の実験では、ビューポートが実際には 799.5px (明らかに前者と一致する) であっても、iOS 上の Safari はすべての小数ピクセル値を四捨五入して、 と のいずれかmax-width: 799px
が一致するように見えます。min-width: 800px
1 条件付きルール モジュールまたはカスケード モジュール(後者は現在書き直しが予定されている)のいずれにも明示的に記述されていませんが、カスケードは正常に行われることが暗示されています。ブラウザまたはメディアに一致するすべてのルール。@media