Liquid Snippets by ALSEL
🧭 ヘッダー/フッター/ナビゲーション中級

オフキャンバスメニュー

画面下部からスライドインするモバイル対応メニュー。メインメニュー、サブメニュー(アコーディオン形式)、ソーシャルアイコン、言語・国設定切替に対応している。

用途
モバイル・タブレット画面でハンバーガーメニューをタップしたときに、オフキャンバス(画面下から上へ)のナビゲーションパネルを表示する。
設置場所
snippets/offcanvas-menu.liquid に配置し、theme.liquid または layout/theme.liquid のカートドロワーやモーダルと同様にページ下部(`</body>` 直前)で呼び出す。ハンバーガーボタンから `data-bs-toggle="offcanvas" data-bs-target="#offcanvas-menu"` で開閉制御する。
注意点
Shopify 管理画面で「メインメニュー」「セカンダリメニュー」のリンクリストハンドルが block.settings に設定されていることが前提。サブメニュー項目のタイトルが「-」の場合は区切り線として `<hr>` を描画するため、メニュー構造設計時に活用できる。多言語・多地域対応は localization オブジェクトに依存するため、Shopify Markets が有効になっていない場合は言語切替セクションが非表示になる。Bootstrap のオフキャンバス・コラップスコンポーネントを前提としているため、テーマに Bootstrap JS が読み込まれていることを確認する。
タグ:navigationmenuoffcanvasaccordionmobilelinklists

コード

97 行 / liquid
<div 
  id="offcanvas-menu" 
  class="offcanvas offcanvas-bottom" 
  tabindex="-1" 
  data-bs-backdrop="false"
  aria-label="{{ 'general.accessibility.menu' | t }}">
  <div class="offcanvas-body">
    {% unless block.settings.main_menu == nil %}
      <ul class="nav accordion-nav mb-9">
        {% for link in linklists[block.settings.main_menu].links %}
          {% if link.links == blank %}
            <li class="nav-item">
              <a 
                class="nav-link {% if link.active %}active{% endif %}" 
                href="{{ link.url }}" 
                aria-current="{% if link.active %}page{% endif %}">
                {{ link.title }}
              </a>
            </li>
          {% else %}
            <li class="nav-item collapse-wrapper">
              <a 
                class="nav-link {% if link.child_active %}active{% endif %}" 
                href="#offcanvas-menu-collapse-{{ forloop.index }}" 
                aria-controls="offcanvas-menu-collapse-{{ forloop.index }}"
                aria-expanded="{% if link.child_active %}true{% else %}false{% endif %}" 
                data-bs-toggle="collapse"
                role="button">
                {{ link.title }}
                {% render 'svg-icons', icon: 'chevron-down', size: 18 %}
              </a>
              <div 
                id="offcanvas-menu-collapse-{{ forloop.index }}" 
                class="collapse {% if link.child_active %}show{% endif %}">
                <ul class="nav flex-column">
                  {% for child_link in link.links %}
                    <li>
                      {% if child_link.title == '-' %}
                        <hr class="my-3">
                      {% else %}
                        <a 
                          class="dropdown-item {% if child_link.active %}active{% endif %}" 
                          href="{{ child_link.url }}"
                          aria-current="{% if child_link.active %}page{% endif %}">
                          {{ child_link.title }}
                        </a>
                      {% endif %}
                    </li>
                  {% endfor %}
                </ul>
              </div>
            </li>
          {% endif %}
        {% endfor %}
      </ul>
    {% endunless %}

    {% if block.settings.social_icons %}
      <div class="social-icons-wrapper text-center mb-5">
        {% render 'social-icons', show_title: false %}
      </div>
    {% endif %}

    {% unless block.settings.secondary_menu == nil %}
      <ul class="nav nav-secondary justify-content-center mb-4">
        {% for link in linklists[block.settings.secondary_menu].links %}
          <li class="nav-item">
            <a 
              class="nav-link py-2 px-4 {% if link.active %}active{% endif %}" 
              href="{{ link.url }}" 
              aria-current="{% if link.active %}page{% endif %}">
              {{ link.title }}
            </a>
          </li>
        {% endfor %}
      </ul>
    {% endunless %}

    <ul class="nav justify-content-center mb-4">
      {% if localization.available_countries.size > 1 %}
        <li class="nav-item">
          <a
            class="nav-link nav-link-icon"
            href="#modal-localization"
            data-bs-toggle="modal"
            aria-controls="modal-localization" 
            aria-label="{{ 'general.accessibility.localization' | t }} {{ localization.country.name }}"
            role="button">
            {{ localization.country | image_url: width: 20, height: 20 | image_tag }}
          </a>
        </li>
      {% endif %}
    </ul>
    
  </div>
</div>

出典・ライセンス

License:
MIT

このコードは kondasoft 著作の MIT ライセンスソースです。 原本の著作権は kondasoft が保有します。日本語訳は ALSEL によるものです。

関連項目

🧭 ヘッダー/フッター/ナビゲーション中級

Alpine.js統合のメニュー開閉

Alpine.js の @click ディレクティブと :class バインディングを使ったメニュー開閉コンポーネント。ボタンクリックで open 状態を切り替え、ul 要素に expanded クラスを条件付きで付与する。

📁 theme-tools·MIT·5
🧭 ヘッダー/フッター/ナビゲーション初級

ヘッダーのレイアウト構造

Web Component のカスタムエレメント `<c-header>` でラップしたヘッダー要素。Tailwind CSS のユーティリティクラスを使い、レスポンシブなパディングとフレックスボックスレイアウトを実装している。

📁 theme-tools·MIT·14
🧭 ヘッダー/フッター/ナビゲーション初級

ナビゲーションバーのロゴ

ストアのロゴをナビゲーションバーに表示し、クリックでホームページに戻るコンポーネント。ロゴ画像がない場合はストア名をテキストで表示する。

📁 ks-bootshop·MIT·18
🧭 ヘッダー/フッター/ナビゲーション初級

決済方法アイコン

ストアで有効な決済手段のアイコンをリスト表示するスニペット。Shopify が提供する `payment_type_svg_tag` フィルタを使い、クレジットカード・Apple Pay・Google Pay などのロゴを自動的に描画する。

📁 ks-bootshop·MIT·18
🧭 ヘッダー/フッター/ナビゲーション初級

グローバルナビゲーションメニュー

Shopify 管理画面の「メインメニュー」リンクリストをループし、トップレベルメニュー + 1階層のサブメニューを描画するスニペット。link.title と sub_link.title を escape フィルターでエスケープして XSS 対策を施している。

📁 shopify-theme-lab·MIT·19
🧭 ヘッダー/フッター/ナビゲーション初級

フッター

ストア共通のフッターセクション。管理画面で設定したフッターメニュー(リンクリスト)をループ表示し、著作権表記を出す。

📁 shopify-theme-lab·MIT·25