Подсветка строки таблицы HTML при наведении, кроме первой строки (заголовок)

Все,

У меня есть ASP.NET GridView, который отображается в таблице HTML.

<table>
    <tr><th>Col 1 Head</th><th>Col 2 Head</th></tr>
    <tr><td>Data 1</td><td>Data 2</td></tr>
    <tr><td>Data 3</td><td>Data 4</td></tr>
</table>

Я хочу выделить строку при наведении на нее указателя мыши, за исключением первой строки, которая является заголовком.

Я только начинаю работать с JQuery и немного балуюсь с CSS (либо CSS2, либо CSS3). Есть ли предпочтительный способ сделать это?

Может ли кто-нибудь дать мне отправную точку для этого?

Ваше здоровье

Андез


person Andez    schedule 09.08.2012    source источник


Ответы (9)


Это можно сделать с помощью спецификатора CSS :hover. Вот демонстрация:

<table>
    <tr><th>Col 1 Head</th><th>Col 2 Head</th></tr>
    <tr class = "notfirst"><td>Data 1</td><td>Data 2</td></tr>
    <tr class = "notfirst"><td>Data 3</td><td>Data 4</td></tr>
</table>

CSS:

.notfirst:hover {
    background-color: red;
}
person Chris    schedule 09.08.2012
comment
Да, я думал об этом - класс css в каждой строке, кроме первой. Надеялся, что для этого есть какой-то продвинутый CSS. Ваше здоровье - person Andez; 10.08.2012
comment
@Andez На самом деле есть способ обойтись без указания класса для каждой строки. Пожалуйста, взгляните на мой новый ответ. - person Chris; 10.08.2012
comment
-1, вы должны указать строку, не на которую будет воздействовать зависание, не указывая n количество строк, которые должны быть затронуты. - person scrowler; 29.05.2014
comment
@scrowler это было только одно из двух решений, которые я предоставил. Смотрите второй ответ. - person Chris; 29.05.2014
comment
@ Крис, честно, я это понимаю. Я добавил +1 к вашему другому ответу. - person scrowler; 30.05.2014
comment
добавление дополнительного класса в разметку для всех строк, но заголовок настолько грязный, грязный. гораздо чище лучшие решения ниже - person koniu; 23.03.2015
comment
@koniu вы смотрели другой ответ, который я предоставил? - person Chris; 24.03.2015
comment
@koniu Я понимаю, о чем вы говорите, но моя цель здесь не в том, чтобы быть самоуверенным, а просто в том, чтобы указать на различные решения. Что касается чистоты, я понимаю и согласен. Печальная правда заключается в том, что состояние стандартов и реализаций HTML и CSS в настоящее время не поддерживает четкую модель разделения задач, на которую вы ссылались (и я большой поклонник). - person Chris; 24.03.2015
comment
@Chris - я не уверен на 100%, что вы имели в виду под печальной правдой, что состояние стандартов и реализаций HTML и CSS в настоящее время не поддерживает четкую модель разделения проблем, на которую вы ссылались, но не поддерживает ‹thead› и ‹tbody› отделяют первую строку от остальных? см. этот ответ. В вопросе OP первая строка представляет собой строку заголовка (ячейки ‹th /›) - person Morvael; 26.08.2016
comment
Не идеальный способ сделать это. Гораздо лучшие методы. - person user2924019; 16.05.2018

Существует способ добиться желаемого поведения, не классифицируя каждую строку отдельно. Вот как выделить каждую строку таблицы, кроме первой (заголовок) при наведении, используя селекторы CSS :not и :first-child:

tr:not(:first-child):hover {
    background-color: red;
}

К сожалению, IE ‹ 9 не поддерживает :not, поэтому чтобы сделать это кроссбраузерным способом, можно использовать что-то вроде этого:

tr:hover {
    background-color: red;
}
tr:first-child:hover {
    background-color: white;
}

По сути, первое правило CSS включает все строки. Чтобы избежать выделения первой строки, вы переопределяете ее стиль наведения, выбирая с помощью tr:first-child, а затем сохраняя его background-color белым (или любым другим цветом невыделенной строки).

Надеюсь, это тоже помогло!

