tbody tr:hover 有效需满足:HTML 中显式存在 tbody 标签,且结构符合标准表格(thead/tbody/tfoot);触屏设备默认不支持 hover,需用 @media (hover: hover) 或 touchstart/touchend 模拟;避免 pointer-events: none、优先级冲突及 transition: all 引发的布局抖动。
直接用 tbody tr:hover 就能实现,但 90% 的失效案例都卡在结构或选择器上,不是 CSS 写错了,而是 HTML 没写对或类名没配齐。
浏览器只认标准表格结构:表头 thead、主体 tbody、页脚 tfoot。如果省略 tbody,哪怕 DOM 中自动补全了,CSS 选择器 tbody tr:hover 依然不匹配。
<table><tr><td>...</td></tr></table> —— 没有 tbody,tr 直接挂在 table 下<table><tbody><tr><td>...</td></tr></tbody></table>
或 Fragment 包裹 tr,必须显式写 <tbody>
.table-hover 的样式规则是 .table-hover > tbody > tr:hover,漏掉任意一层都会失效不是所有“悬停没反应”都是代码问题,得看环境和上下文。
:hover,@media (hover: none) 下该伪类被忽略pointer-events: none,会拦截所有鼠标事件,包括 hovertr { background: white !important },就会盖掉 tr:hover 的背景色row.classList.add('active') 后没移除,导致 hover 看不出变化border 或 outline 改变尺寸,造成行高跳动,视觉上像“没高亮”,其实是布局重排了纯色切换太生硬,加个过渡就能明显提升体验,但要注意只过渡安全属性。
立即学习“前端免费学习笔记(深入)”;
tbody tr { transition: background-color 0.2s ease; }
transition: all 0.2s —— 万一后续加了 padding 或 border,就会引发布局抖动@media (hover: hover) 条件启用 transition,避免触屏设备浪费渲染真要支持触摸设备上的“悬停感”,得靠 JS 补位,但别用 mouseover/mouseout —— 它们在手机上基本不触发。
touchstart 给当前行加临时 class,比如 tr.touched
touchend 清除,但注意防误触:加个 150ms 延迟再移除,避免点击按钮时高亮残留tbody tr:hover, tbody tr.touched { background-color: #f8f9fa; }
tr:focus-within 或 tr[aria-selected="true"]),语义更清晰,也兼容键盘导航最常被忽略的是:hover 效果依赖于精确的 DOM 层级和设备能力判断,而不是单纯写对一个选择器。结构错一点,整行就静音;没考虑 touch 设备,PC 上再完美也白搭。