基本上,我使用的是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>
我该如何做到这一点?
答案 0 :(得分:33)
如果<div>
和帖子的数量是固定的(根据您选择的答案似乎就是这种情况),那么获得相同输出的方法更短 - 使用limit
和offset
:
(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
循环limit
和offset
参数,我们可以一次迭代一行,每行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>