不覆盖原始样式的媒体查询样式

Posted

技术标签:

【中文标题】不覆盖原始样式的媒体查询样式【英文标题】:Media Query Styles Not Overriding Original Styles 【发布时间】:2013-10-03 00:17:12 【问题描述】:

我正在尝试对我正在构建的网站使用一些媒体查询。然而,我遇到的问题是,在实际应用媒体查询样式时,它们被覆盖了。我一生都无法说出原因,因为我使用的是完全相同的选择器。谁能指出我没有看到的东西?

原始 CSS

#global-wrapper-outer > #global-wrapper-inner 
    width: 85%;
    height: 100%;
    margin: 0 auto;
    position: relative;

    #global-wrapper-outer > #global-wrapper-inner > nav 
        background: #fff;
        padding-bottom: 20px;
        box-shadow: 0 4px 2px -2px gray;
    

媒体查询 CSS

@media screen and (max-width:1024px) 
    #global-wrapper-outer > #global-wrapper-inner 
        width: 100%;
    
    #global-wrapper-outer > #global-wrapper-inner > nav 
        display: none;
    

第二个媒体查询工作正常,我将导航设置为无显示。但是,当我尝试将 #global-wrapper-inner 的宽度设置为 100% 时,它不适用。当我按 F12 并选择该元素时,我可以看到样式正在“应用”。但是,样式本身被划掉了,并没有实际应用,它仍然具有 85% 的原始宽度。

【问题讨论】:

【参考方案1】:

原始 CSS 中的选择器与媒体查询中的选择器具有相同的 specificity(第一个声明也针对相同的属性 - width)并且因为媒体查询规则集被覆盖,所以我假设它出现在之前原始规则集。

第二个媒体查询选择器之所以有效,是因为它所针对的属性未在您的原始 CSS 中设置,因此与特定性无关。

要让第一个媒体查询选择器优先,请在其前面添加一个祖先元素:

@media screen and (max-width:1024px) 
    body #global-wrapper-outer > #global-wrapper-inner 
         width: 100%;
    
    #global-wrapper-outer > #global-wrapper-inner > nav 
        display: none;
    

【讨论】:

就是这样。很高兴知道。非常感谢。现在问你一个问题,我是否将 标记附加到它,然后稍后在另一个媒体查询中使用相同的特异性来说当它低于 768 像素时将其更改回 85% 宽度。它是否需要另一个祖先,还是因为您说媒体查询没有特异性,所以可以吗? 解决这个问题,我测试了它,它的工作方式和我想的一样。不需要增加特异性。再次感谢! 使用您的解决方案或在媒体查询中添加 !important 有什么区别? 有人能解释一下为什么你必须在它前面加上一个祖先元素吗?它必须是祖先元素还是可以是同一级别的元素? 您必须在其上添加祖先元素,因为该元素使其更加具体。你也可以做一个兄弟元素,它必须是使它比其他规则更具体的任何东西。这当然可以通过让媒体查询出现在非媒体 CSS 之后来解决。【参考方案2】:

您需要比普通的 css 文件 (style.css) 链接媒体查询文件 (queries.css)。这样,querys.css 中的规则将覆盖 style.css 中的规则。

【讨论】:

这是正确的方法——因为它是最优雅的。 这对我来说是个问题。我有我的核心样式,然后是页面特定的移动样式,然后是页面普通样式,这是错误的顺序。设置为核心样式,页面样式然后页面移动样式完美运行。【参考方案3】:

我至少花了 2 个小时试图找到覆盖 CSS 的问题,直到我发现我的线路 cmets 出了问题……而且 CSS 的第二个定义不起作用:

所以,不要像我一样愚蠢!:

/* LITTLE SCREENS */ 

@media screen and (max-width: 990px) 
    ... whatever ...


/*  BIG SCREENS */ 

@media screen and (min-width: 990px) 
    ... whatever more ...

从不使用:像我一样使用双杠:

// This is not a comment in CSS!

/* This is a comment in CSS! */

