For循环,在div中包含每两个帖子

时间:2014-01-04 17:50:00

标签: jekyll liquid

基本上,我使用的是Jekyll(使用Liquid模板语言),我正在尝试编写for循环,其中包含div中的每两项

这是我目前的循环:

<div>
  {% for post in site.posts %}
    <a href="{{ post.url }}">{{ post.title }}</a>
  {% endfor %}
</div>

哪个会输出四个帖子,如下:

<div>
  <a href="#">Title</a>
  <a href="#">Title</a>
  <a href="#">Title</a>
  <a href="#">Title</a>
</div>

我想要的四个帖子的输出是:

<div>
  <a href="#">Title</a>
  <a href="#">Title</a>
</div>

<div>
  <a href="#">Title</a>
  <a href="#">Title</a>
</div>

我该如何做到这一点?

9 个答案:

答案 0 :(得分:33)

如果<div>和帖子的数量是固定的(根据您选择的答案似乎就是这种情况),那么获得相同输出的方法更短 - 使用limitoffset
(Liquid的分页方法)

<div>
  {% for post in site.posts limit: 2 %}
    <a href="{{ post.url }}">{{ post.title }}</a>
  {% endfor %}
</div>
<div>
  {% for post in site.posts limit: 2 offset: 2 %}
    <a href="{{ post.url }}">{{ post.title }}</a>
  {% endfor %}
</div>

更好的解决方案:

如果帖子数量未修复(因此,如果您有100个帖子,则需要50个<div>,每个帖子有两个帖子),那么您可以使用forloop.index (已在大多数其他答案中提及),并使用modulo查明当前索引是偶数还是奇数:

{% for post in site.posts %}
  {% assign loopindex = forloop.index | modulo: 2 %}
  {% if loopindex == 1 %}
    <div>
      <a href="{{ post.url }}">{{ post.title }}</a>
  {% else %}
      <a href="{{ post.url }}">{{ post.title }}</a>
    </div>
  {% endif %}
{% endfor %}

这也会返回您想要的输出,但适用于任意数量的帖子。

答案 1 :(得分:12)

我知道我已经迟到了比赛,但我发现我觉得这是一个相当优雅的解决方案,并不会让人感觉不舒服。

使用for循环limitoffset参数,我们可以一次迭代一行,每行N个帖子。

首先,我们计算我们需要枚举的行数:

{% assign rows = site.posts.size | divided_by: 2.0 | ceil %}

Ruby等价物将是rows = (posts.size / 2.0).ceil(奇数会得到他们自己的行)。

接下来,我们将遍历行:

{% for i in (1..rows) %}
  <div>

现在我们需要使用(i - 1) * 2计算集合偏移量(使用forloop.index0):

  {% assign offset = forloop.index0 | times: 2 %}

然后我们可以迭代从行的偏移开始的帖子片段(相当于Ruby中的posts[offset, 2]):

    {% for post in site.posts limit:2 offset:offset %}
      <a href="{{ post.url }}">{{ post.title }}</a>
    {% endfor %}

关闭行div元素并进行循环:

  </div>
{% endfor %}

那就是它!

在Ruby中,这将是:

rows = (posts.size / 2.0).ceil # the number of rows
(1..rows).each do |i|
  offset = (i - 1) * 2
  # <div>
  posts[offset, 2].each do |post|
    # <a href="#{post.url}>#{post.title}</a>
  end
  # </div>
end

现在一起,在Liquid:

{% assign rows = site.posts.size | divided_by: 2.0 | ceil %}
{% for i in (1..rows) %}
  {% assign offset = forloop.index0 | times: 2 %}
  <div>
    {% for post in site.posts limit:2 offset:offset %}
      <a href="{{ post.url }}">{{ post.title }}</a>
    {% endfor %}
  </div>
{% endfor %}

希望这有助于某人!

答案 2 :(得分:6)

试试这个:

