【问题标题】:CSS Precedence and media queriesCSS 优先级和媒体查询
【发布时间】:2012-11-27 11:56:43
【问题描述】:

我有 .cssClass 包含:

// fallback without calc
width: 60%; 
@media (max-width: 500px) { width: 58%; }
@media (max-width: 460px) { width: 55%; }
@media (max-width: 420px) { width: 50%; }
@media (max-width: 380px) { width: 45%; }
@media (max-width: 340px) { width: 40%; }
// using calc
width: -webkit-calc(70% - (34px + 1.12em));
width: -moz-calc(70% - (34px + 1.12em));
width: -ms-calc(70% - (34px + 1.12em));
width: -o-calc(70% - (34px + 1.12em));
width: calc(70% - (34px + 1.12em));

所以如果浏览器支持calc,它将替换之前定义的宽度(60%),并使用calc的方法。

但是在调整大小时它仍然使用媒体查询,用查询值替换计算值。

我在不支持 calc 的浏览器中得到了很好的结果,因为它只是省略了所有这些东西,但是支持 calc 的浏览器会获得与后备查询混合的 calc 结果。

我该怎么办?如果没有计算支持,我只希望媒体查询运行。

我正在寻找不涉及 JavaScript 的解决方案或其他方法。

【问题讨论】:

    标签: css sass media-queries


    【解决方案1】:

    SASS 将对嵌套属性进行排序以使媒体查询排在最后。

    以下是发生的一些示例:

    SCSS

    body {
        background: #000000; //black
    
        @media (max-width: 500px) { 
            background: #990000; //red
        }
    
        background: #000099; //blue
    
        @media (max-width: 300px) { 
            background: #009900; //green
        }
    }
    

    输出 CSS

    body {
        background:#000;
        background:#009
    }
    @media (max-width: 500px) {
        body {
            background:#900
        }
    }
    @media (max-width: 300px) {
        body {
            background:#090
        }
    }
    

    Demo

    您可以做的是放入第二个嵌套来操纵排序顺序:

    SCSS

    body {
        background: #000000; //black
    
        @media (max-width: 500px) { 
            background: #990000; //red
        }
    
    
    }
    body {
        background: #000099; //blue
    
        @media (max-width: 300px) { 
            background: #009900; //green
        }
    }
    

    输出 CSS

    body {
        background:#000
    }
    @media (max-width: 500px) {
        body {
            background:#900
        }
    }
    body {
        background:#009
    }
    @media (max-width: 300px) {
        body {
            background:#090
        }
    }
    

    Demo

    所以你可以用你的代码来做这件事,它应该按正确的顺序排序:

    SCSS

    .cssClass {
        // fallback without calc
        width: 60%; 
        @media (max-width: 500px) { width: 58%; }
        @media (max-width: 460px) { width: 55%; }
        @media (max-width: 420px) { width: 50%; }
        @media (max-width: 380px) { width: 45%; }
        @media (max-width: 340px) { width: 40%; }
    }
    .cssClass {
        // using calc
        width: -webkit-calc(70% - (34px + 1.12em));
        width: -moz-calc(70% - (34px + 1.12em));
        width: -ms-calc(70% - (34px + 1.12em));
        width: -o-calc(70% - (34px + 1.12em));
        width: calc(70% - (34px + 1.12em));
    }
    

    【讨论】:

    • 在我看来,@media 规则将放在所有 calc() 声明之后,从而有效地使 (max-width: 500px) 及以下声明无效。事实上,如果 OP 最初是这样写的,我不会感到惊讶。
    • 太棒了,正是我想要的。感谢您的明确解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多