You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shopify中实现2列+3列循环的动态网格布局?

解决方案

一、纯CSS Grid 实现(推荐,无需复杂逻辑)

利用CSS Grid的列规则结合循环模式,直接实现2列→3列的重复布局,完全不需要在Liquid里做分组处理,最符合代码规范。

.logo-grid {
  display: grid;
  gap: 1rem;
  /* 按2列→3列的规则循环排列,自动适配任意数量的区块 */
  grid-template-columns: 
    repeat(2, 1fr) 
    repeat(3, 1fr) 
    repeat(2, 1fr) 
    repeat(3, 1fr);
}

/* 移动端可统一调整为2列 */
@media (max-width: 768px) {
  .logo-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

Liquid部分只需直接遍历区块输出:

<div class="logo-grid">
  {% for block in section.blocks %}
    <div class="logo-block">
      {{ block.settings.logo_text }}
      <!-- 区块其他内容 -->
    </div>
  {% endfor %}
</div>

原理:CSS Grid会按照grid-template-columns定义的规则循环排列元素,前2个区块用2列布局,接下来3个用3列,后续自动重复该模式,完全适配区块的添加或删除。

二、Liquid 逻辑优化(无零散开闭div)

如果必须通过Liquid分组,避免在循环里零散判断开闭div,先把区块按2+3的规则提前分组,再遍历分组输出:

{% assign blocks = section.blocks %}
{% assign groups = '' | split: '' %}
{% assign current_group = '' | split: '' %}
{% assign cycle_counter = 0 %}

{% for block in blocks %}
  {% assign cycle_counter = cycle_counter | plus: 1 %}
  {% assign current_group = current_group | push: block %}
  
  <!-- 满2个或累计满5个(2+3)时,完成当前分组 -->
  {% if cycle_counter == 2 or cycle_counter == 5 %}
    {% assign groups = groups | push: current_group %}
    {% assign current_group = '' | split: '' %}
    {% assign cycle_counter = 0 %}
  {% endif %}
{% endfor %}

<!-- 处理剩余未分组的区块 -->
{% if current_group.size > 0 %}
  {% assign groups = groups | push: current_group %}
{% endif %}

<!-- 遍历分组输出容器和区块 -->
{% for group in groups %}
  <div class="logo-group grid-{{ group.size }}">
    {% for block in group %}
      <div class="logo-block">{{ block.settings.logo_text }}</div>
    {% endfor %}
  </div>
{% endfor %}

对应CSS:

.grid-2 {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1rem;
}

.grid-3 {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 1rem;
}

优势:所有分组逻辑在循环外完成,代码结构清晰,没有零散的div开闭操作,符合团队评审要求。

三、JavaScript 辅助分组(动态适配)

如果需要后续灵活调整列数规则,可通过JS处理DOM分组,Liquid代码保持极简:

Liquid部分直接输出所有区块:

<div class="logo-container">
  {% for block in section.blocks %}
    <div class="logo-block">{{ block.settings.logo_text }}</div>
  {% endfor %}
</div>

JS代码:

const container = document.querySelector('.logo-container');
const blocks = Array.from(container.children);
const columnPattern = [2, 3]; // 定义2列→3列的循环模式
let patternIndex = 0;
let currentGroup = [];

blocks.forEach(block => {
  currentGroup.push(block);
  const currentColumnCount = columnPattern[patternIndex];
  
  if (currentGroup.length === currentColumnCount) {
    // 创建分组容器并插入DOM
    const group = document.createElement('div');
    group.classList.add('logo-group', `grid-${currentColumnCount}`);
    currentGroup.forEach(el => group.appendChild(el));
    container.appendChild(group);
    
    // 重置临时分组,切换到下一个列数模式
    currentGroup = [];
    patternIndex = (patternIndex + 1) % columnPattern.length;
  }
});

// 处理剩余未分组的区块
if (currentGroup.length > 0) {
  const group = document.createElement('div');
  group.classList.add('logo-group', `grid-${currentGroup.length}`);
  currentGroup.forEach(el => group.appendChild(el));
  container.appendChild(group);
}

CSS与第二种方法一致,这种方式把分组逻辑完全交给JS,Liquid代码最简洁,适合复杂的动态布局需求。


内容的提问来源于stack exchange,提问作者Trando Alconter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 20:18:23