【问题标题】:CSS nested rules, unexpected behaviour for overriding rulesCSS 嵌套规则,覆盖规则的意外行为
【发布时间】:2014-06-06 03:19:35
【问题描述】:

我遇到了一种奇怪的行为,但它可能是应该的,但它是意外和不受欢迎的。

示例 HTML:

<div class='rtl'>

    <div class='ltr'>

        <div class='floatleft'>
            A 
        </div>        
        <div class='floatleft'>
            B
        </div>

    </div>

</div>

和 CSS:

.ltr .floatleft {  
    float:left;
}

.rtl .floatleft {  
    float:right;
}

但是输出是向右浮动的,因为它是最后在 css 文件中指定的规则:.rtl .floatleft { float: right }

但是,由于类 'ltr' 是在嵌套元素上指定的,我希望或希望该规则优先,以便您始终可以覆盖祖先应用的任何内容。

但这不起作用。有没有我在这里看不到的方法?

这是另一个与此类似的问题:

CSS select next match

【问题讨论】:

    标签: html css web


    【解决方案1】:

    这只是在这种情况下编写样式的顺序。

    .ltr .floatleft.rtl .floatleft 都等于 true。因此,无论哪一条是 CSS 文件中的最终规则,都将具有优先权。

    您需要为您实际想要执行的任何规则添加更多特异性。

    这是一个示例,说明您的样式如何根据您放置它们的顺序而有所不同:

    JSFiddle with orders swapped and then direct descendant examples.

    【讨论】:

    • 是的,我明白这一点。但是,我相信人们之前已经提出过这个要求。如果内容是由用户提供或开发的,并且您已经在其上全局指定了规则,则无法覆盖该内容。它与 rtl 语言的特殊用例有关 ... float:left 应该变成 float:right ... 它首先在根 html 标记上定义 .. 然后任何提供的内容本身可以指定其子项应该如何浮动...现在它来自上帝,没有人可以改变它.. CSS 应该在这方面成熟
    • CSS 代表层叠样式表。规则“级联”。它所寻找的只是规则是真还是假。在这种情况下,您有两个正确的陈述,因此最后出现的规则将具有优先权。
    • 令人讨厌的是,曾经编写过一小段嵌套代码的人无法更改继承的 css 的行为。时期。 CSS 存在缺陷,尤其是在 WEB 上的模块化组件构建时间。
    • 您可以使用直接后代选择器:.rtl > .floatleft 为您提供所需的确切解决方案。因为它具有比 .rtl .floatleft 更高的规则权重
    【解决方案2】:

    Float Left 必须是它自己的类。

    .ltr {  
        float:left;
    }
    .floatleft{
        float:left;
    }
    
    .rtl{  
        float:right;
    }
    

    http://jsfiddle.net/pnM53/1/

    这样容器 div ltr 将向左浮动。容器 div rtl 将根据需要向右浮动,但 ltr 的 div 内容将在该 div 内向左浮动。这是因为您不再提供相互冲突的 CSS 信息。

    【讨论】:

      【解决方案3】:

      由于缺乏 CSS 的支持,解决这个问题的最佳方法是添加冗余和嵌套规则,即:

      .ltr .floatleft {  
          float:left;
      }
      
      .rtl .floatleft {  
          float:right;
      }
      
      .rtl .floatleft .ltr .floatleft {
          float:left;
      }
      
      .rtl .floatleft .ltr .floatleft .rtl .floatleft {
          float:right;
      }
      
      .rtl .floatleft .ltr .floatleft .rtl .floatleft .ltr .floatleft {
          float:left;
      }
      
      .rtl .floatleft .ltr .floatleft .rtl .floatleft .ltr .floatleft .rtl .floatleft {
          float:right;
      }
      

      依此类推... .ltr 的开头必须与 .rtl 一样...添加任意数量的内容.. 不幸的是,这是获得这种行为的唯一方法...

      **或更少:**

      .ltr(){
              direction: ltr;
      
              &.fl, .fl {
                      float:left;
              }
      
              &.fr, .fr {
                      float:right;
              }
      }
      
      .rtl(){
              direction: rtl;
      
              &.fl, .fl {
                      float:right;
              }
      
              &.fr, .fr {
                      float:left;
              }
      }
      
      [dir=ltr] {
              .ltr();
              [dir=rtl] {
                      .rtl();
                      [dir=ltr] {
                              .ltr();
                              [dir=rtl] {
                                      .rtl();
                                      [dir=ltr] {
                                              .ltr();
                                              [dir=rtl] {
                                                      .rtl();
                                                      [dir=ltr] {
                                                              .ltr();
                                                      }
                                              }
                                      }
                              }
                      }
              }
      }
      
      [dir=rtl] {
              .rtl();
              [dir=ltr] {
                      .ltr();
                      [dir=rtl] {
                              .rtl();
                              [dir=ltr] {
                                      .ltr();
                                      [dir=rtl] {
                                              .rtl();
                                              [dir=ltr] {
                                                      .ltr();
                                                      [dir=rtl] {
                                                              .rtl();
                                                      }
                                              }
                                      }
                              }
                      }
              }
      }
      

      【讨论】:

        【解决方案4】:

        !important 呢?

        fiddle

        .ltr .floatleft {  
            float:left !important;
        }
        
        .rtl .floatleft {  
            float:right;
        }
        

        更新为双向工作:

        http://jsfiddle.net/3E4Me/2/

        【讨论】:

        • 它必须双向工作,如果你把.ltr放在前面,然后.rtl,你的解决方案不起作用。
        • 正如 mbillard 所说...您的解决方案仅适用于这种情况,而不适用于相反的情况,并且不适用于更深的嵌套元素。
        猜你喜欢
        • 1970-01-01
        • 2012-09-28
        • 2015-04-19
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 2017-12-10
        • 2012-04-23
        • 2012-07-01
        相关资源
        最近更新 更多