【问题标题】:How can I iterate on a Jekyll /Liquid collection items by batch of 3?如何按 3 个批次迭代 Jekyll /Liquid 集合项目?
【发布时间】:2017-03-29 15:39:32
【问题描述】:

我有一个基本的 HTML 结构,每行显示 3 个项目。为了正确分开它们,我使用 2 个边框(第一/第二第二/第三),如下图所示:

ITEM1 | ITEM2 | ITEM3

使用 SASS 定义如下:

         .middle {
                position: relative;
                z-index: 1;

                &:before {
                    content: '';
                    width: 32px;
                    height: 100%;
                    position: absolute;
                    left: -24px;
                    top: 0;
                    display: block;
                    z-index: -1;
                    box-shadow: 32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, 32px 32px 0 0 #fff, 32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15);
                }

                &:after {
                    content: '';
                    width: 32px;
                    height: 100%;
                    position: absolute;
                    right: -24px;
                    top: 0;
                    display: block;
                    z-index: -1;
                    box-shadow: -32px 0 0 0 #fff, 0 -32px 0 0 #fff, 0 32px 0 0 #fff, -32px 32px 0 0 #fff, -32px -32px 0 0 #fff, 0 0 32px 0 rgba(0, 0, 0, 0.15);
                }
            }

当我迭代 Jekyll 集合时,我想区分这 3 行项目。换句话说,迭代项目 3 by 3。 它 几个小时前我刚开始研究 Jekyll,我可以看到 filters are available,但我不知道如何在标准集合迭代中实现这一点,如下所示:

{% for item in array %}
    {{ item }}
{% endfor %}

https://gist.github.com/smutnyleszek/9803727

【问题讨论】:

  • 似乎您可以使用 CSS3 :nth-child 选择器来实现这一点,它允许您根据源顺序选择一个或多个元素。这样您就不需要向“中间”项目添加类。
  • 谢谢@ShannonYoung。我将依靠 Liquid 使其更轻量级,但我肯定会在其他项目或情况中使用该技巧。

标签: jekyll liquid


【解决方案1】:

为了能够在迭代时将项目分组,我们使用modulo 过滤器:

将输出除以一个数字并返回余数。

然后我们可以通过forloop.index | modulo: 3 识别每个迭代,更具体地说,我们正在处理三个项目中的哪一个:

如果余数为 1,则为该行中的第一项,如果为 2,则为第二项,如果为 0,则为第三项。例如遍历数组site.posts

{% for post in site.posts %}
{% assign mod = forloop.index | modulo: 3 %}
{{ mod }}:{{post.title}}
{% if mod == 1 %}
<div>first item</div>
{% elsif mod == 2 %}
<div class="middle">second item</div>
{% else %}
<div>third item</div>
<hr>
{% endif %}
<br>
{% endfor %}

请注意,根据您的代码,我已将 middle css 类应用于第二项。

这将输出:

 1:First post title
first item

2:Second post title
second item

0:Third post title
third item

-----------------

1:Fourth post title
first item

【讨论】:

  • 我正要尝试模数。好的。您认为最好按照问题评论中的建议使用 css 来处理这个问题,还是我应该坚持使用过滤器?我假设是后者,因为它是经过预处理的,所以对于客户端浏览器来说应该更容易。
  • 既然你似乎对 Liquid 有自己的看法,如果你不介意的话,我想问问你的意见。这是一项相当古老的技术。您认为现在学习和使用它仍然是一个不错的选择,还是有一个更新/优雅的静态网站替代方案?
  • 我更喜欢使用过滤器,它给了我更多的灵活性,但两种选择都有效。
  • Learning Liquid 是一个不错的选择,因为它是 Jekyll 中默认的模板系统,您还可以了解 Jinja 和 Twig 等其他流行的模板系统,因为它们非常相似。
  • 感谢分享:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多