Displaying WordPress categories in a horizontal dropdown menu.
Posted on Wednesday the 16th of January, 2008 at 2:05 pm in Asides, WordPressOne of my readers recently asked how I created my horizontal menu bar: the short answer is by mixing CSS and Javascript.
The first step is to get WordPress to display the menu as a hierarchical list without a title. <?php wp_list_categories('sort_column=name&sort_order=asc&style=list&children=true&hierarchical=true&title_li=0'); ?>
We then wrap this WordPress code in the following so we can style it.
<div style="text-align:center;"><ul id="menu" style="padding:0; margin:0;"><?php wp_list_categories('sort_column=name&sort_order=asc&style=list&children=true&hierarchical=true&title_li=0'); ?></ul></div>
I added this to my header.php, but you can add it anywhere you want it to appear.
The CSS is fairly simple and you just need to add it to your theme’s style.css file.
ul#menu {margin: 0;padding: 0;list-style: none;width: 100%;font-size:1.2em;}ul#menu li {float: left;padding: 0;margin: 0;border-right:solid 1px #fff;}ul#menu ul li {float: none;position: relative;border-bottom: 1px solid #7EAED7; /* fixes gap problem in IE */border-left: 1px solid #FFF;z-index:1000;}ul#menu li ul {margin: 0;padding: 0;display:none;list-style: none;position: absolute;background: #9CC;}ul#menu ul ul{margin-left: .2em;position: absolute;top: 0; /* if using borders, -1px to align top borders */left: 100%;}ul#menu * a:hover, ul#menu li a:active{background:#7EAED7 !important;color: #FFFFFF;}ul#menu li a:link,ul#menu li a:visited,ul#menu li a:hover,ul#menu li a:active{display: block;padding: .2em .3em;text-decoration: none;background: #5587B3;color: #FFFFFF;}ul#menu ul li a:link,ul#menu ul li a:visited,ul#menu ul li a:hover,ul#menu ul li a:active {width: 8em;}- Use the following to copy and paste the code.
Of course you will need to change the colors and text sizes to ensure it blends with the rest of the theme.
Now the last step is the to make it work as a drop-down list on all browsers. This could be done in Firefox with a simple CSS declaration, but Internet Explorer doesn’t understand the :hover pseudo classes, so we mimic this in Javascript.
<script type="text/javascript">/*<![CDATA[*/var mbA,mbT,mbTf,mbSf;var mbR = [];function mbSet(m) {if (document.getElementById&&document.createElement) {var m=document.getElementById(m);mbR[mbR.length] = m;var i;e=m.getElementsByTagName('a');if (!mbTf) mbTf=new Function('mbHT();');if (!mbSf) mbSf=new Function('mbS(this);');for (i=0;i<e.length;i++) {e[i].onmouseout=e[i].onblur=mbTf;e[i].onmouseover=e[i].onfocus=mbSf;}m=m.getElementsByTagName('ul');for (i=0;i<m.length;i++) {mbH(mbL(m[i]));}}}function mbHA() {if (mbA) {while (mbA) mbH(mbA);mbHE('block');}}function mbHT() {if (!mbT) mbT=setTimeout('mbHA();', 0);}function mbTC() {if (mbT) {clearTimeout(mbT);mbT=null;}}function mbS(m) {mbTC();if (mbA) while (mbA&&m!=mbA&&mbP(m)!=mbA) mbH(mbA);else mbHE('none');if (mbM(m)) {mbSH(m,'block');mbA=m;}}function mbH(m) {if (m==mbA) mbA=mbP(m);mbSH(m,'none');mbT=null;}function mbL(m) {while (m && m.tagName != 'A') m = m.previousSibling;return m;}function mbM(l) {while (l && l.tagName != 'UL') l = l.nextSibling;return l;}function mbP(m) {var p = m.parentNode.parentNode;if (p.tagName == 'UL') {var i = 0;while (i <mbR.length) {if (mbR[i] == p) return null;i++;}} else {return null;}return mbL(p);}function mbSH(m,v) {m.className=v;mbM(m).style.display=v;}function mbHE(v) {mbHEV(v,document.getElementsByTagName('select'));}function mbHEV(v,e) {for (var i=0;i<e.length;i++) e[i].style.display=v;}/*]]>*/</script>- Use the following to copy and paste the code.
A couple notes on the previous code.
- To activate it, change your theme’s <body> tag to <body onload=”mbSet(‘menu’);>
- It was not written by me, but I’ve been using it for a long time and don’t remember where I got it.
- It can occasionally create a JavaScript error, and I’ve intended to rewrite it for a long time, but it usually works fine.


