使用 linebottom 属性 (最简单)
这是最直接、最简单的方法,适用于只需要在列表的最后一个项目添加特殊样式(比如去掉最后一个元素的分割线或边框)的场景。

(图片来源网络,侵删)
标签说明
{dede:arclist} 标签有一个 linebottom 属性,它的作用是在循环的最后一项输出指定的内容。
语法
{dede:arclist titlelen='30' row='10' linebottom='</li><li>'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
工作原理:
linebottom='</li><li>'的意思是:在循环输出所有条目之后,再额外输出一次</li><li>。- 这会导致最终的 HTML 结构中,在最后一个
</li>后面又多了一个<li>。 - 我们可以利用这个多余的
<li>来判断循环是否结束,或者通过 CSS 的last-child选择器来巧妙地处理样式。
实际应用示例:去掉最后一个列表项的边框
假设你的列表项都有右边框,但希望最后一个没有。
HTML 模板:

(图片来源网络,侵删)
<ul class="news-list">
{dede:arclist titlelen='30' row='10' linebottom='</li><li>'}
<li>
<a href="[field:arcurl/]">[field:title/]</a>
</li>
{/dede:arclist}
</ul>
CSS 样式:
.news-list li {
border-right: 1px solid #ccc;
/* 其他样式... */
}
/* 利用 :last-child 选择器,隐藏最后一个元素的右边框 */
.news-list li:last-child {
border-right: none;
}
注意: 这种方法会生成一个多余的 <li> 标签,虽然 CSS 可以处理,但从代码结构上讲不够完美,它最适合的场景是当你需要在循环结束后添加一个额外的、独立的元素时。
使用 PHP 代码 (最灵活、最推荐)
当你需要在循环内部根据当前是第几次循环来执行不同操作时(每3个元素为一行,或者为奇数/偶数项添加不同样式),使用 PHP 代码是最佳选择。
核心思路
在 DedeCMS 的模板中,你可以使用 PHP 代码块,我们可以在循环开始前初始化一个计数器变量 i,然后在每次循环时让 i 自增,最后通过判断 i 的值来执行不同的逻辑。

(图片来源网络,侵删)
实际应用示例:实现“每3个列表项为一行”
这是一个非常常见的需求,比如制作图片墙或商品列表。
HTML 模板:
<div class="row-container">
{dede:arclist titlelen='30' row='9'}
<!-- PHP 代码块开始 -->
[field:global name=autoindex runphp="yes"]
$i = @me;
if($i % 3 == 1) {
@me = "<div class='row'>";
} else {
@me = "";
}
[/field:global]
<div class="col-md-4">
<a href="[field:arcurl/]">[field:title/]</a>
</div>
<!-- PHP 代码块结束 -->
[field:global name=autoindex runphp="yes"]
$i = @me;
if($i % 3 == 0 || $i == 9) { // 9是总行数,也可以用[field:global name=itemindex/]来判断是否是最后一个
@me = "</div>";
} else {
@me = "";
}
[/field:global]
{/dede:arclist}
</div>
代码解析:
-
[field:global name=autoindex runphp="yes"]:autoindex是{dede:arclist}标签自带的一个全局变量,代表当前循环的序号(从1开始)。runphp="yes"允许我们对这个变量执行 PHP 代码。@me在runphp中代表当前标签的值,也就是autoindex的值。
-
开头的判断 (
if($i % 3 == 1)):$i % 3是取模运算,计算i除以3的余数。- 当余数为1时(即第1、4、7...个元素),我们就输出一个
<div class='row'>开始一个新行。
-
结尾的判断 (
if($i % 3 == 0 || $i == 9)):- 当余数为0时(即第3、6、9...个元素),我们就输出
</div>结束当前行。 || $i == 9是为了处理最后一行可能不足3个元素的情况,确保在列表结束时关闭最后一个<div class='row'>。
- 当余数为0时(即第3、6、9...个元素),我们就输出
CSS 样式:
.row-container {
/* 清除浮动 */
overflow: hidden;
}
.row {
/* 清除浮动 */
clear: both;
/* 可以添加行间距 */
margin-bottom: 20px;
}
.col-md-4 {
float: left;
width: 33.33333333%;
/* 其他样式... */
}
总结与对比
| 特性 | 方法一 (linebottom) |
方法二 (PHP autoindex) |
|---|---|---|
| 实现方式 | 使用标签自带属性 | 在模板中嵌入 PHP 代码 |
| 灵活性 | 低,只能判断循环的“最后一项”。 | 非常高,可以获取任意循环次数,进行各种逻辑判断。 |
| 适用场景 | 只需为最后一个元素添加特殊样式(如去掉边框)。 | 需要根据循环次数进行复杂布局,如每N个一行、奇偶项样式不同等。 |
| 代码整洁度 | 可能会生成多余的HTML标签。 | 代码结构清晰,生成的HTML也符合预期。 |
| 推荐度 | 简单场景可用。 | 强烈推荐,功能强大且是标准做法。 |
- 如果只是处理最后一个元素,用
linebottom最快。 - 如果需要获取循环中的任意一个位置(第1个、第2个、第3个...),或者进行复杂的布局控制,请务必使用 PHP
autoindex的方法,这是最专业、最灵活的解决方案。
