dede文章列表5行

99ANYc3cd6
预计阅读时长 20 分钟
位置: 首页 DEDE建站 正文
  1. 使用 CSS Flexbox 布局(推荐,最灵活)
  2. 使用 Dede 的 loop 标签和 arclist 标签组合(传统方法)

我会为您详细解释这两种方法,并提供完整的代码示例。


使用 CSS Flexbox 布局(强烈推荐)

这是目前最现代、最灵活、最推荐的方法,它只需要修改 CSS 样式,不需要修改 PHP 模板文件,对系统侵入性最小,也最容易维护。

原理: 你不需要关心列表里有多少条数据,只需要用 CSS 告诉浏览器:“这个列表容器里的每个子项(每篇文章)都排成一行,如果空间不够就自动换行,并且让每行都正好能放下5个。”

操作步骤:

第一步:修改你的列表页模板文件

打开你的列表页模板文件,通常位于 /templets/default/ 目录下,list_article.htm

找到文章列表的循环代码,它看起来通常是这样的:

{dede:list pagesize='20'}
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
    </li>
{/dede:list}

确保你的列表项(<li>)被一个父容器包裹起来,如果上面代码中没有,你需要手动添加一个 <ul><div> 包裹起来。

修改后的结构如下:

<!-- 添加一个 class 为 article-list-wrapper 的容器 -->
<div class="article-list-wrapper">
    {dede:list pagesize='20'}
        <li>
            <a href="[field:arcurl/]">[field:title/]</a>
            <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
        </li>
    {/dede:list}
</div>

第二步:添加 CSS 样式

在你的模板文件中找到 <head> 标签内的 <style> 部分,或者在后台的“核心” -> “全局变量设置” -> “网站head.htm”中引入你的CSS文件,然后添加以下 CSS 代码:

/* 设置列表容器的样式,使用 Flexbox 布局 */
.article-list-wrapper {
    display: flex;          /* 启用 Flexbox 布局 */
    flex-wrap: wrap;        /* 允许项目换行 */
    list-style: none;       /* 去掉列表前的点 */
    padding: 0;             /* 去掉内边距 */
    margin: 0;              /* 去掉外边距 */
    gap: 15px;              /* (可选) 设置列表项之间的间距 */
}
/* 设置每个列表项的样式 */
.article-list-wrapper li {
    /* 关键:设置每个 li 占据父容器宽度的 20%,这样一行正好能放 5 个 (100% / 5 = 20%) */
    flex: 0 0 20%; 
    /* (可选) 如果需要固定宽度,可以设置一个固定值,*/
    /* width: 19%; */ /* 考虑到 gap 的影响,宽度可以稍微小一点 */
    /* (可选) 让每个列表项看起来像一个卡片 */
    box-sizing: border-box; /* 让 padding 和 width 的计算更直观 */
    padding: 10px;
    border: 1px solid #eee;
    border-radius: 5px;
}
/* (可选) 响应式调整:在小屏幕上,每行显示2个 */
@media (max-width: 768px) {
    .article-list-wrapper li {
        flex: 0 0 50%; /* 一行显示2个 */
    }
}
/* (可选) 响应式调整:在更小的屏幕上,每行显示1个 */
@media (max-width: 480px) {
    .article-list-wrapper li {
        flex: 0 0 100%; /* 一行显示1个 */
    }
}

优点:

  • 代码简洁:HTML 模板几乎不需要改动。
  • 维护方便:只需修改 CSS 就能调整每行显示数量(比如改成4个,把 20% 改成 25% 即可)。
  • 响应式友好:可以轻松通过媒体查询(@media)实现不同屏幕尺寸下每行显示不同数量的文章。
  • 性能好:纯前端实现,对服务器没有额外负担。

使用 Dede 的 loop 标签(传统方法)

这种方法通过 PHP 在后端进行循环控制,生成固定列数的 HTML 结构,它适用于不熟悉 CSS 或需要特定复杂布局的场景。

原理: 先获取文章列表数据,然后用一个外层循环控制“行”,内层循环控制“列”,外层循环一次,就生成一行包含5个 <li> 的结构。

操作步骤:

第一步:修改你的列表页模板文件

