media query是css3規範中引入的,它提供了一種responsive design的基礎機制:瀏覽器在不同size的裝置中將以不同樣式展現網頁,這就給一個網頁能夠適應不同device一種可能。在實際使用中,我常常碰到以下問題:為什麼media query的rule不起作用?很有可能和你的media query所處的位置有關,也很有可能和media query中的selector權重不
如外面的targeting到相同元素的css權重有關,比如:
@media screen and (max-width: 960px) { p{ background-color:red; } } p{ background-color: blue; }
在上面的query程式碼中,我們希望在小於960px時,p應用一個red背景,但是由於後面有同樣權重的p選擇器定義了blue的背景,根據css的層疊特性,後面的(normal p rule)將覆蓋前面的(media queried p rule)規則,所以即使在screen為小於960px時,仍然無法應用media query中的css定義。
解決方案和最佳實踐
將media query block放到通用規則的後面
再比如,如果media query中定義的css rule權重太低,則同樣不會被適用:
<html> <head> <title></title> <style type="text/css"> p,.higher{ background-color: blue; } @media screen and (max-width: 960px) { p{ background-color:red; } } </style> </head> <body> <p class="higher">testing p tag for css rule巢狀vs normal css</p> </body> </html>
上面的例子中,在media query中只用了一個p元素選擇器,但是由於在html中,該p又有一個class相關聯,而css定義中,也有對該class的定義。這樣即使media query的條件滿足了,但是由於權重太低,依然無法應用其規則!
解決方案和最佳實踐
media query必須目標明確,真正選中要選的元素,和外部普通css選擇器需要是完全一樣的。最好在普通的css選擇器規則之後,立即放對該選擇器設定樣式的media query規則
這個原因就是所謂層疊特性,當css被優先順序權重完全一樣的選擇器選中時,則後面的會覆蓋前面的@!!
//注意:在html中的class擺列順序由於其優先順序完全一樣,所以順序沒有關係,有關係的是其在css定義中出現的順序,後面的將覆蓋前面的rule,初學者容易搞混淆 <p class="specialred modifyblue">優先順序層疊演示</p> .modifyblue{ color: blue; } .specialred{ color: red; }