【讨论】:

是时候转向 SCSS 了 :)【参考方案4】:

根据您提交的代码,这可能无法解决您的问题。但是,如果您将样式嵌套在另一个 CSS 中:

.main-container 
  .main 
    background: blue;
  


由于嵌套,.main 的媒体查询将不起作用。从.main-container 中取出.main,然后媒体查询将按假设工作:

.main-container 



.main 
  background: blue;

【讨论】:

【参考方案5】:

检查您的媒体查询大括号是否相等。

有时它非常微妙,但是当您错过一个大括号时,针对某些断点提到的其余媒体查询将不起作用

示例:

@media(min-width: 768px) and (max-width: 991px)




@media (max-width: 767px)

    .navbar-brand p 
    
        font-size: .6em;
        margin-top: 12px;
       
    .navbar-brand img height: 20px;   

    #collapsable-nav a 
        font-size: 1.2em;
        

    #collapsable-nav a span 
    font-size: 1.2em;

在这里你可以看到我已经开始了 max-width:991px 的大括号,但忘记结束,所以媒体查​​询中 max-width:767px 的下一组代码将不起作用。 这是一个非常简单的错误,但由于代码中有很多大括号,所以花了几个小时。 希望能帮助到你。快乐编码!

【讨论】:

【参考方案6】:

使用!important 怎么样?如果您的媒体查询范围从( min-width: 176px )( max-width: 736px ) 甚至到980px

【讨论】:

使用!important 被高估了。这不是处理覆盖的好方法。【参考方案7】:

这就是答案。 (至少对我有用)

我以前也遇到过这个问题,我花了一段时间才意识到我做了什么,但是一旦我弄清楚它实际上很容易。

好吧,想象一下我有这个html

<main>
  <div class = "child1"> </div>
  <div class = "child2"> </div>
</main>

然后这是CSS

main .child1
 height: 50px;


/* now let's try to use media quaries */


@media only screen and (max-width: 768px) 
   .child1
     width: 75%;
   


上面的代码不会影响 .child。就像上面提到的人一样,main .child1 覆盖.child1。所以你让它工作的方式是选择元素,就像我们在上面 CSS 的开头所做的那样。

/* this will work */


@media only screen and (max-width: 768px) 
   main .child1
     width: 75%;
   


因此,作为结论...每次都以相同的方式选择元素。 含义...例如在上面的代码中,在您的 CSS 中,您应该在整个 CSS 中将其选择为 main .child1.child1 ,否则它们会混淆,最终会覆盖另一个。

【讨论】:

【参考方案8】:

可能有一些原因会导致此类错误发生。 我自己也遇到了这个问题,我无法理解我需要做什么并且很困惑,媒体查询是否只是覆盖了元素。 这是我的理解:

媒体查询 CSS:

@media screen and (max-width:1024px) 
    #global-wrapper-outer > #global-wrapper-inner 
        width: 100%;
    
    #global-wrapper-outer > #global-wrapper-inner > nav 
        display: none;
    

在这里,您可以覆盖 #global-wrapper-inner > nav,即第二个媒体查询选择器,通过 display: none; 因为您从未在原始 css 中添加显示行,因此没有什么可以覆盖您只是给出了显示类型应该为无。 而就在第一个媒体查询选择器中,您已经给出了 width:80%; 据我所知,基本上媒体查询不会覆盖,但它优先,就像其中一个已经解释过的那样 媒体查询通过哪些方式起作用: https://***.com/a/19038303/15394464

如果你的疑问还没有弄清楚,https://www.youtube.com/watch?v=acqN6atXVAE&t=288s 那么这可能会有所帮助。

【讨论】:

以上是关于不覆盖原始样式的媒体查询样式的主要内容,如果未能解决你的问题,请参考以下文章

媒体查询_网页打印样式

Styled Components - 内联样式与媒体查询样式重叠

横向打印的媒体查询?

使用媒体查询内联样式[重复]

HTML/CSS 媒体查询

pc端响应式-媒体查询