- 准备数据:确保你的栏目结构清晰,并且已经将顶级栏目设置为“顶级栏目”。
- 修改模板文件:在首页模板文件中,编写用于调用栏目的 HTML 结构。
- 编写 CSS 样式:创建 CSS 文件来美化菜单并实现下拉效果。
第一步:准备数据(后台设置)
在 DedeCMS 后台,你需要确保栏目的层级结构是正确的。

(图片来源网络,侵删)
- 登录 DedeCMS 后台。
- 进入【核心】 -> 【栏目管理】。
- 创建你的栏目。
- 顶级栏目 1:
产品中心(设置为“顶级栏目”)- 二级栏目 1.1:
硬件产品(父栏目选择“产品中心”)- 三级栏目 1.1.1:
服务器(父栏目选择“硬件产品”) - 三级栏目 1.1.2:
交换机(父栏目选择“硬件产品”)
- 三级栏目 1.1.1:
- 二级栏目 1.2:
软件产品(父栏目选择“产品中心”)- 三级栏目 1.2.1:
操作系统(父栏目选择“软件产品”) - 三级栏目 1.2.2:
办公软件(父栏目选择“软件产品”)
- 三级栏目 1.2.1:
- 二级栏目 1.1:
- 顶级栏目 2:
关于我们(设置为“顶级栏目”)- 二级栏目 2.1:
公司简介(父栏目选择“关于我们”) - 二级栏目 2.2:
联系我们(父栏目选择“关于我们”)
- 二级栏目 2.1:
- 顶级栏目 1:
确保你的栏目结构是这样清晰的层级关系,否则调用会出错。
第二步:修改模板文件 (index.htm)
我们需要在首页模板中,使用 DedeCMS 的标签 {dede:channel} 来循环输出栏目,并构建出我们需要的 HTML 结构。
- 打开你的网站根目录下的
/templets/default/文件夹。 - 找到并编辑
index.htm文件(或者你自定义的首页模板文件)。 - 在你希望显示菜单的位置(通常是
<body>标签下,<header>或<nav>区域内),粘贴以下代码:
<!-- 导航菜单开始 -->
<div class="main-nav">
<ul id="nav">
{dede:channel type='top' row='8'}
<li>
<a href="[field:typeurl/]">[field:typename/]</a>
<!-- 二级栏目开始 -->
{dede:son typeid='[field:id/]'}
<ul class="sub-nav">
<li>
<a href="[field:typeurl/]">[field:typename/]</a>
<!-- 三级栏目开始 -->
{dede:son typeid='[field:id/]'}
<ul class="sub-sub-nav">
<li><a href="[field:typeurl/]">[field:typename/]</a></li>
{/dede:son}
<!-- 三级栏目结束 -->
</li>
{/dede:son}
<!-- 二级栏目结束 -->
</ul>
</li>
{/dede:channel}
</ul>
</div>
<!-- 导航菜单结束 -->
代码解释:
{dede:channel type='top' row='8'}:type='top':这是关键,表示只调用顶级栏目。row='8':表示调用最多8个顶级栏目,你可以根据需要修改。
[field:typeurl/]和[field:typename/]:分别输出栏目的链接和名称。{dede:son typeid='[field:id/]'} ... {/dede:son}:- 这是一个嵌套循环,它会在每个顶级栏目循环内部,再次调用该顶级栏目下的所有二级栏目。
typeid='[field:id/]将当前顶级栏目的ID作为参数,传递给son标签,从而实现子栏目的调用。
- 我们再次嵌套了一层
{dede:son ... },用于在二级栏目下调用三级栏目,这样就构成了完整的三级结构。
第三步:编写 CSS 样式 (style.css)
我们有了 HTML 骨架,需要用 CSS 来给它穿上“衣服”并实现下拉效果。

