2014-06-05 113 views
0

我遇到了一個奇怪的行爲,但它可能是它應該是的,但它是意想不到的和不受歡迎的。CSS嵌套規則,覆蓋規則的意外行爲

樣本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

回答

-1

什麼!important

fiddle

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

.rtl .floatleft { 
    float:right; 
} 

更新,以兩種方式工作:

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

+0

它必須是雙向的,如果你把'.ltr'首先,然後'.rtl',你的解決方案不起作用。 – mbillard

+0

就像mbillard在說......你的解決方案只能在這種情況下工作,而不是其他方式,而不是嵌套元素的深度。 – Samson

+0

小孩選擇器呢? http://jsfiddle.net/3E4Me/2/ – gnagy

1

這只是你的風格都寫在這種情況下的順序。

.ltr .floatleft.rtl .floatleft兩者均相等。因此,無論哪一個是CSS文件中的最終規則都將優先。

你需要添加更多的特異性,以實際上你想要發生的規則。

這裏有一個如何你的風格可以根據你已經把什麼樣的順序它們是不同的實例:

JSFiddle with orders swapped and then direct descendant examples.

+0

是的,我明白這一點。不過,我相信人們之前已經提出過這個要求。 如果內容是由用戶提供或開發的,您已經在其中指定了全局規則,則不能覆蓋它。 它與rtl語言的特殊用例有關... float:left應該成爲float:right ...它首先在根html標記上定義..然後,任何提供的內容本身可以指定其子級應該漂浮...現在它來自上帝,沒有人可以改變它.. CSS應該在這個區域成熟 – Samson

+0

CSS代表級聯樣式表。規則「級聯」。它所尋找的只是一個規則是真是假。在這種情況下,你有兩個真實的陳述,所以最後哪條規則會優先。 –

+0

令人討厭的是,誰編碼的小嵌套代碼片段不能改變繼承的CSS的行爲。期。它存在CSS的缺陷,特別是在WEB上的模塊化組件構建時間方面。 – Samson

0

左浮動需要是它自己的類。

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

.rtl{ 
    float:right; 
} 

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

這樣div容器升將左浮動。容器div rtl將按需要浮動,但ltr的div內容將在該div內左移。這是因爲你不再提供衝突的CSS信息。

0

解決這個,因爲這缺乏對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(); 
               } 
             } 
           } 
         } 
       } 
     } 
}