Я воспринял ответ thesocialgeek как подтверждение того, что нет реализации только для CSS и что это лучший подход в JS.
Но я реализовал его более общим способом, поэтомукод может войти в центральный сценарий JS для всего моего сайта.Это должно решить проблему для любой ячейки таблицы с определением rowspan
.
Это мой CSS:
tr.hover,
th.hover,
td.hover,
tr.hoverable:hover {
background-color: grey;
}
Обычная строка таблицы будет зависеть от CSS':hover
псевдокласс.Любая строка, а также <th>
s и <td>
s будет зависать принудительно при добавлении класса .hover
.Одна эта работа идеально подходит для простых таблиц.
Это код JS в качестве общего решения для сложных таблиц:
$(document).ready(function() {
// find all <th>/<td> with rowspan in hoverable <tr>
$('tr.hoverable [rowspan]').each(function(index, cell) {
var $cell = $(cell);
var rowspan = $cell.attr('rowspan');
var limit = rowspan - 1; // :lt() is zero-based
var $this_row = $cell.closest('tr');
var $next_rows = $this_row.nextAll('tr:lt(' + limit + ')');
$next_rows.hover(
function() {$cell. addClass('hover')},
function() {$cell.removeClass('hover')}
);
});
});
Он добавляет прослушиватели событий для mouseenter
и mouseleave
кстроки, следующие за строкой с установленным атрибутом rowspan
.Весь трюк состоит в том, чтобы собрать нужные элементы, а затем просто нужно переключить класс CSS.
Проблема, которую еще предстоит решить: На моей странице слушатели событий вызываются три раза каждый.Я не знаю точно, почему.Это немного бесполезно, но код не такой толстый, как я не мог этого игнорировать.
Я тестировал код только в Firefox 22 с jQuery 2.0.3, где результат совершенно не соответствует предполагаемому.
Обновление: Я нашел это полезным и расширил код, чтобы выделить все строки, связанные с ячейкой rowspan
, когда эта ячейка наведена.Добавьте следующий фрагмент к длинной функции выше:
$cell.hover(
function() {$next_rows. addClass('hover')},
function() {$next_rows.removeClass('hover')}
);