汉堡菜单滑动方向

大家好,我试图在移动设备上配置汉堡菜单面板,使其从屏幕右侧滑出,配置方式与个人资料面板完全相同。我看到汉堡菜单面板有一个专门设置的 left: 0 规则。我一直在调整 CSS,但无法复制个人资料面板的向左滑动行为。似乎没有太多专门针对汉堡菜单面板的 CSS,所以我不太确定自己遗漏了什么。

非常希望大家能提供一些提示或见解,告诉我可能遗漏了什么!谢谢大家。

嘿 Lukas,欢迎加入 Meta :wave:

这里涉及的 CSS 并不多。动画由 CSS 处理,但偏移量的值是在 JavaScript 中设置的,以处理用户向右或向左滚动/平移以关闭菜单的情况。

大部分逻辑都在这个文件中——这只是一个方法;该文件中还涉及其他几个方法:

还有一些逻辑用于处理用户点击变暗背景以关闭菜单的情况。

针对用户菜单:

针对汉堡菜单:

要修改这些代码使汉堡菜单在右侧打开和关闭,涉及两个方面。

  1. 使用 ModifyClass 修改 site-header 组件,使其从右侧打开所有菜单。它目前会 检查菜单上的类,因此我们可以像这样覆盖它:

    api.modifyClass("component:site-header", {
      pluginId: "right-side-mobile-hamburger",
      _leftMenuClass() {
        // 我们不希望有任何左侧菜单,因此返回 false
        return false;
      }
    });
    
  2. 关闭菜单时,我们也希望它向右侧关闭。对于滚动/平移事件,上述代码片段已经处理了这一点。现在我们需要修复用户点击变暗背景时的情况。Discourse 会根据 站点是否使用 RTL 语言 来决定这一点。要修改此行为,由于汉堡面板是一个 widget,我们需要使用不同的 plugin-api 方法。

    我们将使用的方法是 reopenWidget,如下所示:

     api.reopenWidget("hamburger-menu", {
      clickOutsideMobile() {
        // 应用核心代码
        this._super(...arguments);
    
        // 然后进行修改,使其向右侧关闭
        const panel = document.querySelector(".menu-panel");
        const windowWidth = document.body.offsetWidth;
        panel.style.setProperty("--offset", `${windowWidth}px`);
      }
    });
    

接下来,你只需要添加几行 CSS 来覆盖该菜单的默认样式,如下所示:

.hamburger-panel,
.user-menu {
  .menu-panel.slide-in {
    left: unset;
    right: 0;
  }
}

现在让我们将所有内容整合在一起。这部分代码应放在你主题的 mobile > header 标签页中:

<script type="text/discourse-plugin" version="0.8">
api.modifyClass("component:site-header", {
  pluginId: "right-side-mobile-hamburger",
  _leftMenuClass() {
    // 我们不希望有任何左侧菜单,因此返回 false
    return false;
  }
});

api.reopenWidget("hamburger-menu", {
  clickOutsideMobile() {
    // 应用核心代码
    this._super(...arguments);

    // 然后进行修改,使其向右侧关闭
    const panel = document.querySelector(".menu-panel");
    const windowWidth = document.body.offsetWidth;
    panel.style.setProperty("--offset", `${windowWidth}px`);
  }
});
</script>

这部分代码应放在 mobile > CSS 标签页中:

.hamburger-panel,
.user-menu {
  .menu-panel.slide-in {
    left: unset;
    right: 0;
  }
}

保存主题并刷新页面后,汉堡菜单将在移动端从右侧打开和关闭——就像用户菜单一样。

这才是提供完整答案的正确方式。干得好!

太棒了!非常感谢您详细的回复,Joe!A+ 的客户服务,令我印象深刻且充满感激。