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

基于Alpine.js+TailwindCSS解决移动端菜单点击关闭及返回回显问题

解决方案

要解决这两个问题,只需做两处关键修改:

1. 点击菜单项时自动关闭菜单

给菜单列表的<ul>添加@click事件,利用事件冒泡特性,点击任何菜单项都会触发菜单关闭(无需给每个<a>标签单独绑定事件):

<ul
  class="md:flex md:px-6 text-gray-900 font-bold"
  :class="{ 'absolute p-6 top-20 left-7 right-7 text-center text-white bg-red-500 drop-shadow-md ': menuIsOpen, 'hidden': !menuIsOpen}"
  id="navbar-main"
  x-cloak
  @click="menuIsOpen = false" <!-- 新增此行 -->
>

2. 解决后退时菜单保持展开的问题

浏览器的**后退缓存(BF Cache)**会保留页面的JS状态,导致返回上一页时菜单仍处于展开状态。我们可以通过Alpine的x-init监听pageshow事件,每次页面显示时强制重置菜单状态:
给<nav>标签添加初始状态声明和监听逻辑:

<nav id="nav-main" @click.outside="menuIsOpen = false" x-cloak 
  x-data="{ menuIsOpen: false }" <!-- 声明初始状态 -->
  x-init="
    window.addEventListener('pageshow', (event) => {
      if (event.persisted) {
        menuIsOpen = false;
      }
    });
  "
>

修改后的完整代码

<nav id="nav-main" @click.outside="menuIsOpen = false" x-cloak 
  x-data="{ menuIsOpen: false }"
  x-init="
    window.addEventListener('pageshow', (event) => {
      if (event.persisted) {
        menuIsOpen = false;
      }
    });
  "
>
  <!--Hamburger-->
  <button
    @click.prevent="menuIsOpen = ! menuIsOpen"
    class="tham tham-e-slider tham-w-6 relative md:hidden"
    :class="{'tham-active': menuIsOpen}"
  >
    <span class="tham-box">
      <span class="tham-inner bg-gray-900" />
    </span>
  </button>
  <!--Menu list-->
  <ul
    class="md:flex md:px-6 text-gray-900 font-bold"
    :class="{ 'absolute p-6 top-20 left-7 right-7 text-center text-white bg-red-500 drop-shadow-md ': menuIsOpen, 'hidden': !menuIsOpen}"
    id="navbar-main"
    x-cloak
    @click="menuIsOpen = false"
  >
    <li
      class="px-3 cursor-pointer hover:text-red transition-all"
      :class="{'py-3': menuIsOpen}"
    >
      <a href="/" class=" {{ 'md:text-red-500' if url === 'domov' }}"
        >Domov</a
      >
    </li>
    <li
      class="px-3 cursor-pointer hover:text-red transition-all"
      :class="{'py-3': menuIsOpen}"
    >
      <a href="/onas" class=" {{ 'md:text-red-500' if url === 'onas' }}"
        >O nás</a
      >
    </li>
    <li
      class="px-3 cursor-pointer hover:text-red transition-all"
      :class="{'py-3': menuIsOpen}"
    >
      <a href="/vyroba" class=" {{ 'md:text-red-500' if url === 'vyroba' }}"
        >Výroba</a
      >
    </li>
    <li
      class="px-3 cursor-pointer hover:text-red transition-all"
      :class="{'py-3': menuIsOpen}"
    >
      <a
        href="/kontakt"
        class=" {{ 'md:text-red-500' if url === 'kontakt' }}"
        >Kontakt</a
      >
    </li>
  </ul>
</nav>

原理说明

  • 给<ul>绑定@click:借助事件冒泡,点击任何菜单项都会触发菜单关闭,比逐个绑定更简洁高效。
  • pageshow事件监听:当页面从后退缓存中恢复时(event.persisted为true),强制将menuIsOpen重置为false,确保返回页面时菜单处于收起状态。

内容的提问来源于stack exchange,提问作者Ľubo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:39:22