2009-11-02 26 views
1

我遇到了IE8似乎在丟棄CSS選擇器的情況。我覺得這很難相信,但我無法弄清楚發生了什麼。IE8不接受Quirks模式下的多個類?

在.css文件我有這樣的聲明:

#srp tr.objectPath.hover td { 
    border-top:none; 
} 

然而,當我通過檢查在IE8該文件的內置開發工具,該聲明被修改成這樣:

#srp TR.hover TD { 
    border-top:medium none; 
} 

我不在乎案件的變化或規則的重述,但放棄'.objectPath'是一個真正的問題,因爲它的目標規則比我想要的更廣泛。

我注意到這個頁面是,並且必須停留在怪癖模式下。

任何想法發生了什麼?

謝謝!

+0

順便說一句,懸停僞類將不會工作在怪癖模式(錨點除外) – plodder

回答

1

tr.objectPath.hover如果您嘗試使用hover僞類,則語法不正確。正確的語法是冒號(即tr.objectPath:hover)。當機器讀取你的代碼時,它讀取objectPath作爲tr的類名,但是當它到達hover時,它將刪除舊的類名並用hover類替換它(實際上是否有任何屬於如果是這樣的話,那麼我看不到你通過參考:hover的一個實例的孩子想要做什麼

你實際上使用hover作爲一個類名稱(我不推薦這樣做,因爲它可能會讓讀者看到你的代碼時感到困惑),並且你希望CSS應用於tr的子類,該子類是objectPathhover類,你可以考慮創建一個新的CL驢的元素是兩個類,並使用它來代替(即。 #srp tr.newClass td)。

編輯:進一步看看這個問題,看起來這是(但)在IE中是(nother)known bug。我已經在IETester中測試過它,它似乎存在於所有版本的IE中。我看到的唯一解決方案非常混亂:

首先,它需要在CSS中使用JavaScript,因爲您無法訪問任何其他內容。這是possible but very prone to bugs。其次,它需要在該JavaScript中創建一個getElementsByClass函數,該函數可以將多個類名稱作爲參數。這將是一個very sizable chunk of code

最後,您可能會想要指定此代碼爲used only by IE,以便其他瀏覽器的用戶不必處理所有這些問題中的任何潛在問題。

澄清,我不會推薦這樣做。相反,我會建議與能夠訪問HTML源代碼的人聯繫(假設您實際上正在與他們合作),以便他們能夠應用更簡單的修復方法,即將objectPathhover類添加到屬於這兩個類的tr元素甚至到他們的td孩子。

+0

您的建議可行,但需要更改代碼生成標記,我不控制。 問題仍然存在,爲什麼IE重申聲明? –

+0

我對此做了相當多的研究,並得出結論認爲,問題最好由有權訪問HTML源代碼的人修復。 – sfarbota

+0

@Tim Sheiner:IE很可能向你展示聲明的規範形式(正如它理解的那樣)。 – Powerlord

0

看起來你的聲明中有一些不正確的語法,但很難準確地告訴你在做什麼。你試圖匹配懸停狀態還是有一個實際叫做'懸停'的類?

如果要爲國家,嘗試:

#srp tr.objectPath:hover td { 
    ... 
} 

如果有另一個類,則可能需要2點獨立的聲明:

#srp tr.objectPath td { 
    ... 
} 

#srp tr.hover td { 
    ... 
} 
+0

偉大的思想家都認爲哈哈。 – sfarbota

+0

實際上有一堂課'懸停'。 如你所描述的使用兩個類不會幫助我,因爲它基本上與IE似乎做的一樣:將樣式應用於具有classname .hover的父代而不是僅具有父類的td。 objectPath和.hover。 –

+0

據我所知,CSS不會那樣工作。你可以聲明單獨的類並且有重疊,或者你可以級聯控制樹(.html下的.object,反之亦然),但不是隻有當兩個規則都存在時才適用的規則。 就你而言,這聽起來像你需要做第三課。 –

2

怪癖模式IE 8渲染頁面,對待DOM作爲IE 5.5將呈現。這就是奇怪模式下的IE 8忽略多個類的原因。它不是IE 8中的一個錯誤,如果你希望你的頁面被正確解析和渲染,那麼你必須有一個合適的DOCTYPE設置爲在標準模式下渲染頁面。