下面我将为你提供两种最主流、最实用的方法:

(图片来源网络,侵删)
- 纯CSS实现(推荐) - 性能好,无JS依赖,适合大多数静态场景。
- jQuery + CSS实现 - 更灵活,适合需要动态交互或更复杂逻辑的场景。
准备工作:获取顶级分类ID
无论使用哪种方法,你首先需要知道你想要制作下拉菜单的那个顶级分类的ID。
- 登录你的织梦后台。
- 进入「[核心] -> [频道管理] -> [分类管理]」。
- 找到你想要的顶级分类,点击后面的“修改”按钮。
- 在打开的页面中,URL中
cid=后面的数字就是该分类的ID。cid=5,那么ID就是5。
纯CSS实现(最常用)
这种方法的核心是利用织梦的 {dede:channelartlist} 和 {dede:channel} 标签进行嵌套,然后用CSS来控制子菜单的显示和隐藏。
第1步:在模板文件中添加HTML结构
假设你的顶级分类ID是 5,你需要在网站的头部模板(如 head.htm)或者你希望显示菜单的任何模板文件中,加入以下代码。
<!-- 顶级分类列表 -->
<ul class="topnav">
<li><a href="{dede:global.cfg_cmsurl/}/">网站首页</a></li>
{dede:channelartlist typeid='5'}
<li class="menu-item">
<a href="{dede:field name='typeurl'/}">{dede:field name='typename'/}</a>
<!-- 二级分类列表 -->
<ul class="subnav">
{dede:channel type='son' noself='yes'}
<li class="menu-item-second">
<a href="[field:typelink/]">[field:typename/]</a>
<!-- 三级分类列表 -->
{dede:channel type='son' noself='yes'}
<ul class="subnav-third">
<li><a href="[field:typelink/]">[field:typename/]</a></li>
</ul>
{/dede:channel}
</li>
{/dede:channel}
</ul>
</li>
{/dede:channelartlist}
</ul>
代码解释:

(图片来源网络,侵删)
{dede:channelartlist typeid='5'}: 这个标签会循环输出ID为5的顶级分类及其所有子分类。typeid='5'是关键,请替换成你的顶级分类ID。{dede:field name='typeurl'/}和{dede:field name='typename'/}: 分别获取顶级分类的链接和名称。{dede:channel type='son' noself='yes'}: 这个标签在channelartlist内部使用时,会自动获取当前顶级分类下的二级分类。type='son'表示只获取子分类。{dede:channel type='son' noself='yes'}: 这个标签嵌套在二级循环内,就会获取到三级分类,这是实现三级的核心技巧。
第2步:添加CSS样式
在你的CSS文件(如 style.css)中,添加以下样式来美化菜单并实现下拉效果。
/* 重置和基础样式 */
.topnav, .subnav, .subnav-third {
list-style: none;
margin: 0;
padding: 0;
}
.topnav li, .subnav li, .subnav-third li {
position: relative; /* 关键:为下拉菜单定位 */
float: left; /* 让菜单项横向排列 */
margin: 0 5px;
}
.topnav a, .subnav a, .subnav-third a {
display: block;
padding: 10px 15px;
text-decoration: none;
color: #333;
background-color: #f4f4f4;
border: 1px solid #ddd;
}
.topnav a:hover, .subnav a:hover, .subnav-third a:hover {
background-color: #e0e0e0;
}
/* ----------------- 核心下拉逻辑 ----------------- */
/* 1. 默认隐藏二级菜单 */
.subnav {
display: none;
position: absolute; /* 脱离文档流,相对于父级 li 定位 */
top: 100%; /* 在父级li的下方显示 */
left: 0;
min-width: 150px;
z-index: 1000;
}
/* 2. 当鼠标移到顶级菜单项时,显示二级菜单 */
.menu-item:hover .subnav {
display: block;
}
/* 3. 默认隐藏三级菜单 */
.subnav-third {
display: none;
position: absolute;
top: 0; /* 在二级菜单项的右侧显示 */
left: 100%;
min-width: 150px;
}
/* 4. 当鼠标移到二级菜单项时,显示三级菜单 */
.menu-item-second:hover .subnav-third {
display: block;
}
/* 可选:为三级菜单添加小箭头或样式,让它更明显 */
.menu-item-second {
position: relative;
}
CSS核心逻辑:
position: relative;在父级<li>上设置,这样子菜单(position: absolute;)就可以相对于它来定位。display: none;默认隐藏子菜单。父级:hover .子菜单选择器 { display: block; }这就是CSS实现下拉的关键,当鼠标悬停在父级元素上时,选择并显示其内部的子菜单。
jQuery + CSS实现
如果纯CSS在某些复杂浏览器中不兼容,或者你想有更酷炫的动画效果,可以使用jQuery。
第1步:HTML结构(与方法一完全相同)
请参考方法一的HTML部分。

