role="rowgroup"不能加在<tr>上,因为它仅适用于ARIA表格(如<div role="table">),而原生<table>中应使用<thead><tbody><tfoot>进行语义化分组,否则会导致屏幕阅读器混淆和浏览器警告。

role="rowgroup" 不是用来“对表格行进行逻辑分组”的——它只是 ARIA 角色,不能替代语义化 HTML 结构,也不能改变表格的 DOM 层级或渲染行为。
为什么 role="rowgroup" 不能直接加在 <tr> 上
ARIA 的 role="rowgroup" 是为那些无法用标准 HTML 表格元素(如 <thead>、<tbody>、<tfoot>)表达结构的场景准备的,比如用 <div> 模拟表格时。但如果你已经用了真实的 <table>,浏览器和辅助技术会优先信任原生语义,忽略或报错你强行给 <tr> 加的 role="rowgroup"。
- 给
<tr>加role="rowgroup"会导致屏幕阅读器混淆:它期望rowgroup是<tbody>这类容器,而不是单行 - Chrome 和 Firefox 会发出控制台警告:
The ARIA role 'rowgroup' is not allowed on a 'tr' element - 即使不报错,NVDA/JAWS 也不会按你设想的方式朗读——它仍把该
<tr>当作普通行处理
真正起作用的分组方式只有 <thead>、<tbody>、<tfoot>
这些是 HTML 原生的行组容器,既影响样式(比如 <tbody> 可单独滚动),也明确告诉辅助技术“这里是一组数据行”。它们才是逻辑分组的正确载体。
-
<thead>必须包含表头行(<tr>中含<th>),且只能出现一次 -
<tbody>可以有多个,每个都代表一个逻辑数据块;例如按状态分组:<tbody class="status-active">和<tbody class="status-inactive"> - 多个
<tbody>之间可插入<caption>或空行视觉分隔,但不要用<tr><td colspan="100%"></td></tr>伪装分组——那只是视觉 hack,无语义
如果必须用 ARIA 模拟分组(比如非 table 元素)
只有当你放弃 <table>、改用 <div role="table"> 等完全 ARIA 驱动的方案时,role="rowgroup" 才有意义。此时它必须作为 <div role="rowgroup"> 出现,且直接包裹若干 <div role="row">。
立即学习“前端免费学习笔记(深入)”;
<div role="table">
<div role="rowgroup">
<div role="row">
<div role="columnheader">Name</div>
<div role="columnheader">Age</div>
</div>
</div>
<div role="rowgroup">
<div role="row">
<div role="cell">Alice</div>
<div role="cell">32</div>
</div>
</div>
</div>
注意:这种写法需手动维护所有 ARIA 属性(aria-rowindex、aria-colindex、aria-labelledby 等),且键盘导航、焦点管理、响应式适配全得自己实现——成本远高于用原生 <tbody>。
真正需要逻辑分组时,别碰 role="rowgroup" 在 <tr> 上的用法。多一个 <tbody>,比加十个 ARIA 属性更可靠、更轻量、更少出错。



















