IE8 не принимает несколько классов в режиме причуд?

Я сталкиваюсь с ситуацией, когда IE8, похоже, отбрасывает селекторы CSS. Мне трудно в это поверить, но я не могу понять, что происходит.

В файле .css у меня есть это объявление:

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

Однако, когда я проверяю файл в IE8 с помощью встроенных инструментов разработчика, объявление меняется на это:

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

Меня не волнует изменение регистра или переформулировка правила, но удаление '.objectPath' является реальной проблемой, потому что оно нацелено на правило более широко, чем я предполагал.

Я отмечаю, что эта страница находится и должна оставаться в режиме Quirks.

Есть идеи, что происходит?

Спасибо!


person Tim Sheiner    schedule 02.11.2009    source источник
comment
Кроме того, псевдокласс hover не будет работать в режиме quirks (за исключением якорей).   -  person plodder    schedule 13.11.2009


Ответы (3)


В Quirks Mode IE 8 отображает страницу и обрабатывает DOM так же, как IE 5.5. Вот почему IE 8 в Quirks Mode игнорирует несколько классов. Это не ошибка в IE 8, если вы хотите, чтобы ваша страница анализировалась и отображалась правильно, вам необходимо правильно установить DOCTYPE для отображения страницы в стандартном режиме.

person Livingston Samuel    schedule 08.01.2010

tr.objectPath.hover не является правильным синтаксисом, если вы пытаетесь использовать псевдокласс hover. Правильный синтаксис будет с двоеточием (т.е. tr.objectPath:hover). Когда машина читает ваш код, она считывает objectPath как имя класса tr, но затем, когда она доходит до hover, она избавляется от старого имени класса и заменяет его классом hover (независимо от того, существуют ли на самом деле какие-либо элементы, принадлежащие этому классу). или нет Кроме того, если это так, то я не понимаю, что вы пытаетесь сделать, ссылаясь на дочерний элемент экземпляра :hover.

Если вы на самом деле используете hover в качестве имени класса (что я бы не рекомендовал, так как это может сбить с толку людей, читающих ваш код), и вы хотите, чтобы CSS применялся к td дочерним элементам tr, который относится как к objectPath, так и к hover, вы можете просто создать новый класс для элементов, принадлежащих к обоим классам, и использовать его вместо него (т.е. #srp tr.newClass td).

РЕДАКТИРОВАТЬ: При дальнейшем рассмотрении вопроса выясняется, что это (пока) (еще один) известная ошибка в IE. Я протестировал его в IETester, и, кажется, он существует во всех версиях IE. Единственное решение, которое я мог видеть с вашей стороны, очень и очень грязное:

Во-первых, это потребует использования JavaScript в вашем CSS, поскольку у вас нет доступа ни к чему другому. Это возможно, но очень подвержено ошибкам.

Во-вторых, потребуется создать в этом JavaScript функцию getElementsByClass, которая могла бы принимать в качестве параметров несколько имен классов. Это будет очень большой кусок кода. .

Наконец, вы, вероятно, захотите указать этот код как используется только IE, чтобы пользователям других браузеров не приходилось сталкиваться с потенциальными проблемами из-за всего этого.

Чтобы уточнить, я бы НЕ рекомендовал делать это. Вместо этого я бы предложил связаться с кем-то, у кого есть доступ к исходному коду HTML (при условии, что вы действительно работаете с ними в партнерстве), чтобы они могли применить гораздо более простое исправление, добавив класс objectPathhover к элементам tr, принадлежащим обоим классам. или даже своим td детям.

person sfarbota    schedule 02.11.2009
comment
Ваше предложение сработает, но потребует изменений в коде, генерирующем разметку, где я не контролирую. Остается вопрос, почему IE переформулирует декларацию? - person Tim Sheiner; 03.11.2009
comment
Я провел довольно много дополнительных исследований по этому вопросу и пришел к выводу, что проблему лучше всего решить тем, у кого есть доступ к исходному коду HTML. - person sfarbota; 03.11.2009
comment
@Tim Sheiner: IE, скорее всего, показывает вам каноническую форму объявления (как он ее понимает). - person Powerlord; 13.11.2009

Похоже, у вас есть неправильный синтаксис в вашем объявлении, но трудно точно сказать, что вы делаете. Вы пытаетесь сопоставить состояние наведения или существует класс, который на самом деле называется «наведение»?

Если вы собираетесь в штат, попробуйте:

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

Если есть другой класс, вам может понадобиться 2 отдельных объявления:

#srp tr.objectPath td {
    ...
}

#srp tr.hover td {
    ...
}
person Christopher Nobles    schedule 02.11.2009
comment
На самом деле существует класс «зависание». Использование двух классов, как вы описываете, не помогло бы мне, потому что это, по сути, то же самое, что делает IE: применение стиля к любому td с родителем, у которого есть имя класса .hover вместо ТОЛЬКО td, у которых есть родитель с классом .objectPath И .наведите. - person Tim Sheiner; 03.11.2009
comment
Насколько я знаю, css так не работает. Вы можете объявить отдельные классы и иметь перекрытие, или вы можете каскадировать дерево управления (.object под .hover или наоборот), но не правило, которое будет применяться только при наличии обоих правил. В вашем случае, похоже, вам нужно сделать третий класс. - person Christopher Nobles; 06.11.2009