(图片来源网络,侵删)
第2步:引入jQuery库
在你的模板文件 <head> 标签内,确保引入了jQuery库,如果你还没有,可以从官网下载或使用CDN链接。
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
第3步:修改CSS(与方法一类似)
CSS基本与方法一相同,但需要去掉 hover 的触发样式,改为由jQuery控制,我们可以给默认隐藏的子菜单加一个共同的类。
/* ... 其他基础样式保持不变 ... */
/* 修改:所有下拉菜单默认隐藏,并添加通用类 */
.subnav, .subnav-third {
display: none;
position: absolute;
/* ... 其他定位样式 ... */
}
/* 移除了 :hover 的CSS样式,改由JS控制 */
第4步:添加jQuery脚本
在页面底部(</body> 标签之前)添加以下jQuery代码。
<script>
$(document).ready(function(){
// 鼠标移入顶级菜单项时,显示二级菜单
$('.menu-item').mouseenter(function(){
$(this).find('.subnav').stop(true, true).slideDown(200); // 添加滑动动画
});
// 鼠标移出顶级菜单项时,隐藏二级菜单
$('.menu-item').mouseleave(function(){
$(this).find('.subnav').stop(true, true).slideUp(200);
});
// 鼠标移入二级菜单项时,显示三级菜单
$('.menu-item-second').mouseenter(function(){
$(this).find('.subnav-third').stop(true, true).slideDown(200);
});
// 鼠标移出二级菜单项时,隐藏三级菜单
$('.menu-item-second').mouseleave(function(){
$(this).find('.subnav-third').stop(true, true).slideUp(200);
});
});
</script>
jQuery代码解释:
$(document).ready(function(){...});: 确保页面DOM加载完成后再执行脚本。$('.menu-item').mouseenter(function(){...});: 当鼠标进入拥有menu-item类的元素时,执行函数。$(this).find('.subnav'): 在当前触发事件的元素(this)内部查找拥有subnav类的子元素。.slideDown(200): jQuery的动画方法,让匹配的元素在200毫秒内向下滑动显示。.slideUp()则是向上滑动隐藏。stop(true, true): 这是一个很好的习惯,可以停止正在进行的动画,防止鼠标快速移动时动画卡顿。
总结与建议
| 特性 | 纯CSS | jQuery + CSS |
|---|---|---|
| 性能 | 高,无JS执行开销 | 稍低,需要加载和执行jQuery |
| 兼容性 | 现代浏览器支持良好,IE6/7需要额外hack | 兼容性非常好,只要浏览器支持JS |
| 实现难度 | 简单,只需HTML和CSS | 需要HTML、CSS和少量JS知识 |
| 灵活性 | 一般,动画效果有限 | 高,可实现各种复杂动画和交互 |
| 推荐度 | (首选,适合99%的场景) | ★★★☆☆ (当需要特殊动画或兼容旧浏览器时) |
对于绝大多数织梦网站,强烈推荐使用方法一(纯CSS实现),它简单、高效且足够稳定,只有在你对动画效果有特别要求,或者需要支持非常老旧的浏览器时,才考虑使用方法二。
