织梦修改当前栏目样式

99ANYc3cd6
预计阅读时长 18 分钟
位置: 首页 织梦建站 正文

使用CSS的 target 伪类(最简单、最推荐)

这是最简洁、最纯粹的前端方法,无需修改任何PHP或模板文件,只需在CSS中添加几行代码即可。

织梦修改当前栏目样式
(图片来源网络,侵删)

原理: 当用户点击一个链接时,URL会变成 你的域名/plus/list.php?tid=栏目ID,浏览器会将这个URL中的 #栏目ID 部分视为页面的“目标”,CSS的 target 伪类专门用于为这个“目标”元素添加样式。

操作步骤:

  1. 找到你的栏目链接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>
  2. 给链接添加 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
  3. 在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(如 currentactive)是最佳选择。

原理: 在模板文件中,通过PHP的 $_GET['tid'] 变量获取当前页面的栏目ID,然后与循环中的每个栏目ID进行比较,如果相等,就为该栏目链接添加一个 class="current" 属性。

织梦修改当前栏目样式
(图片来源网络,侵删)

操作步骤:

  1. 打开栏目列表模板文件 同样是 /templets/default/list_channel.htm 或你的自定义模板。

  2. 修改栏目循环代码{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> 标签中。
  3. 在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" 属性。

操作步骤:

  1. 备份文件 在进行任何修改前,务必备份 include/typelink.class.php 文件。

  2. 打开并修改文件 找到并打开 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>";
  3. 在CSS中定义样式 这一步和方法二完全一样,在你的CSS文件中定义 .current 类的样式。

效果: 这种方法实现了与方法二相同的效果,但逻辑被封装在了核心类中,这意味着在任何地方调用 GetTypeLink() 函数(比如在首页的 {dede:channel} 标签中),都会自动带上 current 类,优点是“一劳永逸”,缺点是升级麻烦且可能与其他插件冲突。


总结与建议

方法 优点 缺点 适用场景
方法一: target 最简单,纯CSS,无后端逻辑,升级无忧 依赖点击行为,页面加载时不显示高亮 简单的导航栏,对高亮时机要求不高的场景
方法二: PHP判断 最灵活,逻辑清晰,可扩展性强,升级无忧 需要修改模板文件,需要一点PHP基础 强烈推荐,绝大多数情况下的首选方案
方法三: 修改核心 一劳永逸,所有调用处自动生效 修改核心文件,升级会丢失,有风险 网站结构非常复杂,且确定未来不会升级的场景

对于绝大多数用户,我强烈推荐使用方法二,它兼顾了灵活性、安全性和易维护性,是解决这个问题的标准实践。

-- 展开阅读全文 --
头像
C语言飞机订票系统如何实现核心功能?
« 上一篇 今天
C语言程序设计基础习题答案正确吗?
下一篇 » 今天

相关文章

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

目录[+]