开发者问题收集

当鼠标悬停在同一表格中的另一行上时更改表格行的背景颜色

2012-07-27
13286

这是我在这里的第一篇文章,我绝不是一个熟练的 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>
2个回答

您可以大大简化 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 及以下版本,则需要向每行的最后一个单元格添加一个类,以便可以删除其右边框。

ErikE
2012-07-27

您可以使用纯 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;
}​
David Thomas
2012-07-27