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

Vue.js响应式导航栏问题:汉堡按钮点击后菜单不显示

Fixes for Your Responsive Vue Navbar

1. Fix Nav Menu Display Issue

The core problem preventing your menu from showing is an incorrect CSS selector. You used .nav-menu:active (which targets the element only while it’s being clicked) instead of .nav-menu.active (which targets the element when it has the active class applied). Update your media query CSS:

@media(max-width:767px) {
  /* ... keep existing styles ... */
  
  /* Replace this line */
  /* .nav-menu:active { left: 0; } */
  
  /* With this */
  .nav-menu.active {
    left: 0;
  }
}

2. Fix Click Event Listener

Your current window click listener toggles the menu state every time any part of the page is clicked, which is unintended. Modify it to only trigger when the hamburger icon is clicked:

<script>
export default {
  setup() {
    const toggleMenu = (event) => {
      // Only run if the click originates from the hamburger or its children
      if (!event.target.closest('.hamburger')) return;
      
      const hamburger = document.querySelector(".hamburger");
      const navMenu = document.querySelector(".nav-menu");

      hamburger.classList.toggle("active");
      navMenu.classList.toggle("active");
    };
    
    window.addEventListener("click", toggleMenu);
    
    // Clean up the event listener when the component unmounts
    return () => window.removeEventListener("click", toggleMenu);
  }
}
</script>

3. Vue Best Practice: Use Refs Instead of document.querySelector

For better Vue integration and reactivity, replace direct DOM queries with template refs:

Update the template to add refs:

<template>
  <header>
    <nav class="navbar">
      <img style="width: 100px; border-radius: 50%;" src="../../" alt="Name here">
      <a href="/" class="nav-branding text-center">Name</a>
      <ul class="nav-menu" ref="navMenu">
        <!-- ... menu items ... -->
      </ul>
      <div class="hamburger" ref="hamburger">
        <span class="bar"></span>
        <span class="bar"></span>
        <span class="bar"></span>
      </div>
    </nav>
  </header>
</template>

Update the script to use refs:

<script>
import { ref, onMounted, onUnmounted } from 'vue';

export default {
  setup() {
    const hamburger = ref(null);
    const navMenu = ref(null);
    
    const toggleMenu = (event) => {
      if (!event.target.closest('.hamburger')) return;
      
      hamburger.value.classList.toggle("active");
      navMenu.value.classList.toggle("active");
    };
    
    onMounted(() => window.addEventListener("click", toggleMenu));
    onUnmounted(() => window.removeEventListener("click", toggleMenu));
    
    return { hamburger, navMenu };
  }
}
</script>

Regarding the Codepen ToggleIcon Issue

Common reasons the ToggleIcon might not display include:

  • Missing component registration: Ensure the ToggleIcon component is imported and registered in your Vue app.
  • CSS conflicts: Check if custom styles are hiding the icon (e.g., display: none or opacity: 0).
  • Version mismatches: The Codepen may rely on specific Vue versions or dependencies not present in your project.

内容的提问来源于stack exchange,提问作者Daniel Andersen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:54:25