Please I just don’t understand where in the wordpress files should I put the javascript that enables I.E to read the roll over..
Do I make a file apart or should I insert it in the index.php or something ?
Thanks for your reply
Reply to CecileCecile
You insert into your header.php file before </head>.
Reply to AaronYou should have stated that in your article. Reading through ALL comments is a big fuss.
Reply to AdibHi Aaron!
great work
can I use this method also to create a hor. menu of my pages???
What should I change in the codes?
thanks, Fre
Reply to freriekeIf you want to use this method with pages, you should be able to basically change wp_list_categories to wp_list_pages.
Reply to AaronI love the dropdown menu, however, it seems like the subcategories like to magically disappear when moused over. This happens on both my website and yours. Any suggestions to prevent this behavior? It almost seems like the problem is less apparent when using a smaller browser window, but that might not be the case. It does this both in Firefox and Safari (haven’t tested IE yet), and it is present in both though it doesn’t seem to happen as much in Safari.
Also, just want to clear up where you mention changing the tag; it is missing a quote after the ending parenthesis which breaks the function. As a warning to others, if you copy and paste it, be sure to replace the weird angled single-quote things with a standard single quote. I missed this and it took me forever to catch (fortunately Firefox’s error console pointed it out).
Reply to DylanTHANK YOU! I just spent 20 minutes trying to figure out what was wrong. Everything worked fine except the drop downs.
In case anyone isn’t clear how to fix it, add a double quote to the end after the last parenthesis, retype the first double quote so it’s correctly formatted and retype the single quotes around menu.
Reply to caseyAny chance you’ve gotten feedback on this? This is a great use of wp with dropdowns, but I too have noticed slightly erratic mouseover behavior on the menus– Safari, Firefox 3 on Mac, IE 6 on Windows XP.
Thanks, though, Aaron, for the great dev! Great use of menus, and something I’ve been needing for a while.
Reply to Johncheers for this – just have to go in and mess about with it all. As my JavaScript skills are basically rubbish you’ve saved me laods of time.
Reply to MichaelThis is what I was looking for. I’ve tried it on my localhost and it works well. Thanks
Reply to ColeThanks for the code but I do have a question.
You said the following:
To activate it, change your themeâ??s tag to
Where do we exactly go to change the tage to ??
Reply to davidI implemented it but the dropdown thing is not working.Can someone advice me on what is wrong. my site is http://www.reviewmirchi.com
Reply to Dheeraj SInghIt doesn’t look like you changed the body tag as mentioned in the original post.
See the section at the end of the last bit of code in the post.
See my other comment about how to correct the code.
Reply to caseycan you make a plugin for wp? thx..
Reply to dizangor where can i find a plugin.
I just installed this but the drop down menus aren’t showing. Just the “top” categories. Any advice? thanks
diysrc.com
Reply to AdamThe drop-down menu may not work, because of the gap is not closed. Change tag to the following (as you see, with the closed gap):
body onload=â?mbSet(â??menuâ??)”;
and script will finally start working. Hurrey! )))
Reply to valenkiWhy not just use Suckerfish (an 11-line Javascript) instead of your 100-line script? It doesn’t throw errors and simply works, without extra markup and “classitis.”
Reply to CodeKillerMy code works on (theoretically) infinate levels of menus. The suckerfish requires a lot of work to get multiple levels as you can see inthis post.
Each level has to be styled individually by hand which makes it close to worthless in a dynamic setting such as blog categories.
If you need one level of dropdowns, then by all means, use suckerfish, but I found it didn’t work for what I needed it to do.
Reply to AaronIf I use this in my sidebar, how would I edit it so that the menus appear to the right of the category, instead of underneath it?
Reply to SamHey, thanks a lot Aaron! This just spicened things up back at my blog. Even though I needed to edit a few codes to match my template and for it to be correctly placed, everything was worth it.
Well done (for sharing this one).
Reply to Kix the GeekIt seems the subcategories like to magically disappear when moused over. This happens on both my website and yours. Any suggestions to prevent this behavior? It almost seems like the problem is less apparent when using a smaller browser window, but that might not be the case. It does this both in Firefox and Safari (havenâ??t tested IE yet), and it is present in both though it doesnâ??t seem to happen as much in Safari.
Can you suggest a solution to this?
Reply to PaulPaul » Right at the “seams” between links the effect can fail. The easiest way to fix it is to make sure they overlap a little bit in the CSS.
Reply to Aarona fast solution is
Reply to Tasosul#menu li {
float: left;
padding: 0;
margin: -.1em; *************it loses the borders but it works a bit better*******
border-right:solid 1px #fff;
}
I tried everything and even with the correction on body tag and the sub-categories do not appear. Only the Main-category appears.
http://www.fast-games.net
Reply to HenriqueI have installed this code and it all works GREAT! (To my surprise I did it right the first time!) I too noticed the problem with mousing over the sub-menu items. I applied the suggested fix and it does work better, but everything is crammed together. How can the code be modified to pad each entry with some spaces (3 maybe) to allow for some separation between the menu items? I think this would fix the problem (at least the look) of everything being so close together.
Reply to DavidI am trying to make a list in my sidebar of Categories with a sub list of the posts in that category… somewhat like this:
<a href="category_url" rel="nofollow">CATEGORY</a><a href="post_url" rel="nofollow">POST</a>Obviously I would like this to loop until it has played out all categories and posts within them.
I am looking for tha code to make this happen in the same list format as I have custom styled menu tool in which i would like this code snippet to play out… so i need to di this WITHOUT A PLUGIN.
Would really appreaciate any help!!
Reply to Gadziradidnt work on my site
Reply to kevinsuckerfish is ok but not the greatest
Didnt worked on mine too
Reply to Adam WinogrodzkiIn the bottom of article, there is written 3 steps to activate it. In first step there is one thing missing. right after body onload=â?mbSet(â??menuâ??); there is a need of “. So it must look something like body onload=â?mbSet(â??menuâ??);” to work
Reply to PovilasHi,
I am just starting to build a site with wordpress and I would very much like to have a dropdown menu. However, it is not clear to me where to put the last javascript code you gave in this page; and if you look at my site the menu is stretching out from the side. How to position that? I have no any experience with php only html.
Thanks in advance for your help.
Reply to NitaiIt doesn’t work for me. I’ve tried to copy the source code of your site too but the categories just don’t drop down…
Reply to Juliani must be an idiot coz i couldn’t get it to work. probably too much of a n00b
Reply to JustinHello.
Thanks, for your script.
But how can I force it to work with IE6.
Thanks
Reply to RomanI have categories and subcategories and i want subcat. to be displayed as drop down list with mouseover on parent category. Any help please..
Reply to Harpreet KheraI want to try it too. thanks for sharing
Reply to harryNice tip to display my column in Column Thanks
Reply to tech2connectSimply amazing. Thank you very much!
Reply to WPExplorerThank you! This works beautifully. I was about to tell my client, “Nope, not possible”…
Reply to NicoleGuys, for anyone that drop down not show up,maybe becau no post in your sub cat. try add this hide_empty=0
wp_list_categories(‘sort_column=name&sort_order=asc&style=list&children=true&hierarchical=true&title_li=0&hide_empty=0′);
Reply to Interior Decorating SchoolsHello, I’m using a code similar to yours. It works great but I have one thing I want to change and I can’t seem to find out how. I want to drop the uncategorized link in the Navbar. Everything else is great.
Thank you for your help if you can or are willing, and at least thank you for your time.
Reply to MontesquieuI follow your step, and it work fine but, when i try to click my Categories list it’s lost..
Reply to andyrioand i Q how to make separate Categories and work like pages. im new with wp
Maybe you should edit the webpage title Displaying WordPress categories in a horizontal dropdown menu. to more suited for your webpage you write. I liked the blog post even sononetheless.
Reply to Team RosterForget it, I worked on this for such a long time but all I see is an ugly blue button for one of my categories, nothing else. I’m not going to go through all those comments above anymore because you should have re-edited your article instead of expecting readers to go through a pile of comments to understand whatever you meant. I’ll have to search for something more simpler perhaps. Thanks anyway.
Reply to AdibThanks just what I was looking for.
Reply to Baby TunesGreat tutorial … Very easy to follow … Good Job … Thanks — Kathleen
Reply to Philippines Virtual AssistantDear,
I followed the exactly as your tutorials but I could not get it work.
Please kindly advise me.
Thanks
Reply to du hoc myWordPress has turned into a hobby for me and I just try to help friends whenever I can. accesorioscelularpr is a site I’m trying to build for my son. My main problem is that I like to make things on my own after I learn how to make them.
Everything went well until I hit the Menu. I must confess that I then decided to pirate some code. Nothing made sense until I hit this page. Congratulations on a job well done!
If I may, I would like to request your guidance. If you visit accesorioscelularpr, you will notice that the “Covers” menu drops behind my content. Any idea how I can overcome this? Thanks!
Reply to cangrejeroSolved my problem by using z-index. Thanks, anyway!
Reply to cangrejeroA funny thing is happening with the menu created following this tutorial and the installation of the widget vertical-scroll-image-slideshow-gallery. When the widget is installed in the sidebar, the child menus do not work. Remove it and the child menus work as advertised. Any ideas? Thanks!
Reply to cangrejeroGreat post. You seem to have a good understanding that how to create a professional drop down menu. When I entering your blog, I felt this. I’m also interested in it!
Reply to lucky_girlWe’re a group of volunteers and starting a new scheme in our community. Your web site provided us with valuable information to work on. You’ve done an impressive job and our whole community will be thankful to you.
Reply to Best New Jersey Wedding PhotographersExcellent tips. Through this comment I just wanted to thank you for your tips. I’ve just implemented how to create menu from category on my blog at Linux Guide and Blog Tips for Beginners. I applied your tips are very easy and no problems. Thanks again.
Reply to Computer Guidehi,
please help me.
how rename or add (dropdown menu) to style file.
Difference : “.sf-menu AND #cat-nav- ”
default file:
.sf-menu li:hover ul, .sf-menu li.sfHover ul { top: 2.5em; z-index: 400; }
ul.sf-menu li:hover li ul, ul.sf-menu li.sfHover li ul { top: -999em; z-index: 400; }
ul.sf-menu li li:hover ul, ul.sf-menu li li.sfHover ul { top: 0; }
ul.sf-menu li li:hover li ul, ul.sf-menu li li.sfHover li ul { top: -999em; }
ul.sf-menu li li li:hover ul, ul.sf-menu li li li.sfHover ul { top: 0; }
.sf-menu { position: relative; margin: 0; padding: 0; list-style: none;clear:both; float: left; margin-top: 12px; padding-left: 9px; margin-bottom: 1em; background: url(‘images/menu_bg.png’) no-repeat; height: 58px; width: 957px; z-index: 400; }
.sf-menu ul { position: absolute; top: -999em; margin-top: 20px; width: 212px; right: 7px; -moz-box-shadow: 3px 6px 8px 1px rgba(0, 0, 0, 0.3); -webkit-box-shadow: 3px 6px 8px 1px rgba(0, 0, 0, 0.3); background-image: url(‘images/dropdown_top.png’); background-repeat: no-repeat; background-position: top; padding-top: 8px; z-index: 400; }
.sf-menu a { display: block; position: relative; text-decoration:none; color: #fff; padding: 23px 20px 0px 20px; height: 30px; text-decoration: none; text-shadow: 1px 1px 1px #000; font-weight: normal; float :right; }
.sf-menu li { float: right; position: relative; font-family: Tahoma; background: url(‘images/menu_line.png’) no-repeat; background-position: left 5px; }
.sf-menu li ul li ul { right: 212px; margin-top: 0px;}
.sf-menu li li { background: #ebebeb url(‘images/submenu_li.gif’) no-repeat; background-position: 24px 15px; height: 36px ; margin: 0px; float: right; width: 212px; z-index: 10; }
.sf-menu li a:hover { color: #00b4ff; }
.sf-menu li:hover, .sf-menu a:focus, .sf-menu a:hover, .sf-menu a:active { background: #121212; outline: 0; }
.sf-menu > li.sfHover.sf-ul { background: transparent url(‘images/parent_link_left.png’) no-repeat; background-position: 7px 11px; z-index: 200; }
.sf-menu li.sfHover li a:hover, .sf-menu li ul li.sfHover a, .sf-menu li ul li ul li.sfHover a { background: #f7f7f7 url(‘images/submenu_li_hover.gif’) no-repeat; background-position: 11px 0px; }
.sf-menu li.sfHover li a, .sf-menu li.sfHover li ul li a, .sf-menu li.sfHover li ul li ul li a { background: url(‘images/submenu_li_hover.gif’) no-repeat ; background-position: -100px -100px; width: 172px; color: #404040; margin: 0px; padding: 14px 0px 0px 40px; text-shadow: 0px 1px 0px #cccccc; }
.sf-menu > li.sfHover.sf-ul > a { color: #000; text-shadow: 1px 1px 1px #fff; background: transparent url(‘images/parent_link_right.png’) no-repeat; background-position: right 11px; z-index: 301; }
ul.sf-menu li.backLava { position: absolute; z-index: 3; background: url(‘images/lavalamp.png’) no-repeat; background-position: center 0px; padding: 0; height: 16px; margin-top: 42px; }
——————–
*
*
*
*
*
*
*
*
new code (DROPDOWN MENU):
————————————————————-
#cat-nav { bottom:-14px; left:0; position:absolute; width:980px; z-index:100; }
#cat-nav-left {background: url(images/n-2/cat-nav-left.png) no-repeat; width: 10px; height: 64px; float: left;}
#cat-nav-content { background: url(images/n-2/cat-nav-content.png) repeat-x; float: left; height: 64px; width: 941px; }
.nav li ul {box-shadow: 3px 6px 7px 1px rgba(0, 0, 0, 0.5); -moz-box-shadow:3px 6px 7px 1px rgba(0, 0, 0, 0.5); -webkit-box-shadow: 3px 6px 7px 1px rgba(0, 0, 0, 0.5); background: url(images/n-2/cat_menu_bg.png) repeat-y; border: 1px solid #111010; -moz-border-radius: 8px; -webkit-border-radius: 8px; -moz-border-radius-topright: 0px; -webkit-border-top-left-radius: 0px; border-top: none; padding-bottom: 15px; }
#cat-nav-content ul.nav { float: right; margin-top: 10px; margin-left:18px; }
#cat-nav-content ul.nav li { padding:0 17px 0 0; }
#cat-nav-content ul.nav li a { padding: 8px 4px 21px; }
#cat-nav-content ul.nav li.sf-ul a { padding: 8px 6px 21px 15px; }
#cat-nav-content ul.nav > li.sf-ul { background: url(images/n-2/li-hover.png) no-repeat 55px right; }
#cat-nav-content ul.nav > li.sf-ul > a { background: url(images/n-2/a-hover.png) no-repeat 55px left; }
#cat-nav-content ul.nav > li.sf-ul.sfHover { background: url(images/n-2/li-hover.png) no-repeat top right; }
#cat-nav-content ul.nav > li.sf-ul.sfHover > a { background: url(images/n-2/a-hover.png) no-repeat top left; display: block; }
#cat-nav-content ul.nav li li { padding: 0px; }
#cat-nav-content ul.nav ul ul { border-top: 1px solid #111010; -moz-border-radius-topleft: 8px; -webkit-border-top-left-radius: 8px; }
#cat-nav-content ul.nav li li a:hover { color: #00b7f3; }
#cat-nav-content ul.nav li a {color: #fefefe; font-weight: bold; text-decoration: none; text-shadow: -1px -1px 1px #0a0a0a; text-align:right; }
#cat-nav-content ul.nav ul li a { text-shadow: 1px 1px 1px #0a0a0a; }
#cat-nav-content ul.nav > li > a:hover { }
#cat-nav-content ul.nav li li {background: url(images/n-2/bullet.png) no-repeat 16px 21px; float:right; }
#page-menu ul.nav li li { background:url(“images/n-2/page-menu-bullet.png”) no-repeat scroll 16px 16px transparent; }
#page-menu ul.nav li a { padding: 8px 9px 16px; }
#page-menu ul.nav > li > a.sf-with-ul:hover, #page-menu ul.nav > li.sfHover > a { background-color: #232323; }
#page-menu ul.nav li li a { text-shadow: none; }
#page-menu .nav li:hover ul, #page-menu ul.nav li.sfHover ul { left:0px; top:45px; }
#page-menu .nav ul li:hover ul, #page-menu ul.nav ul li.sfHover ul { left:191px; top:-2px; }
#cat-nav-content ul.nav li li a, #page-menu ul.nav li li a {background: url(images/n-2/n-2/divider.png) no-repeat bottom left; display: block; width: 156px; padding: 9px 5px 11px 28px !important; }
#page-menu ul.nav li li a { background: none; padding: 0px 5px 0px 28px !important; }
#cat-nav-right { background: url(images/n-2/n-2/cat-nav-right.png) no-repeat; width: 19px; height: 64px; float: left;}
#cat-nav #search-form { float: left; width: 131px; background: url(images/n-2/n-2/search.png) no-repeat; height: 27px; margin-top: 15px;}
#cat-nav #searchinput { background: none; border: none; font-style: none; color: #646464; padding-left: 12px; display: block; margin-top: 3px; float: left; width: 95px; }
#cat-nav #searchsubmit { float:left; margin-top:7px; }
#cat-nav #search-form img {float: right; margin-top: -24px; padding-right:10px;}
#page-menu ul.nav ul { z-index: 10000; padding-bottom: 9px; background: #232323; border: 0px; padding-top: 2px; }
#page-menu ul.nav ul ul { -moz-border-radius-topleft: 8px; -webkit-border-top-left-radius: 8px; }
————
Tanks
Reply to arazFantastic profession baby boomer. I enjoy it again. may very well comparable much too, investigate your online site, i just primed a short review with my online site.
Reply to birthday glitter pictureshi guys. my programming skills are very low. the mother of our programmer has been died and he is not able to work. i want to take help from you guys that kindly guide me that where to put these codes. kindly tell me the exact locations so that i get a drop down menu. i tried once but i get a horizontal categories under page but when i pass the mouse cursor on those categories sub categorizes don’t drop down. kindly help me.
Reply to markI want to follow up and help you to know how, a good deal I liked acquiring your web blog today. Iâd personally contemplate it a honor to run at my company and then utilize tips shared against your web site and also become involved in visitorsâ remarks something like this. Should a position related to guest writer become to be had at your stop, i highly recommend you well then, i’ll know.
Reply to hotellebeachGreat post. I was checking constantly this blog and I’m impressed! Extremely useful information specifically the last part
I care for such info a lot. I was looking for this certain info for a long time. Thank you and best of luck.
Reply to Warrior MacrosLove the site but I don`t see where to receive to your newsletter.
Reply to cooking games for girlsi liked it and you can see on : http://digitalmarketingstep.com/ i have taken the same steps
Reply to Melroywell, luckily i found your post, the first time i know this possible is when i was using a wp theme name “engamer”, i’m digging for it everywhere but in vain for i dont know the keyword to search. i should try immediately. thanks Aaron!
Reply to y8The javascript seems a bit convoluted, but it does work, which is most important, though I’ll still be on the look out for a more efficient solution.
Reply to Jackfirst of all I would like to thanks for this very informative tutorial.. is this working good in ie6? and can i use the code into my premium theme?
Reply to Joseph Buaraofirst of all I would like to thanks for this very informative tutorial.. is this working good in ie6? and can i use the code into my premium theme?
Reply to Joseph Buarao