You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular Material mat-tab-group无障碍优化:聚焦标签仅读名称

解决Angular Material标签与JAWS屏幕阅读器的无障碍冲突问题

我来帮你搞定这个JAWS读取标签时的冗余内容问题。核心问题在于关闭按钮默认属于标签区域的可访问元素,JAWS会把它的aria-label和标签名一起读取。我们可以通过控制按钮的无障碍属性和焦点逻辑来实现你的需求。

解决方案思路

  1. 初始状态下让关闭按钮对屏幕阅读器“不可见”,且无法通过Tab键聚焦
  2. 当用户激活标签(点击/回车/空格)时,激活关闭按钮的可访问性并将焦点移到按钮上
  3. 按钮失焦后恢复初始状态,确保下次聚焦标签时不再读取按钮内容

修改后的代码实现

模板部分

<mat-tab-group dynamicHeight [(selectedIndex)]="activeTabIndex" (selectedTabChange)="changetab($event)">
  <mat-tab *ngFor="let tab of Tabs; let i = index" 
           [label]="tab.name" 
           [attr.sortColumn]="tab.sortBy" 
           [attr.sortOrder]="tab.sortOrder" 
           [attr.viewId]="tab.id" 
           [attr.viewObjectID]="tab.viewObjectId"
           aria-label="{{tab.name}}">
    <ng-template mat-tab-label>
      <div class="tab-container" 
           (click)="onTabLabelClick($event, tab.id)" 
           (keyup.enter)="onTabLabelClick($event, tab.id)" 
           (keyup.space)="onTabLabelClick($event, tab.id)">
        <div class="somestyle">
          <span class="tab-name" [matTooltip]="tab.name">{{tab.name}}</span>
        </div>
        <button mat-icon-button 
                #closeBtn 
                tabindex="-1" 
                id="{{tab.id}}" 
                class="close-btn" 
                (keyup)="closeTab($event, view)" 
                (click)="closeTab($event, view)" 
                aria-label="{{closetab}}"
                aria-hidden="true"
                (blur)="onCloseBtnBlur(closeBtn)">
          <mat-icon class="material-icons">cancel</mat-icon>
        </button>
      </div>
    </ng-template>
  </mat-tab>
</mat-tab-group>

组件类逻辑

onTabLabelClick(event: MouseEvent | KeyboardEvent, tabId: string): void {
  // 阻止事件冒泡,避免触发标签切换逻辑
  event.stopPropagation();
  
  const closeBtn = document.getElementById(tabId) as HTMLButtonElement;
  if (closeBtn) {
    // 激活按钮的可访问性
    closeBtn.tabIndex = 0;
    closeBtn.setAttribute('aria-hidden', 'false');
    // 将焦点移动到关闭按钮,此时JAWS会读取按钮的aria-label
    closeBtn.focus();
  }
}

onCloseBtnBlur(closeBtn: HTMLButtonElement): void {
  // 按钮失焦后恢复初始状态
  closeBtn.tabIndex = -1;
  closeBtn.setAttribute('aria-hidden', 'true');
}

关键修改说明

  • tabindex="-1":默认让按钮无法通过Tab键聚焦,也不会被屏幕阅读器的默认焦点遍历包含
  • aria-hidden="true":告诉JAWS初始状态下忽略这个按钮,所以聚焦标签时只会读取标签名
  • 标签容器的事件处理:当用户点击标签区域(非按钮部分)或用键盘激活标签时,切换按钮状态并聚焦,此时JAWS会读取按钮的关闭提示
  • event.stopPropagation():避免触发mat-tab的默认切换逻辑,确保用户点击标签是为了操作关闭按钮而非切换标签
  • blur事件处理:按钮失焦后恢复初始状态,保证下次聚焦标签时不会再读取按钮内容

内容的提问来源于stack exchange,提问作者Shashank G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:20:46