Поскольку IE6 не поддерживает дочерний селектор (см. http://kimblim.dk/csstest/#ex1), какова альтернатива при работе с этим браузером?
Я не хочу изменять разметку, и я бы предпочел решение только для CSS ...
И да, это прямой ребенок, на которого я хочу нацелиться.
Спасибо!






Вы можете использовать jQuery, это не очень хорошее решение, но это один из вариантов, который я использовал в прошлом:
$("parent > child").each(function() {
$(this).addClass("child-styles");
}
Очевидно, вы захотите заключить это в какую-нибудь специализированную проверку только для IE6. И, вероятно, захочется, чтобы таблица стилей была заключена в оператор IE6 IF, чтобы добавить эти специализированные стили.
Вам нужен прямой ребенок? IE6 поддерживает селекторы потомков, например
div span { ... }
Возможно, вы могли бы использовать это, чтобы нацелить то, что вы хотите. Возможно, вы могли бы опубликовать какой-нибудь код, чтобы мы могли дать вам более конкретный ответ?
да, я понял - если вы можете быть умны, иногда использование обычных селекторов потомков может работать в крайнем случае
Помещение настраиваемого класса в элемент.
<ul>
<li class = "first">Blah<li>
<li>Blah<li>
<li>Blah<li>
</ul>
Это исправление проблемы: first-child, а не>.
Можно было бы поместить класс на всех первых дочерних элементов, но тогда будьте осторожны, если у вас есть вложенные списки (что очень вероятно, когда вы беспокоитесь о сопоставлении непрямых дочерних элементов), вы должны использовать другое имя класса для каждого из них. В противном случае ul li.child будет соответствовать обоим, что, вероятно, не предназначено: <ul><li class = "child"> <ul><li class = "child"></li></ul> </li></ul>
Я наткнулся на что-то вроде взлома: http://meyerweb.com/eric/gotits/2005/05/31/universal-child-replacement/ Использование хака «звездочка html» для IE (6 и ниже) в сочетании с этим позволяет мне выбрать прямого потомка. Допустим, мы хотим применить padding-top размером 10 пикселей к прямому дочернему элементу F E:
* html body E F
{
/* apply style here for IE 6 */
padding-top: 10px;
/* This applies the style to every F inside of E */
}
* html body E * F
{
/* undo style here */
padding-top: 0px;
/* This will undo the style set above for every F that has something in between itself and E, that is, every F besides the direct children of E */
}
Я действительно ценю ваши ответы, но как бы мне ни не хотелось принимать свой ответ, это было решение, на котором я в конце концов остановился. Спасибо, парни!
К сожалению, этот ответ не идеален. Это работает, но как потомки потомков это тоже может вызвать проблемы ... скажем, у вас есть 3 вложенных div. вы хотите изменить второй div на отступ 20 пикселей, а третий div имеет отступ 5 пикселей. У вас может быть это правило, которое помещает всех остальных дочерних элементов в отступ в 4 пикселя. Но допустим, у вас есть другой div на 7 пикселей ... вы не можете просто вернуть значение чему-то другому. Это может сработать, но вам все равно придется искать непредвиденные последствия ...
Вот хорошее решение, которое я нашел в книге: «Антология Javascript».
Что-то вроде того:
/* for all but IE */
#nav ul li.currentpage > a:hover {
background-color: #eff;
}
И код для IE:
/* for IE */
* html #nav ul li.currentpage a:hover {
background-color: expression(/currentpage/.test(this.parentNode.className)? "#eff" : "#ef0");
}
Уловка для IE заключается в том, что только IE думает, что есть оболочка над html, а IE поддерживает материал expression ().
Выражение использует регулярное выражение (/ currentpage /) и проверяет его на соответствие классу родительского узла, поэтому для прямых потомков элемента li.currentpage будет установлено значение #eff, для остальных потомков будет установлено значение # ef0.
Обратите внимание, что используемые цвета поддельные, не комментируйте их ;-)
К сожалению, выражения CSS больше не поддерживаются в стандартном режиме IE8 ... (blogs.msdn.com/ie/archive/2008/10/16/ending-expressions.asp x)
@Ryann: IE8 изначально поддерживает дочерний селектор, поэтому этот IE6-хак, который игнорируется / больше не работает в IE8, не должен быть проблемой.
Использовать это
div * { padding-left:20px; }
div * * { padding-left:0; }
Сначала вы нацеливаете всех дочерних элементов, а затем сбрасываете объявление css, ориентируясь на всех внуков.
В этом посте обсуждаются все различные варианты эмуляции дочерних селекторов CSS в IE6, включая небольшой трюк в конце для работы с вложенными структурами: http://craftycode.wordpress.com/2010/05/19/emulating-css-child-selectors-in-ie6/
Я использовал следующее кроссбраузерное решение. Он не использует взломы IE6 и правильно отображает встроенные списки (скажем, вам нужно по-разному стилизовать вложенные элементы OL и UL).
ul, ol {
/* Set margins, padding, and other generic styles */
}
ul li, ul ul li, ol ul li {
list-style-type: disc; /* unordered lists */
}
ol li, ul ol li, ol ol li {
list-style-type: decimal; /* ordered lists */
}Это так же просто, как yodeling CSS!
Этот ответ не имеет отношения к вопросу. Кроме того, не будет ли "ul {list-style-type: disc;} ol {list-style-type: decimal;}" делать то же самое? Почему весь йодлинг?
нет, они имеют в виду «родительский> дочерний», где используются только прямые дочерние элементы, а не все дочерние элементы.