<div>
    {% for post in paginator.posts %}
        <div>
            {% if forloop.index == 1 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
            {% if forloop.index == 2 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
        </div>
        <div>
            {% if forloop.index == 3 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
            {% if forloop.index == 4 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
        </div>
    {% endfor %}
</div>

答案 3 :(得分:6)

我刚刚遇到过这个(https://gist.github.com/leemachin/2366832),这是一个比其他答案更好的解决方案,请记住,你需要这个插件(https://gist.github.com/leemachin/2366832#file-modulo-filter-rb)才能工作:

{% for post in paginator.posts %}

  {% capture modulo %}{{ forloop.index0 | mod:2 }}{% endcapture %}

  {% if modulo == '0' or forloop.first %}
    <div>
  {% endif %}

    <a href="{{ post.url }}">{{ post.title }}</a>

  {% if modulo == '1' or forloop.last %}
    </div>
  {% endif %}

{% endfor %}

答案 4 :(得分:1)

我真的应该专注于我正在做的事情,但是一岁的孩子给我所有的玩具很难......:D

现在代码应该可以工作:

<div>
    <div>
        {% for post in paginator.posts %}
            {% if forloop.index == 1 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
            {% if forloop.index == 2 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
        {% endfor %}
    </div>
    <div>
        {% for post in paginator.posts %}
            {% if forloop.index == 3 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
            {% if forloop.index == 4 %}
                <a href="">{{ post.title }}</a>
            {% endif %}
        {% endfor %}
    </div>
</div>

应该给出html:

<div>
    <div>
        <a href="">Title 1</a>
        <a href="">Title 2</a>
    </div>
    <div>
        <a href="">Title 3</a>
        <a href="">Title 4</a>
    </div>
</div>

答案 5 :(得分:0)

好的,我已经做了一个没有适当样式的快速尝试,但这应该有效:

<div>
{% for post in paginator.posts %}
    {% case forloop.index %}
    <div>
    {% when 1 %}
        <a href="">{{ post.title }}</a>
    {% when 2 %}
        <a href="">{{ post.title }}</a>
    </div>
    <div>
    {% when 3 %}
        <a href="">{{ post.title }}</a>
    {% when 4 %}
        <a href="">{{ post.title }}</a>
    </div>
{% endcase %}
{% endfor %}
</div>

答案 6 :(得分:0)

在@ smilinmonki666的帮助下,我的工作方式也是我想要的,这是我最后的代码:

{% assign current_page_posts = paginator.posts | size %}

{% if current_page_posts > 0 %}
  <div>

    <div>
      {% for post in paginator.posts %}
        {% if forloop.index == 1 %}
          <a href="{{ post.url }}">{{ post.title }}</a>
        {% endif %}

        {% if forloop.index == 2 %}
          <a href="{{ post.url }}">{{ post.title }}</a>
        {% endif %}
      {% endfor %}
    </div>

    {% if current_page_posts > 2 %}
      <div>
        {% for post in paginator.posts %}
          {% if forloop.index == 3 %}
            <a href="{{ post.url }}">{{ post.title }}</a>
          {% endif %}

          {% if forloop.index == 4 %}
            <a href="{{ post.url }}">{{ post.title }}</a>
          {% endif %}
        {% endfor %}
      </div>
    {% endif %}

  </div>
{% endif %}

答案 7 :(得分:0)

在查看Christian的解决方案后,我将我的(基于哈巴狗的)代码更新为:

.blog
    .container
        .row
            .col-xs-0
            .col-xs-12
                h1 Blog
                p Summit blog with latest news, thinking and participant's posts.
            .col-xs-0
        | {% for page in site.posts                         %}
        | {% assign loopindex = forloop.index | modulo: 2   %}
        | {% if loopindex == 1                              %}
        .row
        | {% endif %}
        span
            .col-xs-6.col-sm-6
                .card
                    .card-top
                        + add-title
                        + add-author
                    .card-block
                        + add-snippet
        | {% endfor                                        %}

答案 8 :(得分:0)

您可以使用https://shopify.github.io/liquid/tags/iteration/

中所述的cycle标记执行此操作
{% for post in site.posts %}
  {% cycle '<div>', '' %}
    <a href="{{ post.url }}">{{ post.title }}</a>
  {% cycle '', '</div>' %}
{% endfor %}

输出

<div>
  <a href="#">Title</a>
  <a href="#">Title</a>
</div>

<div>
  <a href="#">Title</a>
  <a href="#">Title</a>
</div>