bulma 导航栏菜单在移动设备上默认打开

bulma navbar menu open by default on mobile

我有一个 bulma 导航栏,我正在使用 React 进行操作。下面是生成的代码。在桌面上,菜单正确显示并按预期打开和关闭下拉菜单。

但在移动设备上,默认情况下所有下拉菜单都是打开的,虽然 class "is-active" 在我单击 "navbar-link" 时被添加和删除,但菜单没有打开并且按预期关闭。

<nav class="navbar" role="navigation" aria-label="main navigation">
   <div class="navbar-brand">
      <a role="button" class="navbar-burger burger" aria-label="menu" aria-expanded="false" data-target="navbar">
      <span aria-hidden="true"></span>
      <span aria-hidden="true"></span>
      <span aria-hidden="true"></span>
      </a>
   </div>
   <div id="navbar" class="navbar-menu is-active">
      <div class="navbar-start">

         <div class="navbar-item has-dropdown">
            <a class="navbar-link">Data Types</a>
            <div class="navbar-dropdown">
               <div class="types">
                  Select Content
               </div>
            </div>
         </div>
      </div>
   </div>
</nav>

上面代码中的"is-active"是从汉堡菜单打开菜单。我究竟做错了什么?

我需要添加 sass

.navbar-item {
    &.has-dropdown {
      .navbar-dropdown {
        display: none;
      }
      &.is-active {
        .navbar-dropdown {
          display: block;
        }
      }
   }
}

在我的 sass 中的@mobile 下。然后手机的行为就像桌面一样。

css 代码仅隐藏下拉链接,但您无法再在移动设备上访问它们。

我也遇到过这个问题,所以决定试试 Buefy。这不完全是一个纯粹的 Bulma 答案,但默认情况下它可以被认为是接近的并且它是第一次工作。

我正在使用 Nuxt,最初使用 Bulma 作为 nuxtjs 模块,installation/conversion 从 Bulma 到 Buefy 很简单:https://buefy.org/documentation/start/#nuxtjs.

为了进行全新的集成,我从 nuxt-config 中删除了 Bulma 模块,删除了 node_modules/package-lock。json,并遵循了上述指南。

我根据我的要求调整了 Buefy Navbar component,它正常工作 - shows/hides 下拉列表正确 - 它还自动添加了正确的 Aria 属性:

  <template>
  <b-navbar>
    <template slot="brand">
      <h1>
        <nuxt-link to="/" class="navbar-item is-size-4" id="homelink">
          Brand link here
        </nuxt-link>
      </h1>
    </template>

    <template slot="end">
      <b-navbar-item tag="div">
        <div class="buttons">
          <nuxt-link class="navbar-item" to="/projects">Projects</nuxt-link>
          <nuxt-link class="navbar-item" to="/about">About/Contact</nuxt-link>
        </div>
      </b-navbar-item>
    </template>
  </b-navbar>
</template>

这对我来说就像一个魅力--->

        /** The jQuery will trigger only at mobile viewport */
    if (window.matchMedia("(max-width: 767px)").matches) {    
            const $navDropdowns = document.querySelectorAll(".navbar-item.has-dropdown");
        if ($navDropdowns.length > 0) {
            // HIDE THE DROP-DOWN ON THE INITIAL LOAD
            $navDropdowns.forEach((el) => {
                const target = el.dataset.target;
                const $target = document.getElementById(target);
                $target.style.display = "none";
        
            //Register the click event on the dropdown list
                el.addEventListener("click", () => {
                    // Get the target from the "data-target" attribute
                    const target = el.dataset.target;
                    const $target = document.getElementById(target);
    
                    if ($target.style.display === "block") {
                        $target.style.display = "none";
                    } else {
                        $target.style.display = "block";
                    }
                });
            });
        }
}
    

Collapsed Menu

Expanded Menu

这是导航栏的 HTML:

<nav class="navbar" role="navigation" aria-label="main navigation">
        <div class="navbar-brand">
            <a class="navbar-item" href="https://bulma.io">
                <img src="https://bulma.io/images/bulma-logo.png" width="112" height="28" />
            </a>

            <a role="button" class="navbar-burger" @click="toggle" aria-label="menu" aria-expanded="false" data-target="navbarBasicExample">
                <span aria-hidden="true"></span>
                <span aria-hidden="true"></span>
                <span aria-hidden="true"></span>
            </a>
        </div>

        <div id="navbarBasicExample" class="navbar-menu">
            <div class="navbar-start">
                <a class="navbar-item">
                    Home
                </a>

                <a class="navbar-item">
                    Documentation
                </a>

                <div data-target="more" class="navbar-item has-dropdown is-hoverable">
                    <a class="navbar-link">
                        More
                    </a>

                    <div class="navbar-dropdown" id="more">
                        <a class="navbar-item">
                            About
                        </a>
                        <a class="navbar-item">
                            Jobs
                        </a>
                        <a class="navbar-item">
                            Contact
                        </a>
                        <hr class="navbar-divider" />
                        <a class="navbar-item">
                            Report an issue
                        </a>
                    </div>
                </div>

                <div data-target="new" class="navbar-item has-dropdown is-hoverable">
                    <a class="navbar-link">
                        New
                    </a>

                    <div class="navbar-dropdown" id="new">
                        <a class="navbar-item">
                            About
                        </a>
                        <a class="navbar-item">
                            Jobs
                        </a>
                        <a class="navbar-item">
                            Contact
                        </a>
                        <hr class="navbar-divider" />
                        <a class="navbar-item">
                            Report an issue
                        </a>
                    </div>
                </div>
            </div>

            <div class="navbar-end">
                <div class="navbar-item">
                    <div class="buttons">
                        <a class="button is-primary">
                            <strong>Sign up</strong>
                        </a>
                        <a class="button is-light">
                            Log in
                        </a>
                    </div>
                </div>
            </div>
        </div>
    </nav>

注意 data-target="more", data-target="new" 和子元素中传递的 id .顺便说一句,这是在 Vuejs 应用程序上的实现,但它适用于任何地方。

默认情况下,$navbar-breakpoint 设置为在 $desktop 处中断。

您可以在自己的 mystyles.scss 中覆盖您的初始 bulma 变量,就像 bulma 在此处描述的那样 https://versions.bulma.io/0.7.0/documentation/overview/customize/。 如果您不希望它损坏,它可能看起来像这样:$navbar-breakpoint: 0px