打开你的列表页模板文件(如 list_article.htm),将原来的 {dede:list} 标签全部替换为以下代码:

{dede:sql sql="SELECT * FROM `dede_archives` AS a JOIN `dede_arctype` AS t ON a.typeid = t.id WHERE a.channel=1 AND a.arcrank=0 ORDER BY a.id DESC LIMIT 0,20"}
    [field:id/]
{/dede:sql}
<!-- 将上面的测试标签替换为下面的正式代码 -->
<!-- 外层循环,计算需要多少行 -->
{dede:loop table='dede_archives' sort='id' row='20' if='channel=1 and arcrank=0'}
    [field:global name=autoindex runphp="yes"]
        // 如果是第1个,或者能被5整除(即第6、11、16...个),则开始新的一行
        if (@me % 5 == 1 || @me == 1) {
            @me = "<ul class='row-list'>";
        } else {
            @me = "";
        }
    [/field:global]
    <li>
        <a href="[field:arcurl/]">[field:title/]</a>
        <span>[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
    </li>
    <!-- 如果是第5个,或者能被5整除(即第5、10、15...个),并且是最后一个,则结束这一行 -->
    [field:global name=autoindex runphp="yes"]
        // 如果是最后一个,并且当前计数能被5整除,则关闭ul标签
        if (@me == 20 && (@me % 5 == 0)) {
            @me = "</ul>";
        }
        // 如果不是最后一个,但当前计数能被5整除,也关闭ul标签
        else if (@me < 20 && (@me % 5 == 0)) {
            @me = "</ul>";
        } else {
            @me = "";
        }
    [/field:global]
{/dede:loop}

代码解释:

  1. {dede:loop ...}:循环获取20篇文章数据。row='20' 是你想要显示的文章总数。
  2. [field:global name=autoindex ...]:获取当前循环的次数(从1到20)。
  3. runphp="yes":允许在标签内使用PHP代码。
  4. if (@me % 5 == 1 || @me == 1):判断当前计数是否为1、6、11...,如果是,就输出 <ul class='row-list'> 开始一个新行。
  5. if (@me % 5 == 0):判断当前计数是否为5、10、15...,如果是,就输出 </ul> 结束当前行。
  6. 注意:这里需要处理边界条件,特别是当总数量(如20)能被5整除时,确保最后一个 </ul> 被正确输出。

第二步:添加 CSS 样式

为了布局正确,你仍然需要一些简单的 CSS:

/* 清除ul的默认样式 */
.row-list {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex; /* 使用flex让li在一行内排列 */
    gap: 15px; /* 可选,设置li之间的间距 */
}
.row-list li {
    flex: 1; /* 让所有li平分ul的宽度 */
    /* 可选的li样式 */
    box-sizing: border-box;
    padding: 10px;
    border: 1px solid #eee;
    text-align: center; /* 让内容居中 */
}

优点:

  • 结构固定:生成的HTML结构非常规整,每一行都被 <ul> 包裹。
  • 不依赖CSS:即使CSS加载失败,列表项也能按块显示。

缺点:

  • 模板复杂:PHP 逻辑混在 HTML 中,可读性差,不易维护。
  • 不够灵活:如果想改成每行4个,需要修改PHP逻辑,而不是简单的CSS。
  • 扩展性差:实现响应式布局非常困难。

总结与建议

特性 方法一 (Flexbox) 方法二 (Loop标签)
推荐度 ⭐⭐⭐⭐⭐ (强烈推荐) ⭐⭐ (不推荐,仅作了解)
实现难度 简单 (只需改CSS) 复杂 (需要修改PHP模板)
代码维护 非常容易 困难
响应式支持 非常好 困难
灵活性 极高 较低

对于所有新项目或需要维护的项目,请优先选择方法一(Flexbox CSS 布局),它是现代Web开发的标准做法,能让你以最少的精力实现最佳的效果和最高的可维护性,方法二是一种过时的技术,仅在处理非常老旧、无法修改模板逻辑的 DedeCMS 系统时才可能用到。

-- 展开阅读全文 --
头像
标签如何优化提升SEO效果?
« 上一篇 04-05
dede漏洞修复工具如何有效使用?
下一篇 » 04-05

相关文章

取消
微信二维码
支付宝二维码

目录[+]