CSS Hover Родительские дочерние Элементы
Вопрос
Я пытаюсь настроить стиль CSS, чтобы выделять ячейку таблицы во вложенной таблице при наведении на нее курсора мыши.
Смотрите пример кода ниже.....
<html>
<head>
<style type='text/css'>
table
{
border: solid 1px black;
}
table.Content:hover td.ContentIndent
{
background-color: #AAAAAA;
}
</style>
</head>
<body>
<table class="Content">
<tr>
<td class="ContentIndent">Root Indent, could be highlighted when this table is moused over</td>
<td>
<table class="Content">
<tr>
<td class="ContentIndent">Indent 1 - Should be highlighted only when this table is moused over</td>
<td>Content 1 - Indent 1 should be highlighted when this table is moused over</td>
</tr>
</table>
<table class="Content">
<tr>
<td class="ContentIndent">Indent 2 - Should be highlighted only when this table is moused over</td>
<td>Content 2 - Indent 2 should be highlighted when this table is moused over</td>
</tr>
</table>
</td>
<tr>
</table>
</body>
</html>
В принципе, когда наведен курсор мыши на одну из дочерних таблиц, я бы хотел, чтобы ее ячейка с отступом была выделена.Также было бы здорово, если бы ячейки отступа родительских ячеек были подсвечены.
К сожалению, при текущей настройке ячейки отступа из обеих дочерних ячеек подсвечиваются независимо от того, над какой таблицей наведен курсор мыши.Я пробовал это в Firefox 3.5 и IE 8 и получаю те же результаты.
Я действительно нашел это Учебник и связанные с этим ДЕМОНСТРАЦИЯ это делает в основном то, что я пытаюсь сделать, за исключением того, что вместо таблиц используются вложенные списки.Но, когда я пытаюсь использовать оператор > (чтобы создать стиль table.Content:hover > td.ContentIndent
) это вообще не работает.Я не уверен, в чем разница.
Решение
Ну, во-первых, если вы хотите поддерживать IE6, вам понадобится Javascript с некоторым описанием, потому что этот браузер поддерживает только :hover
псевдоэлемент на якорях (ссылках, т.е. <a>
теги).
Другая проблема заключается в том, что для этого вам понадобится дочерний CSS-селектор, который опять же не поддерживается в IE6.
Таким образом, версия, не совместимая с IE6, является:
table.Content:hover > tbody > tr > td.ContentIndent { background: #AAA; }
Обратите внимание на <tbody>
элемент, который создается неявно.
Без дочернего (>) селектора этого выражения:
table.Content td.ContentIndent { ... }
захватит каждую ячейку отступа, потому что это известно как селектор-потомок, а таблица содержимого верхнего уровня является родительской для всех из них.
Вы могли бы обойти эту проблему таким образом:
table.Content:hover td.ContentIndent { background: #AAA; }
table.Content:hover table.Content td.ContentIndent: background: #FFF; }
Второй вариант в основном устраняет эту проблему, возвращая более глубокие отступы к тому, каким должно быть обычное форматирование.Это довольно стандартный метод решения некоторых проблем IE6, которые можно было бы решить с помощью дочернего селектора, но не всегда возможно или практично возвращать стили таким образом.
Для поддержки IE6 я бы порекомендовал библиотеку Javascript.Мой предпочтительный вариант - jQuery, который будет включать в себя такой код, как этот:
$(function() {
$("table.Content").hover(function() {
$(this).children("tbody").children("tr")
.children("td.ContentIndent").addClass("hover");
}, function() [
$(this).children("tbody").children("tr")
.children("td.ContentIndent").removeClass("hover");
});
});
с:
td.hover { background: #AAA; }
Другие советы
Проблема в том, что вы используете " Content " класс для окружающей таблицы, поэтому при наведении курсора на родительский объект событие hover вызывается для всей таблицы. Дайте родительской таблице другой класс (например, & Quot; Parent & Quot;), и он будет работать нормально.
Подобный селектор
.Content td
обычно применяется к каждому td ниже. Содержание, независимо от того, насколько глубоко оно вложено. & Gt; указывает, что правило действительно для непосредственных потомков элемента only , а не для более глубоких вложенных элементов. IE до 7 не распознает & Gt;.