tr:hover与:nth-child冲突时,应通过更具体的选择器(如tbody tr:hover、tr:nth-child(even):not(:hover))明确优先级,避免!important,排除thead干扰,并统一box-sizing和背景渲染范围。
直接用 tr:hover + :nth-child 组合就能实现,但顺序、优先级和边界情况不处理好,高亮会失效或错乱。
两者同时存在时,:nth-child 规则如果写在 tr:hover 后面,会覆盖 hover 的背景色;反过来,hover 又可能盖掉隔行色。关键不是“谁写在前面”,而是“谁更具体”。
tr:nth-child(even):not(:hover) 显式排除悬停状态,比单纯 tr:nth-child(even) 优先级更高tr:hover 放在所有 :nth-child 规则之后,确保它最终生效!important,它会让后续维护变脆——比如加个表头高亮需求时容易互相打架默认 tr:hover 会匹配 thead tr,但多数场景下你不希望表头跟着变色。浏览器渲染时,thead tr 和 tbody tr 是同级元素,伪类无法自动区分。
tbody tr:hover { background-color: #f0f8ff; }
thead tr:hover { background-color: transparent; }
border-collapse: collapse,还要确认 th 没有独立 background,否则会遮住 tr 的 hover 背景iOS 和部分 Android 浏览器在 tap 后会触发一次 :hover,且不自动清除,导致某行“卡在高亮态”。这不是 bug,是 UA 的模拟行为。
立即学习“前端免费学习笔记(深入)”;
touchstart 或 click,临时移除 hover 类(如给 tr 加 .no-hover 并设 .no-hover:hover { background: none; })pointer-events: none 关闭 thead th 的 hover 响应,减少误触面.selected 类控制——这样 iOS/Android 体验一致,也方便键盘导航最易被忽略的是 border-collapse: collapse 和单元格 padding 对 hover 视觉连续性的影响:哪怕 tr 设了背景,若 td 有 padding 或 border,高亮区域会出现“断层”。务必统一用 box-sizing: border-box 并检查 computed styles 中的 background rendering 范围。