Apa aturan untuk kueri media CSS yang tumpang tindih?
Riam.
@media
aturan transparan ke kaskade, jadi ketika dua @media
aturan atau lebih cocok pada saat yang sama, browser harus menerapkan gaya di semua aturan yang cocok, dan menyelesaikan kaskade yang sesuai. 1
Apa yang akan terjadi, di semua browser pendukung, tepat pada 20em, dan 45em?
Dengan lebar tepat 20em, kueri media pertama dan kedua Anda akan cocok. Browser akan menerapkan gaya di kedua @media
aturan dan kaskade yang sesuai, jadi jika ada aturan yang bertentangan yang perlu diganti, aturan yang terakhir dinyatakan menang (memperhitungkan pemilih tertentu !important
, dll). Begitu juga untuk media query kedua dan ketiga saat viewport tepat lebarnya 45em.
Mempertimbangkan kode contoh Anda, dengan beberapa aturan gaya aktual ditambahkan:
@media (max-width: 20em) {
.sidebar { display: none; }
}
@media (min-width: 20em) and (max-width: 45em) {
.sidebar { display: block; float: left; }
}
Jika area pandang browser tepat selebar 20em, kedua kueri media ini akan mengembalikan nilai true. Dengan kaskade, display: block
menimpa display: none
dan float: left
akan diterapkan pada elemen apa pun dengan kelas .sidebar
.
Anda dapat menganggapnya sebagai menerapkan aturan seolah-olah kueri media tidak ada di sana pada awalnya:
.sidebar { display: none; }
.sidebar { display: block; float: left; }
Contoh lain bagaimana kaskade terjadi saat browser cocok dengan dua atau lebih kueri media dapat ditemukan di jawaban lain ini .
Namun berhati-hatilah, jika Anda memiliki deklarasi yang tidak tumpang tindih di kedua @media
aturan, maka semua aturan tersebut akan berlaku. Apa yang terjadi di sini adalah penyatuan deklarasi di kedua @media
aturan, tidak hanya yang terakhir sepenuhnya mengesampingkan yang pertama ... yang membawa kita ke pertanyaan Anda sebelumnya:
Bagaimana kita membagi kueri media secara akurat untuk menghindari tumpang tindih?
Jika Anda ingin menghindari tumpang tindih, Anda hanya perlu menulis kueri media yang saling eksklusif.
Ingat bahwa awalan min-
dan max-
berarti "inklusif minimum" dan "inklusif maksimum"; ini berarti (min-width: 20em)
dan (max-width: 20em)
akan cocok dengan viewport yang lebarnya tepat 20em.
Sepertinya Anda sudah memiliki contoh, yang membawa kita ke pertanyaan terakhir Anda:
Saya pernah melihat orang-orang menggunakan: hal-hal seperti 799px dan kemudian 800px, tapi bagaimana dengan lebar layar 799.5 px? (Jelas bukan pada tampilan biasa, tapi tampilan retina?)
Ini saya tidak sepenuhnya yakin; semua nilai piksel di CSS adalah piksel logis, dan saya kesulitan menemukan browser yang akan melaporkan nilai piksel pecahan untuk lebar viewport. Saya sudah mencoba bereksperimen dengan beberapa iframe tetapi belum dapat menemukan apa pun.
Dari percobaan saya, tampaknya Safari di iOS membulatkan semua nilai piksel pecahan untuk memastikan bahwa salah satu dari max-width: 799px
dan min-width: 800px
akan cocok, bahkan jika viewport benar-benar 799.5px (yang tampaknya cocok dengan yang pertama).
1 Meskipun tidak ada yang secara eksplisit dinyatakan baik dalam modul Aturan Bersyarat atau modul Kaskade ( modul yang terakhir saat ini dijadwalkan untuk penulisan ulang), kaskade tersirat berlangsung secara normal, karena spesifikasi hanya mengatakan untuk menerapkan gaya di dan semua @media
aturan yang cocok dengan browser atau media.