【问题标题】:SASS/CSS: Media Queries prone to breakingSASS/CSS:容易中断的媒体查询
【发布时间】:2014-08-03 19:43:26
【问题描述】:

我在编写媒体查询以使我的网站响应时遇到一些问题。为了保持一切整洁,我将移动样式表写在一个单独的文件 (mobile.css.scss) 中,如下所示:

@media (min-width: 340px) and (max-width: 767px){

    /* hide desktop only code and display mobile elements */

    .menu{display: none;}
    .banner-desktop{display: none;}
    .banner-mobile{
        display: block !important;
        img{width: 99%;}
    }

    /* general styling */

    .page-body{
        width: 99% !important;
    }
}

我的桌面样式在 application.css.scss 中:

body{

    /* Hide mobile only stuff */
    .banner-mobile{display:none;}

    /* General Styling */

    .page-body{
        width: 1167px;
        margin: 0 auto;
        padding: 0;     
    }
}

问题是某些移动样式不会被读取,除非我在它旁边有 !important,如上所示。我是新手,还不是 100% 熟悉 css/sass,但我有理由确定这种方法不是解决问题的方法。我最终可能会在整个样式表中使用 !important!

我真的不确定我做错了什么,所以非常感谢任何帮助。

【问题讨论】:

    标签: css ruby-on-rails sass


    【解决方案1】:

    使用!important 应该永远是你最后的手段,它们几乎总是导致比它们解决的更具体的问题。媒体查询不会改变选择器的特性。如果选择器的特异性相等,则最后匹配的选择器获胜。

    当你有这个时:

    @media (min-width: 30em) {
        .foo {
            color: red;
        }
    }
    
    .foo {
        color: blue;
    }
    

    对于宽度大于 30em 的设备,同理:

    .foo {
        color: red;
    }
    
    .foo {
        color: blue;
    }
    

    所以,你真正要找的是这样的:

    // styles that apply to *all* devices go here (see: mobile first methodology)
    // repeatedly setting/unsetting styles is inefficient and should be
    // avoided whenever it is reasonable to do so
    
    @media (max-width: 767px) { // narrow viewport only
        .menu, .banner-desktop {
            display: none;
        }
    }
    
    @media (min-width: 767px) { // bigger than the narrow viewport
        .banner-mobile {
            display: none;
        }
    }
    

    拥有单个 CSS 文件的好处为零,因为所有设备都会下载它们,即使它们当前与媒体查询不匹配。

    【讨论】:

    • 那么你的意思是我应该在一个样式表中包含我的所有样式?先把适用于所有东西的东西放在移动设备上,然后再放在更大的设备上?这实际上听起来很有意义,但是将所有内容放在一个样式表中可能会非常非常混乱。使用带有 rails 的脚手架会为每个控制器生成一个样式表,所以我一直认为这有助于保持样式整洁有序。我的假设有误吗?
    • 从客户的角度来看,这样做没有任何好处。最终的 CSS 文件是什么样子无关紧要(只要它经过合理优化):重要的是您的 Sass 代码以对您有意义的方式组织。拥有特定于页面/页面组的单独样式表可能是一种合理的优化,但很少需要。这样做可能还有其他原因,但这超出了本问题的范围。
    • 好的,我稍后会进行一些重新组织,然后再深入到样式以使这样的任务变得不可取。感谢@cimmonon 的输入,我会告诉你我的进展情况。
    • 我已接受您的回答,因为根据您的建议重新组织我的媒体查询意味着不再需要 !important。非常感谢您的帮助!
    【解决方案2】:

    这是一个常见的问题

    --

    !重要

    我们已经完成了responsive interface work before,发现您必须使用!important 才能使许多元素工作。

    我认为问题在于 @media 查询基本上只是将一组新样式附加到您的元素(有点像内联样式的工作方式)

    这意味着如果你想覆盖特定的值(据我所知,width 就是其中之一),你需要使用!important

    --

    底线是我不认为你通过调用 !important 做任何“错误” - 你只需要能够保持代码结构和干净

    【讨论】:

    • 真的吗?嗯,这是一种解脱知道。我确信我做错了什么。感谢您的帮助。
    • 使用!important 被认为是有害的,除非万不得已,否则永远不要使用它。这不是其中一种情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2017-06-08
    相关资源
    最近更新 更多