当鼠标悬停在同一表格中的另一行上时更改表格行的背景颜色
这是我在这里的第一篇文章,我绝不是一个熟练的 HTML/CSS/JavaScript 程序员,所以如果我表达得不够清楚,请多多包涵 - 如果太冗长,请见谅!
我使用经典 HTML 表格来显示表格内容,并希望能够更改与我当前悬停的行不同的行的背景颜色。
这样做的原因是,我有许多表格,它们被分成“子表”,每个子表都有自己的标题和下面的一行或多行。这些子表 - 都具有相同的样式 - 但并未编码为表格,而是我只是使用不同的类来设置它们的样式(这主要是因为它们太多而且太小,每个表有 1-6 行,包括标题)。
我想要做的是,一旦您将鼠标悬停在任何子表上,其标题和您当前指向的行都应该改变背景颜色(后者可以通过 CSS 轻松实现)。感谢在线找到的 JavaScript,我已成功实现此目的 - 请参阅
示例代码
,它可能对此解释得更好,另请参阅下面的代码 - 但是这需要每个子标题都有一个唯一的 ID。 (请注意,每个子表都使用单独的 tbody - 如果将
onMouseover
事件应用于每一行,则在从一行悬停到另一行时,子标题的颜色会闪烁/亮起和熄灭 - 这在 CSS 中永远不会发生,只有在 JavaScript 中才会发生 - 当然还要创建更多的代码。)
我不想要为每个子标题分配唯一的 ID,而是想要一个使用类的解决方案,因为每个子表都使用相同的类(然后我当然会为
tbody
分配一个类)。我想这其中的棘手部分可能是确保只影响当前子表的表头,而不是同时影响所有子表。
如果创建一个解决方案更容易,其中每个子表实际上都被编码为一个单独的表(从语义的角度来看这可能更好?),那么请这样做。当然,如果 JavaScript 能够自行应用
onMouseover
等事件就更好了,这样我就不必将其放入每个子表的内联代码中 - 我已经看到可以对按钮等执行此操作,因此我认为这是可能的。
我从未使用过 jQuery,因此纯 JavaScript 解决方案会更受欢迎。
有关示例代码,请再次参阅 my fiddle
非常感谢您的意见!
JavaScript:
function changeTo(myId) { document.getElementById(myId).className='sub-header-highlight'; }
function changeBack(myId) { document.getElementById(myId).className='sub-header'; }
CSS:
thead { color: #FFF; background: #000; }
.sub-header { color: #FFF; font-weight: bold; background: #F00; }
.sub-header-highlight { color:# FFF; font-weight: bold; background: #0F0; }
tr.sub-header:hover { background: #0F0; } /* if JS turned off */
.sub-row1 { color: #000; background: #FFF; }
.sub-row2 { color: #000; background: #EEE; }
tr.sub-row1:hover, .sub-row2:hover { background: #FF0; }
部分 HTML:
<tbody onMouseover="changeTo('sub1');" onMouseout="changeBack('sub1');">
<tr class="sub-header" id="sub1">
<td>Sub-Header 1</td>
</tr>
<tr class="sub-row1">
<td>Contents of row 1</td>
</tr>
<tr class="sub-row2">
<td>Contents of row 2</td>
</tr>
<tr class="sub-row1">
<td>Contents of row 3</td>
</tr>
</tbody>
您可以大大简化 HTML 标记和 CSS,而且无需使用 Javascript。
- 首先,除了隔行样式之外,所有类都可以显示出来(除非您不关心 IE 8 及以下版本,在这种情况下,您可以删除 IE 条件 CSS 和类名。请参阅 浏览器 CSS 选择器兼容性图表 。)
-
其次,将子标题内的每个
td
更改为th
。 -
第三,在父
tbody
上使用:hover
伪选择器,按指定方式设置th
的样式。
请参阅此 在 jsfiddle 中工作 ,经测试可在 IE 7 和 Firefox 14 中完美运行。
以下是 CSS:
table { border-collapse:collapse; }
thead { color: #FFF; background-color: #000; }
tbody th { color: #FFF; font-weight: bold; background-color: #F00; text-align:left; }
tbody:hover th { background: #0F0; }
tbody tr:nth-child(odd) { background-color:#EEE; }
tbody tr:hover td { background: #FF0; }
样式说明:
- CSS 属性“background”需要的不仅仅是颜色,还会重置其他属性。如果您只想设置背景颜色,请使用“background-color”。
-
为了使特异性规则使 IE 赋予其比奇数行特殊颜色更高的优先级,
tr:hover
上额外的td
是必需的。 - “奇数”行实际上是数据的偶数行,因为子标题占用了第一个奇数行。
-
在表格上直接使用 CSS
border-collapse:collapse
而不是cellspacing
。
我必须将 IE 的条件 CSS 放在小提琴的 HTML 部分,因为它必须位于
style
标记之外。
<!--[if lte IE 8]>
<style type="text/css">
tbody tr.odd { color: #000; background: #EEE; }
</style>
<![endif]-->
这是 HTML。看看现在有多干净?
<table>
<thead>
<tr>
<th>MAIN HEADER</th>
</tr>
</thead>
<tbody>
<tr>
<th>Sub-Header 1</th>
</tr>
<tr>
<td>Contents of row 1</td>
</tr>
<tr class="odd">
<td>Contents of row 2</td>
</tr>
<tr>
<td>Contents of row 3</td>
</tr>
</tbody>
<tbody>
<tr>
<th>Sub-Header 2</th>
</tr>
<tr>
<td>Contents of row 1</td>
</tr>
</tbody>
<tbody>
<tr>
<th>Sub-Header 3</th>
</tr>
<tr>
<td>Contents of row 1</td>
</tr>
<tr class="odd">
<td>Contents of row 2</td>
</tr>
</tbody>
</table>
最后,我意识到这些颜色可能只是例子,所以我可以建议明亮的原色不太适合人类的认知反应吗?你可以选择一种突出显示效果。请参阅我为你整理的 工作示例 ,使用的颜色(在我看来)更令人愉悦。看看当你将鼠标悬停在该部分上时,它是如何“发光”的?漂亮极了!
注意:在 IE8 及之前的版本中,右侧会有一个额外的边框。如果您有一个多列表格,并且您喜欢内边框,并且想要支持 IE8 及以下版本,则需要向每行的最后一个单元格添加一个类,以便可以删除其右边框。
您可以使用纯 CSS 实现此目的(具有通常的浏览器兼容性条件),因此假设您使用的是相对较新的 Chrome、Safari、Firefox、Opera 或可能是 IE 9(或更高版本):
tbody:hover tr.sub-header {
background-color: #0f0;
}
tbody tr.sub-row:hover {
background-color: #f90;
}
JS Fiddle 演示 (显然,请根据您的喜好调整颜色;这些只是为了演示的目的)。
当然,值得一提的是,某些浏览器可能不会显示
tr
元素的
background-color
(因为它显示在
td
元素的
background-color
的
后面
),在这种情况下,您可能需要修改选择器以定位相关的
td
元素而是:
tbody:hover tr.sub-header td {
background-color: #0f0;
}
tbody tr.sub-row:hover td {
background-color: #f90;
}