核心原理
织梦实现导航高亮(选中状态)的核心原理是:通过PHP判断当前页面的URL(或栏目ID)是否与导航链接的URL(或栏目ID)相匹配,如果匹配,就在该<li>标签中输出一个特定的CSS类名(如 active 或 current),然后我们通过CSS为这个类名定义样式即可。

(图片来源网络,侵删)
使用织梦内置的 channel 标签(最常用、最推荐)
这是织梦官方提供的标准方法,适用于大多数场景,特别是当你的导航链接直接指向织梦的栏目时。
在模板文件中修改导航代码
找到你网站模板文件中的导航部分,通常是在 head.htm 或 header.htm 文件里,默认的导航代码可能长这样:
<div id="nav">
<ul>
<li><a href='{dede:global.cfg_cmsurl/}/'>首页</a></li>
<li><a href='{dede:channel type='top' row='8'}'[field:typelink/]{/dede:channel}'>关于我们</a></li>
<!-- 更多导航项... -->
</ul>
</div>
我们需要修改 {dede:channel} 标签,让它能自动判断并添加 active 类。
修改后的代码如下:

(图片来源网络,侵删)
<div id="nav">
<ul>
<!-- 首页导航项,需要特殊处理 -->
<li>
<a href='{dede:global.cfg_cmsurl/}/'
{dede:field name='typeid' runphp='yes'}@me = (empty(@me) || @me == '0') ? 'class="active"' : ''{/dede:field}>
首页
</a>
</li>
<!-- 一级栏目导航项 -->
<li>
<a href='{dede:channel type='top' row='8'}
[field:typelink/]
{dede:field.typeid runphp='yes'}@me = (@me == 'typeid') ? 'class="active"' : ''{/dede:field}
>
[field:typename/]
</a>
</li>
<!-- 更多导航项... -->
</ul>
</div>
代码解释:
-
首页高亮判断:
{dede:field name='typeid' runphp='yes'}@me = (empty(@me) || @me == '0') ? 'class="active"' : ''{/dede:field}runphp='yes':开启PHP运行。@me:代表当前字段的值,这里是typeid(栏目ID)。empty(@me) || @me == '0':判断当前页面的typeid是否为空或为0,首页的typeid就是0,所以这个条件成立。? 'class="active"' : '':如果条件成立,就在<a>标签里输出class="active",否则输出空字符串。
-
栏目页高亮判断:
{dede:field.typeid runphp='yes'}@me = (@me == 'typeid') ? 'class="active"' : ''{/dede:field}- 这个代码放在
{dede:channel}循环内部。 @me在循环内部代表当前循环到的栏目的 ID。(@me == 'typeid'):这里的'typeid'是一个占位符,你需要把它替换成 当前页面的栏目ID,这个ID可以通过{dede:field name='typeid'/}获取到。- 更正和简化: 上面那段代码在旧版本中常见,但在新版本中,织梦的
channel标签有一个更简单、更强大的属性currentstyle。
- 这个代码放在
更优化的 currentstyle 方法(强烈推荐)
这是织梦 channel 标签自带的属性,专门用于处理当前选中项的样式,代码更简洁。
<div id="nav">
<ul>
<!-- 首页 -->
<li><a href='{dede:global.cfg_cmsurl/}/' {dede:field name='typeid' runphp='yes'}@me = (empty(@me) || @me == '0') ? 'class="active"' : ''{/dede:field}>首页</a></li>
<!-- 一级栏目,使用 currentstyle -->
{dede:channel type='top' row='8' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:channel}
</ul>
</div>
currentstyle 属性说明:
currentstyle="..."里的内容就是当导航项为当前页面时,要输出的完整HTML代码。~typelink~:会被替换为栏目的链接地址。~typename~:会被替换为栏目的名称。- 当用户访问某个栏目页时,织梦会自动判断
{dede:channel}循环中的哪个链接是当前页面的链接,然后输出currentstyle里的内容,而其他非当前项则输出默认的<li><a href="[field:typelink/]">[field:typename/]</a></li>。
使用 arclist 标签(适用于特定场景)
导航可能不是指向栏目,而是指向指定的文章列表页,这时可以使用 arclist 标签的 type 属性来调用指定ID的栏目,并同样使用 currentstyle。
{dede:arclist typeid='栏目ID' row='1' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li><a href="[field:typelink/]">[field:typename/]</a></li>
{/dede:arclist}
这种方法和方法一的原理类似,只是调用的标签不同。
第三步:编写CSS样式
无论你使用哪种方法,最终都需要在CSS文件中定义 .active 类的样式,来让选中的导航项看起来与众不同。
通常在 style.css 或 main.css 文件中添加如下代码:
/* 导航默认样式 */
#nav ul li {
float: left; /* 如果是横向导航 */
list-style: none;
margin-right: 10px;
}
#nav ul li a {
display: block;
padding: 10px 15px;
color: #333; /* 默认文字颜色 */
text-decoration: none;
border: 1px solid transparent; /* 透明边框,用于高亮时改变 */
}
#nav ul li a:hover {
color: #ff6600; /* 鼠标悬停效果 */
background-color: #f0f0f0;
}
/* 关键:选中/高亮状态的样式 */
#nav ul li.active a {
/* 你想要的高亮效果 */
color: #fff; /* 白色文字 */
background-color: #ff6600; /* 橙色背景 */
border: 1px solid #e55a00;
font-weight: bold; /* 文字加粗 */
}
总结与排查
如果按照上述方法操作后,导航高亮仍然不生效,可以从以下几个方面排查:
- 缓存问题:这是最常见的问题,修改模板或CSS后,请务必登录织梦后台 -> 系统 -> 一键更新 -> 更新网站缓存,然后刷新前台页面。
- CSS路径错误:检查CSS文件是否被正确引入到HTML的
<head>中。 - CSS优先级问题:确保你的
.active样式没有被其他更具体的CSS规则覆盖,可以使用浏览器开发者工具(按F12)检查元素,看.active样式是否被应用以及是否有其他样式覆盖了它。 - PHP代码错误:如果手动写了PHP判断,检查语法是否正确,特别是引号的使用。
- 栏目类型:确保你的导航指向的是普通栏目,而不是外部链接、单页文档等,对于外部链接,
currentstyle是无效的,需要手动判断URL。
希望这个详细的教程能帮助你完美实现织梦导航的选中与不选中效果!
