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

如何根据当前routerLink控制头部样式:首页滚动变色,其他页面固定深色

Angular首页滚动头部样式切换,其他页面固定深色头部问题解决

现有代码

导航菜单HTML

<header class="box-one"  >  
  <nav>
    <ul class="menu-horizontal">
      <li><a  routerLinkActive="active" routerLink="/init">init</a></li>
      <li><a  routerLinkActive="active" routerLink="plataform">Plataforms</a></li>
      <li><a  routerLinkActive="active"  routerLink="About us">About us</a></li>
      <li><a  routerLinkActive="active"  routerLink="contact">Contact</a></li>
    </ul>
  </nav>
</header>

滚动切换样式函数

funScroll() {
  var header = document.querySelector(".box-one")
  window.addEventListener("scroll", function () {
    header!.classList.toggle("arriba", window.scrollY < 800);
    header!.classList.toggle("abajo", window.scrollY > 500);
  })
}

存在问题的路由监听代码

private router = inject(Router)  
constructor() {
  this.router.events.subscribe(event => {
    if (event instanceof NavigationEnd) {
      console.log(event.url); // 当前路由
      this.currentRoute = event.url;
      if (event.url === "/inicio") {
        this.funScroll()
      } else {
      }
      if (event.url === "/plataforma") {
        var header = document.querySelector(".box-one");
        header!.classList.add('abajo');
      }
    }
  });
}

问题根源

  1. 路由判断错误:首页路由是/init,代码里却判断/inicio,导致首页无法触发滚动逻辑
  2. 滚动事件重复绑定:每次切回首页都会新增一个scroll监听,事件叠加后会导致样式切换异常
  3. 非首页处理不完整:仅给/plataforma页面添加深色类,其他页面未处理,且未清除首页可能残留的arriba类和滚动监听

修复后的代码

private router = inject(Router);
private scrollListener?: () => void;

constructor() {
  this.router.events.subscribe(event => {
    if (event instanceof NavigationEnd) {
      const header = document.querySelector(".box-one");
      if (!header) return;

      // 先移除之前的滚动监听,避免重复绑定
      if (this.scrollListener) {
        window.removeEventListener("scroll", this.scrollListener);
        this.scrollListener = undefined;
      }

      // 重置头部所有相关样式类
      header.classList.remove('arriba', 'abajo');

      if (event.url === "/init") {
        // 绑定滚动事件并保存引用,方便后续移除
        this.scrollListener = () => {
          header.classList.toggle("arriba", window.scrollY < 800);
          header.classList.toggle("abajo", window.scrollY > 500);
        };
        window.addEventListener("scroll", this.scrollListener);
        // 初始化首页当前滚动位置对应的样式
        header.classList.toggle("arriba", window.scrollY < 800);
        header.classList.toggle("abajo", window.scrollY > 500);
      } else {
        // 所有非首页页面固定添加深色类
        header.classList.add('abajo');
      }
    }
  });
}

// 组件销毁时清理监听,防止内存泄漏
ngOnDestroy() {
  if (this.scrollListener) {
    window.removeEventListener("scroll", this.scrollListener);
  }
}

额外优化建议

尽量避免直接操作DOM,改用Angular的@ViewChild获取元素,更符合框架最佳实践:

  1. 模板中给header添加标记:
<header #header class="box-one">
  <!-- 导航内容 -->
</header>
  1. 组件中获取元素:
@ViewChild('header') header!: ElementRef<HTMLElement>;

之后用this.header.nativeElement代替document.querySelector(".box-one")即可。

内容的提问来源于stack exchange,提问作者Elian F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:35:11