【shopify】コレクションをタブで切り替えて表示

目次

完成形

このようにコレクションをタブで切り替えてを表示したい。

サンプルコード

jsでイベントをフックするクラスはjs-*と命名しています。

既存のテンプレートをカスタマイズしやすいようにCSSはtailwindcssを使っています。

お使いのshopifyテーマに合うようにCSSを変更してお使いください。

<section class="js-tab-panel" data-section-id="{{ section.id }}" data-section-type="collection-tabs">
  <div class="container">
    <header class="flex justify-between items-stretch">
      {%- if section.settings.title_left_image -%}
        <div class="flex-none mr-2">
          <img src="{{ section.settings.title_left_image | img_url: '40x' }}" alt="{{ title_left_image.alt | escape }}"  class="">
        </div>
      {%- endif -%}
      
      <div class="flex-grow self-end">
        <h2>{{ section.settings.title | default: collection.title | escape }}</h2>
      </div>

      {%- if section.settings.title_right_image -%}
        <div class="flex-none">
          <img src="{{ section.settings.title_right_image | img_url: '40x' }}" alt="{{ title_right_image.alt | escape }}"  class="">
        </div>
      {%- endif -%}
    </header>
  </div>
  
  <div class="container p-0">
    <nav>
      <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
        <div class="relative flex items-center justify-between h-16" style="{% if section.settings.tabs_background_color != '#ffffff' %}background-color: {{ section.settings.tabs_background_color }};{% endif %}">
          
          <div class="flex-1 flex items-center justify-center items-stretch justify-start">
            <div class="scroller ml-6">
              <div class="flex space-x-4">
                {%- for block in section.blocks -%}
                  {%- assign collection = collections[block.settings.collection] -%}
                  {% if forloop.first == true %}
                    {%- assign classes = "js-tab bg-white font-medium px-3 py-2 rounded-md text-sm font-medium" -%}
                  {% else %}
                    {%- assign classes = "js-tab font-medium hover:bg-gray-100 px-3 py-2 rounded-md text-sm font-medium" -%}
                  {% endif %}
                  <div class="{{ classes }}">
                    {%- if block.settings.tab_title != blank -%}
                      {{ block.settings.tab_title }}
                    {%- else -%}
                      {{ collection.title | default:"Collection" }}
                    {%- endif -%}
                  </div>
                {%- endfor -%}
              </div>
            </div>
          </div>
        </div>
      </div>
    </nav>
  </div>

  <div class="container p-0">
    <div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
      <div class="px-2 pt-2 pb-3 space-y-1">
        {%- for block in section.blocks -%}
          {%- assign collection = collections[block.settings.collection] -%}
          {%- if collection.empty? -%}
            {%- assign products = (1..section.settings.products_count) -%}
            {%- assign use_placeholder = true -%}
          {%- else -%}
            {%- assign products = collection.products -%}
            {%- assign use_placeholder = false -%}
          {%- endif -%}

          {% if forloop.first == true %}
            {%- assign classes = "js-panel block grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 mx-auto" -%}
          {% else %}
            {%- assign classes = "js-panel hidden grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 mx-auto" -%}
          {% endif %}

          <div class="{{ classes }}">
            {%- for product in products limit: section.settings.products_count -%}
              {%- assign collection = collections[block.settings.collection] -%}
              
              {%- if use_placeholder -%}
                {%- include 'product-item-placeholder', product: product, horizontal: true, grid_classes: '', show_add_to_cart: section.settings.show_quick_buy -%}
              {%- else -%}
                {%- include 'product-item-responsive', product: product, horizontal: true, grid_classes: '', show_add_to_cart: section.settings.show_quick_buy -%}
              {%- endif -%}
            {%- endfor -%}
          </div>
        {%- endfor -%}
      </div>
    </div>
  </div>
</section>

{% schema %}
{
  "name": "Collection tabs",
  "settings": [
    
    {
      "type": "image_picker",
      "id": "title_left_image",
      "label": "Heading Left Image",
      "info": "40 x 40px .jpg recommended"
    },
    {
      "type": "text",
      "id": "title",
      "label": "Heading",
      "default": "Our collections"
    },
    {
      "type": "image_picker",
      "id": "title_right_image",
      "label": "Heading Right Image",
      "info": "40 x 40px .jpg recommended"
    },
    {
      "type": "color",
      "id": "tabs_background_color",
      "label": "Tabs Background Color",
      "default": "#ffffff"
    },
    {
      "type": "color",
      "id": "collection_title_color",
      "label": "Collection title color",
      "default": "#000000"
    },
    {
      "type": "range",
      "id": "products_count",
      "label": "Products to show",
      "min": 4,
      "max": 50,
      "step": 1,
      "default": 10
    },
    {
      "type": "checkbox",
      "id": "show_quick_buy",
      "label": "Show quick buy",
      "default": false,
      "info": "Only shows if layout is set to vertical"
    }
  ],
  "blocks": [
    {
      "type": "collection",
      "name": "Collection",
      "settings": [
        {
          "type": "collection",
          "id": "collection",
          "label": "Collection"
        },
        {
          "type": "text",
          "id": "tab_title",
          "label": "Tab Title"
        }
      ]
    }
  ],
  "presets": [
    {
      "category": "Collection",
      "name": "Collection list(tabs)",
      "blocks": [
        {
          "type": "collection"
        },
        {
          "type": "collection"
        },
        {
          "type": "collection"
        },
        {
          "type": "collection"
        },
        {
          "type": "collection"
        },
        {
          "type": "collection"
        }
      ]
    }
  ]
}
{% endschema %}

こちらはタブを押したときに発火するJSです。

document.addEventListener("DOMContentLoaded", function () {
  // タブに対してクリックイベントを適用
  const tabs = document.getElementsByClassName("js-tab");
  for (let i = 0; i < tabs.length; i++) {
    tabs[i].addEventListener("click", tabSwitch);
  }

  // タブをクリックすると実行する関数
  function tabSwitch() {
    // 引数で指定したセレクターと一致する直近の祖先要素を取得
    const ancestorEle = this.closest(".js-tab-panel");
    // タブのclassの値を変更
    const active_tab_classes = "bg-white";
    const inactive_tab_classes = "hover:bg-gray-100";
    ancestorEle
      .getElementsByClassName(active_tab_classes)[0]
      .classList.add(inactive_tab_classes);
    ancestorEle
      .getElementsByClassName(active_tab_classes)[0]
      .classList.remove(active_tab_classes);
    this.classList.add(active_tab_classes);
    this.classList.remove(inactive_tab_classes);

    // コンテンツのclassの値を変更
    const active_content_classes = "block";
    const inactive_content_classes = "hidden";
    const targetEle = ancestorEle.getElementsByClassName(
      active_content_classes
    )[0];
    targetEle.classList.remove(active_content_classes);
    targetEle.classList.add(inactive_content_classes);

    const groupTabs = ancestorEle.getElementsByClassName("js-tab");
    const arrayTabs = Array.prototype.slice.call(groupTabs);
    const index = arrayTabs.indexOf(this);
    const targetPanel = ancestorEle.getElementsByClassName("js-panel")[index];
    targetPanel.classList.add(active_content_classes);
    targetPanel.classList.remove(inactive_content_classes);
  }
});
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする


The reCAPTCHA verification period has expired. Please reload the page.

目次