这是一个非常实用且核心的标签,主要用于实现当前栏目高亮或当前导航项高亮,从而提升网站的用户体验和导航的直观性。

{dede:currentstyle/} 是什么?
{dede:currentstyle/} 本身是一个空标签,它本身不输出任何内容,它的作用是在其所在的 {dede:channel} 或 {dede:type} 循环中,判断当前正在循环的栏目是否是当前页面所在的栏目。
- 如果是:它会替换标签本身为你在
typeid属性中指定的内容。 - 如果不是:它会被忽略,不输出任何内容。
它就是一个“条件判断器”,专门用来给当前栏目应用一个特殊的样式。
工作原理与使用场景
{dede:currentstyle/} 通常与 {dede:channel}(用于调用顶级栏目)或 {dede:type}(用于调用当前栏目的父级栏目)标签结合使用。
基本语法
{dede:channel typeid='top' currentstyle='
<li class="active"><a href='~typelink~' >~typename~</a></li>
'}
<li><a href='~typelink~' >~typename~</a></li>
{/dede:channel}
语法分解:
{dede:channel ...}: 调用栏目的循环标签。typeid='top': 表示调用所有顶级栏目,你也可以指定具体的栏目ID,如typeid='1,2,3'。currentstyle='...': 这是关键属性。- 单引号 内的内容就是当栏目是当前栏目时,要输出的完整HTML结构。
- 在这个字符串中,你可以使用
~typelink~和~typename~等变量,它们会被当前栏目的实际链接和名称替换。
- 在
{dede:channel}和{/dede:channel}之间的内容,是当栏目不是当前栏目时,要输出的默认HTML结构。
执行流程:
{dede:channel}开始循环,逐个读取顶级栏目。- 对于每一个栏目,判断它是否是当前页面所在的栏目。
- 如果是:执行
currentstyle里的代码,并用~typelink~、~typename~等替换掉实际值。 - 如果不是:执行
currentstyle标签之外的默认代码,并用~typelink~、~typename~等替换掉实际值。 - 循环下一个栏目,直到结束。
实战示例:网站主导航高亮
假设我们有以下HTML结构,希望当前栏目的 <li> 拥有一个 active 类。
目标HTML效果:
<ul class="nav">
<li><a href="/home/">首页</a></li>
<li class="active"><a href="/news/">新闻中心</a></li> <!-- 假设当前在新闻页面 -->
<li><a href="/products/">产品展示</a></li>
<li><a href="/about/">关于我们</a></li>
</ul>
织梦DedeCMS实现代码:
<ul class="nav">
{dede:channel typeid='top' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li><a href='~typelink~'>~typename~</a></li>
{/dede:channel}
</ul>
代码解析:
- 当用户访问“新闻中心”页面时,织梦系统知道当前栏目ID是新闻的ID。
- 在
{dede:channel}循环到“新闻中心”这个栏目时,{dede:currentstyle/}的条件为真。 <li><a href='~typelink~'>~typename~</a></li>这行默认代码被忽略,转而执行currentstyle属性中的代码。- 最终生成的HTML就是
<li class='active'><a href='/news/'>新闻中心</a></li>,完美实现了高亮效果。
进阶用法与注意事项
在子栏目列表页中高亮父栏目
有时,我们在一个子栏目(如 /news/tech/)的列表页,也希望其父级栏目(如“新闻中心”)在导航中保持高亮,这时,currentstyle 默认行为可能无法满足需求,因为它只判断完全匹配的栏目。
解决方案:
可以使用 currentstyle 的一个替代方案,通过 runphp 和 in_array 函数来判断当前页面是否属于某个栏目的子栏目。
示例代码:
<ul class="nav">
{dede:channel typeid='top' currentstyle="<li class='active'><a href='~typelink~'>~typename~</a></li>"}
<li>
<a href='~typelink~'>~typename~</a>
<!-- 判断当前栏目是否是该顶级栏目的子栏目 -->
[field:sonrunphp]
if(@me) {
$dsql = new DedeSql(false);
$types = GetSonIds(@me, 0);
$currentType = '<?= $GLOBALS['typeid'] ?>';
if(in_array($currentType, explode(',', $types))) {
@me = "<ul class='sub-nav'>[field:sonlist]</ul>";
} else {
@me = '';
}
} else {
@me = '';
}
[/field:sonrunphp]
</li>
{/dede:channel}
</ul>
这段代码比较复杂,核心思想是:在循环每个顶级栏目时,获取其所有子栏目的ID,然后判断当前页面的栏目ID是否在这个列表中,如果在,就显示子菜单。
注意变量和引号的嵌套
在 currentstyle 属性中写HTML时,要注意引号的嵌套,如果HTML属性本身使用了单引号 ,currentstyle 属性最好使用双引号 包裹,反之亦然。
- 推荐:
currentstyle="..."(外层双引号),内部HTML使用单引号 。 - 避免:
currentstyle='...'(外层单引号),内部HTML也使用单引号 ,这会导致语法错误。
使用 dede:type
{dede:type} 是用来获取单个栏目的信息,通常用于当前栏目页或文章页,它也可以使用 currentstyle,但用途相对较少,因为 currentstyle 在循环中判断的逻辑更强大。
示例:在面包屑导航中高亮当前栏目
{dede:field name='position' runphp='yes'}
$GLOBALS['currentstyle'] = "<span class='active'>~typename~</span>";
@me = str_replace('<a', $GLOBALS['currentstyle'], @me);
@me = str_replace('</a>', '', @me);
@me = str_replace('>', $GLOBALS['currentstyle'], @me);
@me = str_replace('~typename~', '', @me);
@me = str_replace($GLOBALS['currentstyle'], '', @me);
@me = str_replace('<span class=\'active\'>', '<a href="'.@me.'">@me</a><span class="active">', @me);
// ... 更复杂的正则表达式替换会更可靠
{/dede:field}
这个例子比较绕,说明在面包屑这种特定场景下,直接用 currentstyle 可能不是最优雅的方案,通常需要结合 runphp 和字符串处理函数来实现。
特性
描述
标签类型
空标签,无独立输出。
主要用途
在 {dede:channel} 或 {dede:type} 循环中实现当前栏目高亮。
核心属性
currentstyle,定义高亮状态下的HTML结构。
判断逻辑
判断循环中的栏目ID是否与当前页面的栏目ID完全匹配。
常用变量
在 currentstyle 中可以使用 ~typelink~、~typename~ 等变量。
高级应用
结合 runphp 和 in_array 等函数,可以实现“父栏目高亮”等复杂效果。
掌握 {dede:currentstyle/} 是织梦模板开发的基础技能,它能让你轻松制作出动态、直观的网站导航,极大地提升模板的可用性和专业性。
{dede:type} 是用来获取单个栏目的信息,通常用于当前栏目页或文章页,它也可以使用 currentstyle,但用途相对较少,因为 currentstyle 在循环中判断的逻辑更强大。
示例:在面包屑导航中高亮当前栏目
{dede:field name='position' runphp='yes'}
$GLOBALS['currentstyle'] = "<span class='active'>~typename~</span>";
@me = str_replace('<a', $GLOBALS['currentstyle'], @me);
@me = str_replace('</a>', '', @me);
@me = str_replace('>', $GLOBALS['currentstyle'], @me);
@me = str_replace('~typename~', '', @me);
@me = str_replace($GLOBALS['currentstyle'], '', @me);
@me = str_replace('<span class=\'active\'>', '<a href="'.@me.'">@me</a><span class="active">', @me);
// ... 更复杂的正则表达式替换会更可靠
{/dede:field}
这个例子比较绕,说明在面包屑这种特定场景下,直接用 currentstyle 可能不是最优雅的方案,通常需要结合 runphp 和字符串处理函数来实现。
| 特性 | 描述 |
|---|---|
| 标签类型 | 空标签,无独立输出。 |
| 主要用途 | 在 {dede:channel} 或 {dede:type} 循环中实现当前栏目高亮。 |
| 核心属性 | currentstyle,定义高亮状态下的HTML结构。 |
| 判断逻辑 | 判断循环中的栏目ID是否与当前页面的栏目ID完全匹配。 |
| 常用变量 | 在 currentstyle 中可以使用 ~typelink~、~typename~ 等变量。 |
| 高级应用 | 结合 runphp 和 in_array 等函数,可以实现“父栏目高亮”等复杂效果。 |
掌握 {dede:currentstyle/} 是织梦模板开发的基础技能,它能让你轻松制作出动态、直观的网站导航,极大地提升模板的可用性和专业性。
