ハンバーガーメニューのスライド方向

みなさんこんにちは。モバイルデバイスで、ハンバーガーパネルがプロフィールパネルと同じように画面の右側からスライドアウトするように設定しようとしています。ハンバーガーパネルには left: 0 というルールが特別に存在しているのを目にしました。CSS を調整してみましたが、プロフィールパネルの左スライド動作を再現することができません。ハンバーガーパネルに特化した CSS はあまり多くないようですが、何が足りないのかよくわかりません。

何かヒントや気づきがあれば、教えていただけると嬉しいです!よろしくお願いします。

こんにちは、Lukas さん、Meta へようこそ :wave:

この実装で CSS はあまり関与していません。アニメーションは CSS で処理されますが、オフセットの値は JavaScript で設定されています。これは、ユーザーがメニューを閉じるために右または左にスクロールまたはパンするケースに対応するためです。

そのロジックの大部分は以下の場所にあります。これは一つのメソッドに過ぎず、そのファイルには他にもいくつかのメソッドが関与しています。

また、ユーザーが暗くされた背景をクリックしてメニューを閉じるケースを処理するロジックもあります。

ユーザーメニューの場合:

ハンバーガーメニューの場合:

ハンバーガーメニューを右側から開閉するように変更するには、以下の 2 つのことを行う必要があります。

  1. site-header コンポーネントを ModifyClass を使って変更し、すべてのメニューを右側から開くようにします。現在、メニューの クラスを確認 していますが、これを以下のようにオーバーライドします。

    api.modifyClass("component:site-header", {
      pluginId: "right-side-mobile-hamburger",
      _leftMenuClass() {
        // 左側のメニューは不要なので false を返す
        return false;
      }
    });
    
  2. メニューを閉じる際にも、右側から閉じるようにします。スクロール/パンイベントについては、上記のスニペットですでに処理されています。次に、ユーザーが暗くされた背景をクリックするケースを修正する必要があります。Discourse は、サイトが RTL 言語を使用しているかどうか に基づいてこれを決定します。これを変更するには、ハンバーガーパネルがウィジェットであるため、別の 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+ クラスの顧客サポートで、感銘を受け、心より感謝しております。