使用CSS的 target 伪类(最简单、最推荐)
这是最简洁、最纯粹的前端方法,无需修改任何PHP或模板文件,只需在CSS中添加几行代码即可。

原理:
当用户点击一个链接时,URL会变成 你的域名/plus/list.php?tid=栏目ID,浏览器会将这个URL中的 #栏目ID 部分视为页面的“目标”,CSS的 target 伪类专门用于为这个“目标”元素添加样式。
操作步骤:
-
找到你的栏目链接HTML结构 打开你的栏目列表模板文件(通常是
/templets/default/list_channel.htm或你在后台自定义的栏目模板),找到循环输出栏目的代码,它大概长这个样子:<ul class="channel-list"> {dede:channel type='top'} <li><a href='[field:typelink/]'>[field:typename/]</a></li> {/dede:channel} </ul> -
给链接添加
id属性 修改上面的代码,给<a>标签增加一个id属性,并使用[field:id/]来动态填充当前栏目的ID。
(图片来源网络,侵删)<ul class="channel-list"> {dede:channel type='top'} <li><a href='[field:typelink/]' id="channel-[field:id/]">[field:typename/]</a></li> {/dede:channel} </ul>id="channel-[field:id/]":这里我们给ID加了一个前缀channel-,以避免与其他ID冲突,如果栏目ID是1,那么这个链接的ID就是channel-1。
-
在CSS文件中添加
target样式 打开你的网站CSS文件(通常是/templets/default/style/dedecms.css或/static/css/style.css),添加以下CSS规则:/* 默认栏目样式 */ .channel-list a { display: block; padding: 10px 15px; color: #333; text-decoration: none; background-color: #f5f5f5; border-radius: 4px; transition: all 0.3s ease; } /* 当链接成为目标时的样式(即当前栏目) */ .channel-list a:target { background-color: #007bff; /* 高亮背景色 */ color: #ffffff; /* 高亮文字颜色 */ font-weight: bold; /* 加粗 */ }
效果:
当用户点击“公司简介”这个栏目时,URL会变成 .../list.php?tid=2,浏览器会自动找到 id="channel-2" 的链接,并为其应用 target 中定义的样式,使其高亮显示,当用户点击其他栏目或页面其他地方时,高亮效果会消失。
通过PHP判断并输出 class 属性(最灵活、最常用)
target 方法不满足你的需求(比如你想在页面加载时就高亮,而不是点击后才高亮),或者你的链接结构比较复杂,那么使用PHP判断当前栏目ID并给元素添加一个特定的 class(如 current 或 active)是最佳选择。
原理:
在模板文件中,通过PHP的 $_GET['tid'] 变量获取当前页面的栏目ID,然后与循环中的每个栏目ID进行比较,如果相等,就为该栏目链接添加一个 class="current" 属性。

操作步骤:
-
打开栏目列表模板文件 同样是
/templets/default/list_channel.htm或你的自定义模板。 -
修改栏目循环代码 在
{dede:channel}标签中使用runphp='yes'来进行PHP逻辑判断。<ul class="channel-list"> {dede:channel type='top'} <li> <?php // 获取当前页面的栏目ID $current_id = isset($_GET['tid']) ? $_GET['tid'] : 0; // 获取当前循环中的栏目ID $this_id = $GLOBALS['envs']['typeid']; // 判断是否为当前栏目,如果是,则添加 current 类 $class_str = ($current_id == $this_id) ? ' class="current"' : ''; ?> <a href='[field:typelink/]'<?php echo $class_str;?>>[field:typename/]</a> </li> {/dede:channel} </ul>代码解释:
$current_id = isset($_GET['tid']) ? $_GET['tid'] : 0;:获取URL中的tid参数(即当前栏目ID),如果不存在则为0。$this_id = $GLOBALS['envs']['typeid'];:获取当前{dede:channel}循环中正在处理的栏目的ID,这是织梦模板引擎中一个非常常用的全局变量。$class_str = ($current_id == $this_id) ? ' class="current"' : '';:这是一个三元运算符,如果当前页面的ID和循环中的ID相等,就生成字符串class="current",否则生成空字符串。<a ...<?php echo $class_str;?>>:将生成的class属性输出到<a>标签中。
-
在CSS文件中定义
.current样式 在你的CSS文件中,为.current类(或者你自定义的类名)添加样式。/* 默认栏目样式 */ .channel-list a { display: block; padding: 10px 15px; color: #333; text-decoration: none; border-bottom: 1px solid #eee; } /* 当前栏目样式 */ .channel-list a.current { color: #e74c3c; /* 红色文字 */ border-left: 3px solid #e74c3c; /* 左侧红色边框 */ background-color: #fdf2f2; /* 淡红色背景 */ }
效果:
无论用户如何进入这个列表页(比如从首页点击,或者直接输入地址),只要URL中带有 tid=栏目ID,对应的栏目链接就会自动获得 current 类,并应用你定义的CSS样式。
修改织梦核心文件(不推荐,除非必要)
警告: 此方法会修改织梦的核心文件,在系统升级后你的修改会被覆盖。强烈建议仅在方法一和方法二都无法实现时才考虑使用。
原理:
修改 include/typelink.class.php 文件,让织梦在生成栏目链接时,自动为当前栏目的链接添加一个 class="current" 属性。
操作步骤:
-
备份文件 在进行任何修改前,务必备份
include/typelink.class.php文件。 -
打开并修改文件 找到并打开
include/typelink.class.php文件,找到GetTypeLink()函数,在返回链接的return语句之前,添加判断逻辑。在大约第100行左右,找到类似这样的代码:
return "<a href='".$typepage."'>".$typename."</a>";
修改为:
// 获取当前页面的栏目ID $current_id = isset($_GET['tid']) ? (int)$_GET['tid'] : 0; // 如果当前栏目ID和这个栏目的ID相同,则添加 current 类 $class_str = ($current_id == $this->TypeID) ? ' class="current"' : ''; return "<a href='".$typepage."'".$class_str.">".$typename."</a>";
-
在CSS中定义样式 这一步和方法二完全一样,在你的CSS文件中定义
.current类的样式。
效果:
这种方法实现了与方法二相同的效果,但逻辑被封装在了核心类中,这意味着在任何地方调用 GetTypeLink() 函数(比如在首页的 {dede:channel} 标签中),都会自动带上 current 类,优点是“一劳永逸”,缺点是升级麻烦且可能与其他插件冲突。
总结与建议
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
方法一: target |
最简单,纯CSS,无后端逻辑,升级无忧 | 依赖点击行为,页面加载时不显示高亮 | 简单的导航栏,对高亮时机要求不高的场景 |
| 方法二: PHP判断 | 最灵活,逻辑清晰,可扩展性强,升级无忧 | 需要修改模板文件,需要一点PHP基础 | 强烈推荐,绝大多数情况下的首选方案 |
| 方法三: 修改核心 | 一劳永逸,所有调用处自动生效 | 修改核心文件,升级会丢失,有风险 | 网站结构非常复杂,且确定未来不会升级的场景 |
对于绝大多数用户,我强烈推荐使用方法二,它兼顾了灵活性、安全性和易维护性,是解决这个问题的标准实践。