(图片来源网络,侵删)
- 打开
/templets/default/style.css文件(或你自定义的样式文件)。 - 在文件末尾添加以下 CSS 代码:
/* ===== 导航菜单样式开始 ===== */
/* 主导航容器 */
.main-nav {
width: 100%; /* 或固定宽度,如 1200px */
background-color: #333; /* 背景色 */
margin: 0 auto;
}
/* 主导航列表 */
#nav {
list-style: none; /* 去掉列表前的点 */
margin: 0;
padding: 0;
text-align: center; /* 让菜单项居中 */
}
/* 主导航列表项 */
#nav > li {
display: inline-block; /* 横向排列 */
position: relative; /* 关键:为下拉菜单定位提供参考 */
}
/* 主导航链接 */
#nav > li > a {
display: block; /* 让链接可以撑满整个 li */
padding: 15px 20px;
color: #fff;
text-decoration: none;
font-size: 16px;
}
/* 鼠标悬停在主链接上的效果 */
#nav > li > a:hover {
background-color: #555;
}
/* ===== 二级下拉菜单样式 ===== */
/* 默认隐藏二级菜单 */
#nav > li > .sub-nav {
display: none;
position: absolute; /* 绝对定位,相对于父级 li */
top: 100%; /* 定位在主链接的下方 */
left: 0;
background-color: #444;
min-width: 200px; /* 设置一个最小宽度 */
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
z-index: 1000;
}
/* 当鼠标悬停在主菜单项上时,显示二级菜单 */
#nav > li:hover > .sub-nav {
display: block;
}
/* 二级菜单的列表项 */
#nav > li > .sub-nav > li {
width: 100%;
position: relative; /* 关键:为三级菜单定位提供参考 */
}
/* 二级菜单的链接 */
#nav > li > .sub-nav > li > a {
display: block;
padding: 12px 15px;
color: #fff;
text-decoration: none;
border-bottom: 1px solid #555;
}
/* 鼠标悬停在二级链接上的效果 */
#nav > li > .sub-nav > li > a:hover {
background-color: #666;
}
/* ===== 三级下拉菜单样式 ===== */
/* 默认隐藏三级菜单 */
#nav > li > .sub-nav > li > .sub-sub-nav {
display: none;
position: absolute; /* 绝对定位,相对于父级 li (二级菜单的项) */
top: 0; /* 定位在二级链接的右侧 */
left: 100%; /* 水平位置在父级元素的右边 */
background-color: #555;
min-width: 180px;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
/* 当鼠标悬停在二级菜单项上时,显示三级菜单 */
#nav > li > .sub-nav > li:hover > .sub-sub-nav {
display: block;
}
/* 三级菜单的链接 */
#nav > li > .sub-nav > li > .sub-sub-nav > li > a {
display: block;
padding: 10px 15px;
color: #fff;
text-decoration: none;
border-bottom: 1px solid #666;
}
/* 鼠标悬停在三级链接上的效果 */
#nav > li > .sub-nav > li > .sub-sub-nav > li > a:hover {
background-color: #777;
}
/* ===== 导航菜单样式结束 ===== */
CSS 核心逻辑解释:
position: relative和position: absolute:这是实现下拉菜单的精髓。- 我们给包含下拉菜单的
<li>设置了position: relative;,这让它成为了一个“定位参考系”。 - 然后给下拉的
<ul>设置了position: absolute;,这样它的位置就可以相对于那个“参考系”来定位了。 - 二级菜单:
top: 100%; left: 0;让它出现在主菜单的下方。 - 三级菜单:
top: 0; left: 100%;让它出现在二级菜单的右侧。
- 我们给包含下拉菜单的
display: none和hover:- 默认情况下,二级和三级菜单的
display都是none,所以是隐藏的。 - 当鼠标移动到父级
<li>上时(#nav > li:hover),我们通过选择器#nav > li:hover > .sub-nav将对应二级菜单的display设置为block,使其显示出来,三级菜单同理。
- 默认情况下,二级和三级菜单的
最终效果与优化
完成以上三步后,保存所有文件并刷新你的网站首页,你应该能看到一个功能完整、样式美观的三级下拉菜单了。
常见问题与优化:
- 菜单对齐问题:如果菜单没有居中或对齐,检查
#nav的text-align和#nav > li的display: inline-block。 - IE6/IE7 兼容性:非常老的浏览器(如 IE6)不支持
hover在非<a>标签上的应用,如果需要支持,你可能需要引入一个小的hover.htc文件或者使用 JavaScript(如 jQuery)来实现,但对于现代网站,可以忽略。 - 菜单宽度:通过调整
.sub-nav和.sub-sub-nav的min-width属性,可以控制下拉菜单的宽度。 - 响应式设计:上面的 CSS 是为桌面端设计的,在移动端,你可能需要将这个多级菜单转换为一个“汉堡包”图标,这通常需要结合媒体查询(
@media)和 JavaScript 来实现。
这个方法利用了 DedeCMS 自带的标签,结构清晰,易于理解和维护,是 DedeCMS 制作下拉菜单最标准、最推荐的方式。

(图片来源网络,侵删)
