← Go back

Shopify FAQ Section with Image & Expandable Table – Interactive & Responsive

Add an interactive FAQ section with an expandable table and an image to your Shopify store. Fully responsive and customizable for better user engagement.

Preview Password = 1 *When you first time enter them back again then click agian Preview to show*
Liquid Code
                    <!-- 
Custom Shopify FAQ Section with Image & Expandable Table
===================================
Tech Stack: 
- HTML, CSS (grid layout & animations)
- JavaScript (FAQ expand/collapse)
- Shopify's Liquid templating language

Features:
- Interactive FAQ section with expandable answers
- Responsive two-column grid layout with a large image
- Clickable table rows with smooth expand/collapse animations
- Customizable colors, padding, and layout

Promotion: 
For more prebuilt Shopify templates, visit: https://prebuilttemplates.com/
===================================
-->
<style>
.section-{{ section.id }} {
  display: grid;
  grid-template-columns: 1fr 2fr;
  gap: 20px;

  color: #000;
  font-size: 21px;
}

  .faq-container{
      padding-top: {{ section.settings.padding_top }}px;
  padding-bottom: {{ section.settings.padding_bottom }}px;
  }

.section-{{ section.id }} .image-block img {
  width: 100%;
  height: auto;
  object-fit: cover;
}

.section-{{ section.id }} .text-title {
  font-size: 24px;
  font-weight: bold;
  margin-top: 20px;
  text-align: center;
}

.section-{{ section.id }} .table-title-cont {
  display: flex;
  flex-direction: column;
  padding-left: 180px;
  justify-content: space-between;
}

.table-row {
  text-transform: uppercase;
  color: #000;
font-family: Vercetti;
  font-size: 18px;
  cursor: pointer;
  position: relative;
  transition: background-color 0.3s ease;
}

.section-{{ section.id }} .table-header {
  display: grid;
  grid-template-columns: 2fr 1fr 1fr;
  font-weight: bold;
  border-bottom: 1px solid #000;
  padding-bottom: 10px;
  margin-bottom: 10px;
}

.section-{{ section.id }} .table-row {
  display: grid;
  grid-template-columns: 2fr 1fr 1fr;
  padding: 5px 0;
  border-bottom: 1px solid #000;
}

.section-{{ section.id }} .table-row:last-child {
  border-bottom: none;
}

.section-{{ section.id }} .faq-answer {
  display: none;
  grid-column: span 3;
  font-size: 16px;
  color: #555;
  padding: 10px 0;
  overflow: hidden;
  height: 0;
  transition: height 0.3s ease, padding 0.3s ease;
}

.section-{{ section.id }} .faq-answer.open {
  display: block;
  height: auto;
  padding: 10px 0;
}
.section-title {
    border-bottom: 1px solid;
    margin-bottom: 20px;
}
.table-title-cont .text-title {
  font-size: 11rem;
  color: #000;
  text-transform: uppercase;
  letter-spacing: 0;
  text-align: left;
  line-height: 1;
  font-style: italic;
  max-width: 869px;
}

.text-title-wrap {
  display: flex;
  justify-content: end;
}

/* Responsive Design */
@media screen and (max-width: 768px) {
  .section-{{ section.id }} {
    grid-template-columns: 1fr;
  }
}
</style>
<div class="faq-container right-left-p">
  <div class="section-title"><h1>FAQ.</h1></div>
<div class="section-{{ section.id }} ">
  
  <!-- Left Column: Image -->
  <div class="image-block">
    <img src="{{ section.settings.image | img_url: 'master' }}" alt="Section Image">
  </div>

  <!-- Right Column: Title and Dynamic Table -->
  <div class="table-title-cont">
    <div class="table-block">
      <!-- Table -->
      <div class="table-header">
        <div>(Project)</div>
        <div>(Place)</div>
        <div>(Year)</div>
      </div>
      {% for block in section.blocks %}
        <div class="table-row" onclick="toggleFaq(this)">
          <div>{{ block.settings.project }}</div>
          <div>{{ block.settings.place }}</div>
          <div>{{ block.settings.year }}</div>
        </div>
        {% if block.settings.faq_answer != blank %}
          <div class="faq-answer">
            {{ block.settings.faq_answer }}
          </div>
        {% endif %}
      {% endfor %}
    </div>

    <!-- Section Title -->
    <div class="text-title-wrap">
      <div class="text-title">{{ section.settings.title }}</div>
    </div>
  </div>
</div>
</div>
<script>
  function toggleFaq(row) {
    const allAnswers = document.querySelectorAll('.faq-answer');
    const nextElement = row.nextElementSibling;

    // Close all open FAQs
    allAnswers.forEach((answer) => {
      if (answer !== nextElement) {
        answer.style.padding = '0';
        setTimeout(() => {
          answer.classList.remove('open');
        }, 300);
      }
    });

    // Toggle the clicked FAQ
    if (nextElement && nextElement.classList.contains('faq-answer')) {
      if (!nextElement.classList.contains('open')) {
        nextElement.style.padding = '10px 0';
        nextElement.classList.add('open');
      } else {
        nextElement.style.padding = '0';
        setTimeout(() => {
          nextElement.classList.remove('open');
        }, 300);
      }
    }
  }
</script>

{% schema %}
{
  "name": "Image and FAQ ",
  "settings": [
    {
      "type": "image_picker",
      "id": "image",
      "label": "Left Image"
    },
    {
      "type": "text",
      "id": "title",
      "label": "Section Title",
      "default": "What People Say About Us?"
    },
    {
      "type": "range",
      "id": "padding_top",
      "label": "Padding Top",
      "min": 0,
      "max": 100,
      "step": 5,
      "default": 20
    },
    {
      "type": "range",
      "id": "padding_bottom",
      "label": "Padding Bottom",
      "min": 0,
      "max": 100,
      "step": 5,
      "default": 20
    }
  ],
  "blocks": [
    {
      "type": "table_row",
      "name": "Table Row",
      "settings": [
        {
          "type": "text",
          "id": "project",
          "label": "Project",
          "default": "TD 213 - Modern Harmony"
        },
        {
          "type": "text",
          "id": "place",
          "label": "Place",
          "default": "Kyiv"
        },
        {
          "type": "text",
          "id": "year",
          "label": "Year",
          "default": "2024"
        },
        {
          "type": "richtext",
          "id": "faq_answer",
          "label": "FAQ Answer"
    
        }
      ]
    }
  ],
  "presets": [
    {
      "name": "Image and FAQ Table Section",
      "blocks": [
        {
          "type": "table_row"
        },
        {
          "type": "table_row"
        },
        {
          "type": "table_row"
        }
      ]
    }
  ]
}
{% endschema %}