Liquid模板:在for循环中处理偶数/奇数项

51

如果我在Liquid(使用Jekyll)中有一个for循环,如何仅针对偶数(或奇数)项进行操作?我已经尝试过:

{% for item in site.posts %}
    {% if forloop.index % 2 == 1 %}

但似乎不起作用。我还尝试过:

(forloop.index % 2) == 1

并且:

forloop.index - (forloop.index / 2 * 2) == 1
2个回答

90

我认为你需要使用 cycle 标签来实现此功能。例如:

{% for post in site.categories.articles %}
   <article class="{% cycle 'odd', 'even' %}"></article>
{% endfor %}

如果您希望每个周期使用不同的HTML标记:

{% for item in site.posts %}
  {% capture thecycle %}{% cycle 'odd', 'even' %}{% endcapture %}
  {% if thecycle == 'odd' %}
    <div>echo something</div>
  {% endif %}
{% endfor %}
您可以在Liquid for Designers上找到更多的信息,但那里的示例并不是特别有帮助。 这个Shopify支持主题也应该会有所帮助。

2
这不完全是我想要的,但你找到的链接给了我真正的答案。我编辑了你的回答并加入了我的解决方案。谢谢! - Adam Kiss
此外,如果我只想使用CSS,您的解决方案是可行的,但我想将site.posts分成两列,所以仅切换类对我来说不够。 - Adam Kiss
是的,我不确定你是否想要使用CSS。不过很高兴能帮忙! - Alex Lande
你的例子很好,不过我需要在其中一个循环中添加偏移量才能让它对我起作用。 - jnthnclrk
我得到了答案,但是为什么取模版本不起作用呢? - Augustin Riedinger
有时候你需要明确地提及集合(在这种情况下是 site.posts):{% cycle site.posts: 'odd', 'even' %},如果你在多个页面上重复使用这段代码的话,比如说。 - Felix Zumstein

38
Shopify支持主题帖Ales Lande的回答所说的相反,Liquid 中确实有一个 modulo 函数 - 即modulo 过滤器

使用这个过滤器,你可以这样做:

{% for item in site.posts %}
    {% assign mod = forloop.index | modulo: 2 %}
    {% if mod == 0 %}
        <!-- even -->
    {% else %}
        <!-- odd -->
    {% endif %}
{% endfor %}

5
我喜欢这个解决方案比使用“循环”更好;用字符串解决数学问题似乎很奇怪! - Rick Davies
1
如果您在循环中有条件地跳过任何内容,例如遍历site.collections但尝试排除“posts”(标准集合),则此解决方案将无法正常工作。 - Erwin Lengkeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接