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

Angular项目中Materialize-CSS汉堡菜单无法触发侧边栏

Angular中Materialize-CSS侧边栏点击无响应问题

我在Angular项目里用Materialize-CSS实现移动端汉堡菜单触发侧边栏功能,菜单图标显示正常,但点击后侧边栏毫无反应。确认侧边栏已经完成实例化,也按官网步骤操作了,Materialize安装没问题,控制台没有JavaScript错误,只是代码里var instances = M.Sidenav.init(elems, {});提示“instances已声明但未使用”。

代码片段

HTML

<nav>
  <div class="nav-wrapper">
    <a href="#" data-target="mobile-demo" class="sidenav-trigger"><i class="material-icons">menu</i></a>
    <ul id="nav-mobile" class="hide-on-med-and-down">
      <li class="center-align social"><a href="https://www.instagram.com/prunieres_hotel_restaurant/"><i class="fa-brands fa-instagram fa-xl"></i></a></li>
      <li class="center-align"><a routerLink="">Accueil</a></li>
      <li class="center-align"><a routerLink="/hotel">Hôtel</a></li>
      <li class="center-align"><a routerLink="/restaurant">Restaurant</a></li>
      <li class="center-align"><a routerLink="/histoire"> Histoire</a></li>
      <li class="center-align"><a routerLink="/region">La Région</a></li>
      <li class="center-align"><a routerLink="/contact">Contact</a></li>
      <li class="center-align social"><a><i class="fa-brands fa-instagram invisible fa-xl"></i></a></li>
    </ul>
  </div>
</nav>

<ul class="sidenav" id="mobile-demo">
  <li class="social"><a href="https://www.instagram.com/prunieres_hotel_restaurant/"><i class="fa-brands fa-instagram fa-xl"></i></a></li>
  <li><a routerLink="">Accueil</a></li>
  <li><a routerLink="/hotel">Hôtel</a></li>
  <li><a routerLink="/restaurant">Restaurant</a></li>
  <li><a routerLink="/histoire"> Histoire</a></li>
  <li><a routerLink="/region">La Région</a></li>
  <li><a routerLink="/contact">Contact</a></li>
</ul>

TypeScript

import { Component, OnInit } from '@angular/core';

declare const M: any;

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrl: './app.component.scss'
})

export class AppComponent implements OnInit{

  ngOnInit() {
    document.addEventListener('DOMContentLoaded', function() {
      var elems = document.querySelectorAll('.sidenav');
      var instances = M.Sidenav.init(elems, {});
    });
  }
}

问题原因及解决办法

核心问题:DOM加载时机冲突

Angular的ngOnInit钩子执行时,组件对应的DOM已经渲染完成,此时再监听DOMContentLoaded事件,该事件早已触发,导致初始化代码根本没执行——这就是侧边栏点击无响应的关键原因。

修正后的代码

直接在ngOnInit里执行Materialize的初始化逻辑,无需额外监听DOMContentLoaded:

import { Component, OnInit } from '@angular/core';

declare const M: any;

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrl: './app.component.scss'
})

export class AppComponent implements OnInit{

  ngOnInit() {
    // 初始化侧边栏
    const sidenavElems = document.querySelectorAll('.sidenav');
    M.Sidenav.init(sidenavElems, {});
    
    // 可选:如果触发按钮仍无响应,手动初始化触发器
    const triggerElems = document.querySelectorAll('.sidenav-trigger');
    M.Sidenav.init(triggerElems, {
      edge: 'left',
      inDuration: 300
    });
  }
}

额外优化

  • 消除“instances未使用”警告:直接执行初始化,不声明无用变量:
    M.Sidenav.init(sidenavElems, {});
    
  • 确认Materialize的JS文件已正确引入到Angular项目(比如在angular.json的scripts数组中添加对应路径)。

内容的提问来源于stack exchange,提问作者Tristan Lacombe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:07:45