person Chris    schedule 10.08.2012
comment
Спасибо, мне тоже нравится это решение. +1 - person Andez; 15.08.2012
comment
Имейте в виду, что это не будет работать, если разметка <table> <thead><th>foo</th> ... </thead> <tbody> <tr>bar</tr> ... </tbody> </table>. Если это ваше использование разметки - намного проще - селектор tbody tr:hover. - person koniu; 23.03.2015
comment
Это лучший ответ. Спасибо, это работает для меня очень хорошо. - person kevin; 27.12.2017
comment
Не работает, если вы используете таблицы с <thead></thead> - person user2924019; 16.05.2018
comment
Это лучше, чем ответ выше, но ответ ниже еще лучше. Когда-нибудь мы туда доберемся :) - person JOATMON; 29.11.2019

Чтобы расширить ответ пользователя 2458978, безусловно, лучший способ сделать это - правильно закодировать таблицы.

<table>
<thead>
    <tr><th></th></tr>
</thead>
<tbody>
    <tr><td></td></tr>
    <tr><td></td></tr>
</tbody>
</table>

Тогда CSS просто

table tbody tr:hover { background-color: red; }

Вот пример jsFiddle

person Morvael    schedule 13.08.2013
comment
Как я могу сделать это, используя имя класса? Я добавил имя класса - jsfiddle.net/bzamfir/2c2jU, но теперь выделение больше не работает . Спасибо за помощь - person bzamfir; 01.03.2014
comment
Извините - может быть уже слишком поздно. CSS в вашем примере Fiddle немного отличается, .hover table tbody tr:hover { background-color: red; } должно быть просто .hover tbody tr:hover { background-color: red; } так как таблица не является дочерним элементом элемента с классом .hover - person Morvael; 11.03.2014
comment
Это правильный способ иметь стол, и поэтому это лучший ответ. - person user2924019; 16.05.2018

1. Поместите заголовок tr внутри тега ad

2. Поместите другой tr внутри тега tbody

3. Используйте следующий css

table tr:not(thead):hover {
    background-color: #B0E2FF;
}
person user2458978    schedule 06.06.2013
comment
Это помогло мне: table tbody tr:hover { background-color: #B0E2FF; } - person egallardo; 23.08.2013
comment
:not(thead) хорош в качестве селектора jQuery, но ни хром, ни firefox не кажутся слишком впечатляющими. Однако table tbody tr:hover работает просто отлично — хороший комментарий. - person koniu; 23.03.2015

Используйте тег TH для первой строки и сделайте это:

th {
background-color:#fff;

}

Для всех остальных строк:

    tr:not(:first-child):hover {
    background-color:#eee;
}

or

tr:hover td {
    background-color:#eee;
}
person phsaires    schedule 30.04.2013

Используйте jQuery, чтобы добавить класс к родительскому элементу td (не выберете th)

$('td').hover(function(){
   $(this).parent().addClass('highlight');
}, function() {
   $(this).parent().removeClass('highlight');
});

Затем добавьте класс CSS

.highlight {
   background:red;
}
person Oliver Millington    schedule 09.08.2012
comment
Судя по вопросу, кажется, что он хочет немного изучить jQuery, поэтому я его использую, лично я бы не стал отрицать ответ, который расширит чьи-то знания, даже если вы считаете это излишним, но эй, что бы ни плавало на вашей лодке. - person Oliver Millington; 09.08.2012
comment
Я собираюсь +1, спасибо - больше информации. Не сказал бы, что излишество - полезная информация. - person Andez; 09.08.2012
comment
Было бы очень плохо, если бы люди скопировали это в свой код. CSS — это правильный способ использования :hover и :first-child. Излишество; - person Alexis Paques; 09.01.2019

Почему бы просто не использовать

tr>td:hover {
/* hover effect */
background-color: lightblue;
}

Это повлияет только на строки таблицы с td внутри, а не на строки таблицы с th внутри. Работает во всех браузерах. Здоровья, ребята.

person Lars Tuff    schedule 22.11.2018
comment
Это выделит отдельные ячейки, хотя я думаю, что было бы лучше выделить всю строку, наведя курсор на любую ее ячейку. - person umbe1987; 05.12.2018

Почему бы не что-то вроде:

tr:first-child ~ tr { background-color:#fff; }
person user3174546    schedule 08.01.2014

По моему требованию я должен выделить все четные строки, кроме строки заголовка.

Следовательно, этот ответ может не подходить для поставленного выше вопроса.

Даже тогда я даю свой ответ здесь в надежде, что кто-то еще сможет использовать мой ответ, если он встретит эту страницу в поисковой системе.

Мой ответ:

$("#tableName tr:even").not("tr:nth(0)").addClass("highlight");
person Ashok kumar    schedule 31.12.2014