Where you can achieve what your competitors can’t


Product Description Accordion in Shopify

This custom code is completely free to use, but please note it does not include 1-on-1 technical support. If you need a bespoke, done-for-you solution to customize your Shopify store, my team is here to help! Head to my channel homepage and use the link in the trailer to reach out.

{% assign target_metafield = "custom.accordion_content" %}

{%- liquid
  assign namespace = target_metafield | split: '.' | first
  assign key = target_metafield | split: '.' | last
  assign accordion_html = product.metafields[namespace][key] | metafield_tag | remove: '<div class="metafield-rich_text_field">' | remove: '</div>'
-%}

{% if accordion_html != blank %}
  <div class="onhow-studio-accordion-wrapper">
    
    {% assign chunks = accordion_html | split: '<h3>' %}
    
    {% for chunk in chunks %}
      {% assign stripped_chunk = chunk | strip %}
      
      {% if stripped_chunk != blank %}
        {% if chunk contains '</h3>' %}
          {% assign parts = chunk | split: '</h3>' %}
          {% assign title = parts[0] | strip_html | strip %}
          {% assign body = parts[1] | strip %}
          
          {% if title != blank %}
            <details class="onhow-studio-accordion-item">
              <summary class="onhow-studio-accordion-summary">
                <span class="onhow-studio-accordion-title">{{ title }}</span>
                <span class="onhow-studio-accordion-icon">
                  <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
                    <polyline points="6 9 12 15 18 9"></polyline>
                  </svg>
                </span>
              </summary>
              <div class="onhow-studio-accordion-body">
                {{ body }}
              </div>
            </details>
          {% endif %}
          
        {% else %}
          <div class="onhow-studio-accordion-intro">
            {{ chunk }}
          </div>
        {% endif %}
      {% endif %}
    {% endfor %}
    
  </div>

  <style>
    .onhow-studio-accordion-wrapper {
      display: flex;
      flex-direction: column;
      width: 100%;
      margin: 1.5rem 0;
      color: inherit;
    }

    .onhow-studio-accordion-intro {
      margin-bottom: 1rem;
      font-size: 0.95em;
      opacity: 0.9;
    }

    .onhow-studio-accordion-item {
      border-bottom: 1px solid rgba(128, 128, 128, 0.2);
    }
    
    .onhow-studio-accordion-item:first-of-type {
      border-top: 1px solid rgba(128, 128, 128, 0.2);
    }

    .onhow-studio-accordion-summary {
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 1.25rem 0;
      cursor: pointer;
      list-style: none;
      font-weight: 500;
      color: inherit;
    }

    .onhow-studio-accordion-summary::-webkit-details-marker {
      display: none;
    }

    .onhow-studio-accordion-title {
      flex: 1;
      padding-right: 1rem;
      font-size: 17px;
      line-height: 1;
    }

    .onhow-studio-accordion-icon {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 20px;
      height: 20px;
      transition: transform 0.7s ease;
      flex-shrink: 0;
    }

    .onhow-studio-accordion-icon svg {
      width: 100%;
      height: 100%;
    }

    .onhow-studio-accordion-item[open] .onhow-studio-accordion-icon {
      transform: rotate(180deg);
    }

    .onhow-studio-accordion-body {
      padding-bottom: 1.25rem;
      color: inherit;
      opacity: 0.85;
      font-size: 0.95em;
      line-height: 1.6;
    }

    .onhow-studio-accordion-body p:first-child {
      margin-top: 0;
    }
    .onhow-studio-accordion-body p:last-child {
      margin-bottom: 0;
    }

    .onhow-studio-accordion-item[open] .onhow-studio-accordion-body {
      animation: onhowFadeIn 0.6s ease-in-out;
    }

    @keyframes onhowFadeIn {
      0% { opacity: 0; transform: translateY(-5px); }
      100% { opacity: 0.85; transform: translateY(0); }
    }
  </style>
{% endif %}