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

Angular中routerLinkActive对所有锚点链接生效,如何仅点击对应链接激活?

问题解决:Angular锚点链接routerLinkActive全激活的问题

问题说明

给页面头部的锚点链接添加routerLinkActive后,所有链接都被加上了激活样式。原因是所有链接的routerLink都指向根路径'',Angular的routerLinkActive默认只匹配路由路径,不区分锚点(fragment),导致所有链接都判定为激活状态。需要实现仅点击对应锚点链接时才激活样式。

解决方案

因为routerLinkActive默认不处理锚点,所以可以通过手动绑定样式类结合路由URL判断来实现精准激活,以下是最简单直接的实现方式:

步骤1:组件类注入Router

在对应组件的.ts文件中导入并注入Router(设为public方便模板直接访问):

import { Component } from '@angular/core';
import { Router } from '@angular/router';

@Component({
  selector: 'app-header',
  templateUrl: './header.component.html',
  styleUrls: ['./header.component.scss']
})
export class HeaderComponent {
  constructor(public router: Router) {}
}

步骤2:修改HTML模板的样式绑定

把原来的routerLinkActive替换为[class.active-link],通过判断当前URL是否包含对应锚点来控制样式:

<ul class="nav-links">
  <li class="nav-link-item">
    <a class="header__link" routerLink="" fragment="home" [class.active-link]="router.url.includes('#home')">
      {{ 'home' | transloco }}
    </a>
  </li>
  <li class="nav-link-item">
    <a class="header__link" routerLink="" fragment="services" [class.active-link]="router.url.includes('#services')">
      {{ 'ourServices' | transloco }}
    </a>
  </li>
  <li class="nav-link-item">
    <a class="header__link" routerLink="" fragment="domestic-product" [class.active-link]="router.url.includes('#domestic-product')">
      {{ 'domesticProduct' | transloco }}
    </a>
  </li>
  <li class="nav-link-item">
    <a class="header__link" routerLink="" fragment="we-offer" [class.active-link]="router.url.includes('#we-offer')">
      {{ 'whatWeOffer' | transloco }}
    </a>
  </li>
</ul>

可选:保留routerLinkActive的扩展写法

如果想继续使用routerLinkActive,可以在组件类中自定义判断方法:

// 组件类中添加方法
isActive(fragment: string): boolean {
  return this.router.url.includes(`#${fragment}`);
}

模板中对应写法:

<a class="header__link" 
   routerLink="" 
   fragment="home" 
   routerLinkActive="active-link"
   [routerLinkActiveOptions]="{ exact: true }"
   [isActive]="isActive('home')">
  {{ 'home' | transloco }}
</a>

路由配置无需修改

原路由配置保持不变即可:

import { Routes } from '@angular/router';
import { HomeComponent } from './main-layout/pages/home/home.component';
import { NotFoundPageComponent } from './shared/components/not-found-page/not-found-page.component';

export const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'error', component: NotFoundPageComponent },
  { path: '**', redirectTo: 'error' },
];

内容的提问来源于stack exchange,提问作者Nikita Smirnov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:07:17