针对 Wordpress 模板导航栏2级悬浮菜单的一个很好的解决方案
不知道你是否看的懂标题…
随着 Wordpress 越来越大众化,随着大家博客内容越来越丰富,我们对它的要求也是越来越高、越来越苛刻,很明显的一点就是很多人开始觉得 Wordpress 模板原始的导航菜单(只有1级)样式过于单调,输出的内容也有限,于是如何方便的输出2级导航栏就成为了一个大众化的需求。
之前,我针对 D&Z Theme 已经有所尝试——《给 D&Z Theme 增加一个额外的悬浮菜单 》,其方法是基于小胖的《JavaScript下拉菜单》。此方法虽然可行,但存在一个弊端——2级导航菜单需要手动添加和更新!这样做的话增加了不少工作量,而且对于 Wordpress 新手来说的话也有不小困难…

在这篇文章里,我将分享一个同样是使用 Javascript 来生成2级导航菜单的方法,此方法弥补了上述的缺陷。原文详情见这里:
http://www.htmldog.com/articles/suckerfish/dropdowns/
小胖的方法之所以需要手动更新 Wordpress 导航栏,是因为他的代码里给“父 li ”里写入了“onmouseover” 和 “onmouseout” 这2个行为:
1 2 3 4 5 6 7 8 9 10 11 12 | <li onmouseover="displaySubMenu(this)" onmouseout="hideSubMenu(this)"> <a href="#">父栏目1</a> <ul> <li><a href="#">子菜单1</a></li> <li><a href="#">子菜单2</a></li> <li><a href="#">子菜单3</a></li> <li><a href="#">子菜单4</a></li> </ul> </li> <li><a href="#">父栏目2</a></li> <li><a href="#">父栏目3</a></li> <!-- etc. --> |
然而 Wordpress 输出页面导航链接的函数是:
1 | <?php wp_list_pages('sort_column=menu_order&depth=1&exclude=&title_li=');?> |
其表现出来的形式为:
1 2 3 4 | <li><a href="#">父栏目1</a></li> <li><a href="#">父栏目2</a></li> <li><a href="#">父栏目3</a></li> <li><a href="#">父栏目4</a></li> |
也就是说这个函数输出的是一排带链接的 “li” ,因此我们就不可能把 “onmouseover” 和 “onmouseout” 这2个行为写入到函数中并让“父 li” 输出,如果要做2级导航菜单的话就需要把每个 “li” 都独立出来,这样就相当麻烦了…
不过 Suckerfish 的 Javascript 就解决了这个,它无需在“父 li” 中写入额外的内容,这样就能很好的运用到 Wordpress 中来。那么 Wordpress 模板导航栏部分的代码我们可以这样写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <script type="text/javascript"> sfHover = function() { var sfEls = document.getElementById("nav").getElementsByTagName("LI"); for (var i=0; i<sfEls.length; i++) { sfEls[i].onmouseover=function() { this.className+=" sfhover"; } sfEls[i].onmouseout=function() { this.className=this.className.replace(new RegExp(" sfhover\\b"), ""); } } } if (window.attachEvent) window.attachEvent("onload", sfHover); </script> <div class="nav"> <ul id="nav"> <li class="page_item <?php if ( is_home() ) { ?>current_page_item<?php } ?>"><a href="<?php echo get_settings('home'); ?>/" title="网站首页">网站首页</a></li> <?php wp_list_pages('sort_column=menu_order&depth=2&title_li=');?> </ul> </div> |
前半部分调用的就是 Javascript 代码,后半部分直接输出导航栏,注意到第19行中的“depth=2”,这个参数用于控制输出2层导航栏,也就是只会输出一层子菜单,改成3的话就会输出2层子菜单,以此类推。
针对上述代码,我们还需要相应的样式来控制子菜单的隐藏和显示(必须):
1 2 3 4 5 6 | #nav li:hover ul ul, #nav li.sfhover ul ul { left: -999em; } #nav li:hover ul, #nav li li:hover ul, #nav li.sfhover ul, #nav li li.sfhover ul { left: auto; } |
其它的 CSS 样式,比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #nav { } #nav ul { } #nav li { } #nav li a { } #nav li a:hover { } #nav li ul { } #nav li ul li { } #nav li ul li a { } #nav li ul li a:hover { } |
就需要根据主题的整体样式来决定了。
个人感觉,对于 Wordpress 主题制作者而言,这是个不错的解决2级导航菜单的方案,对于有一定 HTML 和 CSS 基础的朋友来说,也能很方便的对模板导航栏进行改造。
希望这个方法能给大家带来便利
zEUS.
- 原文链接:
- 转载原创文章请注明:

Name : zEUS.











貌似还没有看明白?
不错的东西,收藏了
好,很好,我有一个站上非常需要这个下拉菜单,之前找过很多,也试过小胖的那个方法,就是感觉不方便。这个看上去还不错,明天试试看。
收住慢慢哇!
好方法,支持zeus!赶快学习!
把single页的文章发布时间的h,m去了吧,都蹦出来了,影响美观哦!
收藏之,以后可能用得到。现在还没那么多的栏目呢!!
米TOO
学习了,呵呵,支持博主一个!
我还是用我的css导航 哈哈…
其实用 jQuery 解决的话非常容易实现,而且几乎是只要一点点代码,不过如果仅仅为了这一小处地方的话,引入 jQuery 框架又有些小题大作了。所以目前这个刚刚好。
这个方法看上去不错,的却方便多了。