Production Shopify · Product tabs

Ship product information tabs merchants can reorder

Product descriptions, specs, shipping, and reviews deserve labeled navigation—not a wall of text or exclusive accordions. This guide is about tab panel blocks that merchants can reorder, disable, and populate on PDPs without touching code.

Production implementation guide · Updated 2026-08-03

Tabs are not exclusive accordions—teach the interaction model

Tabs present multiple labeled panels where one is visible at a time by horizontal navigation. Accordions vertically stack collapsible panels. Both are valid on PDPs, but the choice depends on content density and whether merchants expect to see all labels simultaneously.

Tab sections

  • Horizontal label row always visible
  • One panel active; switching is fast
  • Good for 3–6 distinct information categories
  • Desktop-first pattern (requires thoughtful mobile adaptation)

Accordion sections

  • Vertical stack of headers
  • Panels can expand/collapse independently or exclusively
  • Good for progressive disclosure of variable-length content
  • Mobile-native pattern (works well on desktop too)

ARIA tabs pattern: roles, selection, and panel association

The ARIA tabs pattern requires role=tablist on the container, role=tab on triggers, and role=tabpanel on content. Only one tab is aria-selected=true. Arrow keys should move focus between tabs (roving tabindex). Enter/Space activates the focused tab.

Tabs are not buttons—they are a navigational widget. Do not mix accordion and tab roles in one section.

Tab structure sketch (ARIA-compliant)

{% assign first = true %}
<div class="product-tabs" role="tablist" aria-label="Product information">
  {% for block in section.blocks %}
    {% assign tab_id = 'Tab-' | append: section.id | append: '-' | append: block.id %}
    {% assign panel_id = 'Panel-' | append: section.id | append: '-' | append: block.id %}
    <button
      id="{{ tab_id }}"
      role="tab"
      aria-selected="{% if first %}true{% else %}false{% endif %}"
      aria-controls="{{ panel_id }}"
      tabindex="{% if first %}0{% else %}-1{% endif %}"
      data-tab-trigger
    >
      {{ block.settings.tab_label | escape }}
    </button>
    {% assign first = false %}
  {% endfor %}
</div>

{% assign first = true %}
{% for block in section.blocks %}
  {% assign panel_id = 'Panel-' | append: section.id | append: '-' | append: block.id %}
  <div
    id="{{ panel_id }}"
    role="tabpanel"
    {% unless first %}hidden{% endunless %}
    data-tab-panel
    {{ block.shopify_attributes }}
  >
    {{ block.settings.content }}
  </div>
  {% assign first = false %}
{% endfor %}

First tab selected by default. Panel visibility synced with aria-selected. Block attributes let merchants reorder.

Blocks for reorderable tab panels

Each tab should be a block with a label and content setting. Merchants drag blocks in the theme editor to reorder tabs—no code required. Set max_blocks between 4 and 8 to prevent tab overflow.

Preset three tabs: Description, Shipping, Reviews (or Size guide). Teach the pattern without overwhelming new merchants.

Schema sketch — tab panel blocks

{
  "name': 'Product tabs",
  "settings": [
    {
      "type': 'select",
      "id': 'mobile_behavior",
      "label': 'Mobile display",
      "options": [
        { "value": "tabs", "label": "Scrollable tabs" },
        { "value": "accordion", "label": "Stacked accordion" }
      ],
      "default': 'tabs"
    }
  ],
  "blocks": [
    {
      "type': 'tab",
      "name': 'Tab panel",
      "settings": [
        {
          "type': 'text",
          "id': 'tab_label",
          "label': 'Tab label",
          "default': 'Description"
        },
        {
          "type': 'richtext",
          "id': 'content",
          "label': 'Panel content"
        }
      ]
    }
  ],
  "max_blocks": 6,
  "presets": [
    {
      "name': 'Product tabs",
      "blocks": [
        { "type": "tab", "settings": { "tab_label": "Description" } },
        { "type": "tab", "settings": { "tab_label": "Shipping & returns" } },
        { "type": "tab", "settings": { "tab_label": "Reviews" } }
      ]
    }
  ]
}

Three-tab preset teaches the pattern. mobile_behavior setting adapts UI. max_blocks prevents label overflow.

Mobile tab strategy: scrollable labels or accordion fallback

On narrow viewports, horizontal tab labels may overflow. Options: make the tablist scrollable with visible overflow indication, or switch to accordion markup below a breakpoint. Both are valid—choose based on brand UX.

If switching to accordion on mobile, use the same block loop but swap roles and interaction. Document the breakpoint.

When to use blocks vs product metafields for tab content

Blocks are excellent when the same tabs appear on every product or template. Product metafields shine when tab content is SKU-specific (per-product care instructions, detailed specs). A hybrid approach: blocks for shared tabs (Shipping), metafields for product-owned tabs (Technical specs).

If a tab is empty, hide it. Do not render an empty panel or disabled tab label.

Production debugging for tab sections

Tab section symptoms and checks
SymptomChecks
Wrong panel shows after clicking a tabaria-controls mismatch? Panel IDs unique per section instance? JS selecting wrong panel?
Tabs break when section duplicated on templateIDs scoped to section.id? Global selectors leaking between instances?
First tab not selected on loadFirst block aria-selected=true? Panel hidden attribute logic?
Mobile tabs disappearOverflow hidden on container? No scroll affordance? Accordion breakpoint not triggered?

Practice a product tab section by hand

Build this on a development product template before using any generator. You should explain the ARIA tabs pattern and when tabs are better than accordions.

  1. 01

    Create sections/product-tabs.liquid

    Implement role=tablist, role=tab, role=tabpanel; use blocks for panels; set max_blocks.

  2. 02

    Keyboard navigation

    Arrow keys move focus between tabs (roving tabindex). Enter/Space activates.

  3. 03

    Mobile strategy

    Scrollable labels or accordion breakpoint—test on narrow viewport.

  4. 04

    Empty-state pass

    Tab with blank content should not render or show fallback message.

  5. 05

    Duplication test

    Add two tab sections on one template; operate independently.

Use the converter after the tab model is settled

Static tab HTML can be drafted faster in the converter once you know whether you need blocks or metafields, mobile behavior, and roving focus. The converter does not decide PDP information architecture for you.

Supporting draft acceleration — not a substitute for tab UX design.

What to study next for PDP tab sections

Continue with adjacent skills. Accordion disclosures are a different pattern—study when exclusive collapsible panels are better than horizontal tabs.

Beginner

Liquid and section placement before tab chrome.

Intermediate

Blocks, ARIA patterns, and related collapsible UI.

Advanced

Delivery under merchandising pressure.

Editorial review

Reviewed by the HTML to Liquid Converter team

Dhruv Goyani, Shopify Developer at HTML to Liquid Converter

Dhruv Goyani

3 years web design + 3 years Shopify development experience

LinkedIn profile →
Nishad Kikani, Lead Shopify Developer at HTML to Liquid Converter

Nishad Kikani

2 years web design + 6 years Shopify development experience

LinkedIn profile →

Content is reviewed by the HTML to Liquid Converter Shopify development team before publication. Technical accuracy is validated against current Shopify Online Store 2.0 conventions and active client theme work.

Last updated:

Questions or corrections? Contact us.