jQuery Tabbed Interface / Tabbed Structure Menu Tutorial

Written by Kevin Liew on 19 Mar 2009
729,488 Views • Tutorials

Introduction

Nowadays, a lot of websites are using tab based content as a way to save spaces in a webpage. I have seen a lot of wordpress websites using a tabbed interface for its category, posts, comments and random posts content. It's a good "space-saver" and if used it correctly, it can boost your website usability as well. Right, first of all, we need to have the ideas and the design structure for this tabbed interface.

Before we start, if you are looking for a web hosting company, this is a good review - Hostgator Review.

My ideas:
  • Buttons on the top, content reside in different DIV elements,
  • Click on one of the buttons, it shows the relevant content;
  • Click on other buttons, it hides the existing and display the correct one.

The Design structure:

tab menu structure diagram

* Thanks to WeFunction.com for the amazing icons

Advertisement

2. HTML

In case the image above doesnt load, allow me to explain the design structure again. The UL#tabMenu is the buttons on the top a.k.a. Tabs. This is where you click, and it will trigger the jQuery to loads the content.

Inside the boxBody, you need to specify 5 DIVs, the number of DIV will depend on how many items you defined in #tabMenu, in this case, we have 5, therefre, you need 5 DIV elements defined in .boxBody.

The javascript loads the content based on the DIV's index in .boxBody. For example, if you clicked o the first button (the star or index 0), it will load the first DIV in the .boxBody (DIV index 0).

Therefore, arrangement of DIV in .boxBody must match with the arrangement of button in #tabMenu.

<div class="box">

  <ul id="tabMenu">
    <li class="posts selected"></li> <!-- default button-->
    <li class="comments"></li>
    <li class="category"></li>
    <li class="famous"></li>
    <li class="random"></li>
  </ul>

  <div class="boxTop"></div>

  <div class="boxBody">
  	<!-- default page-->
    <div id="posts" class="show parent">
      <ul>
        <li>Post 1</li>
        <li>Post 2</li>
        <li class="last">Post 3</li>
      </ul>  
    </div>  
  
    <div id="comments" class="parent">
      <ul>
        <li>Comment 1</li>
        <li>Comment 2</li>
        <li class="last">Comment 3</li>
      </ul>
    </div>
  
 	<div id="category" class="parent">
   	  <ul>
   	    <li>Category 1</li>
   	    <li>Category 2</li>
		<li class="last">Category 3</li>
   	  </ul>  
   	</div>
  
  	<div id="famous" class="parent">
      <ul>
        <li>Famous post 1</li>
    	<li>Famous post 2</li>
    	<li class="last">Famous post 3</li>
	  </ul>  
    </div>
  
	<div id="random" class="parent">
	  <ul>
        <li>Random post 1</li>
	    <li>Random post 2</li>
    	<li class="last">Random post 3</li>
   	  </ul>    
	</div>        

  </div>

  <div class="boxBottom"></div>

</div>

3. CSS

You can always modify it to match your website. I will attach the psd file for this tutorial in the download and edit the css carefully. : ). Any suggestions please comment.

<style>

a {
	color:#ccc;
	text-decoration:none;
}

a:hover {
	color:#ccc;
	text-decoration:none
}

#tabMenu {
	margin:0;
	padding:0 0 0 15px;
	list-style:none;
}

#tabMenu li {
	float:left;
	height:32px;
	width:39px;
	cursor:pointer;
	cursor:hand
}

/* this is the button images */
li.comments {background:url(images/tabComment.gif) no-repeat 0 -32px;}
li.posts {background:url(images/tabStar.gif) no-repeat 0 -32px;}
li.category {background:url(images/tabFolder.gif) no-repeat 0 -32px;}
li.famous {background:url(images/tabHeart.gif) no-repeat 0 -32px;}
li.random {background:url(images/tabRandom.gif) no-repeat 0 -32px;}

li.mouseover {background-position:0 0;}
li.mouseout {background-position:0 -32px;}
li.selected {background-position:0 0;}

.box {
	width:227px
}

.boxTop {
	background:url(images/boxTop.gif)no-repeat;
	height:11px;
	clear:both
}

.boxBody {
	background-color:#282828;
}

.boxBottom {
	background:url(images/boxBottom.gif) no-repeat;
	height:11px;
}

.boxBody div.parent {
	display:none;
}

.boxBody div.show {
	display:block;
}


.boxBody #category a {
	display:block
}

/* styling for the content*/
.boxBody div ul {
	margin:0 10px 0 25px;
	padding:0;
	width:190px;
	list-style-image:url(images/arrow.gif)
}

.boxBody div li {
	border-bottom:1px dotted #8e8e8e; 
	padding:4px 0;
	cursor:hand;
	cursor:pointer
}

.boxBody div ul li.last {
	border-bottom:none
}

.boxBody div li span {
	font-size:8px;
	font-style:italic; 
	color:#888;
}

/* IE Hacks */
*html .boxTop {margin-bottom:-2px;}
*html .boxBody div ul {margin-left:10px;padding-left:15px;}

</style>

 

4. Javascript

Alright, the fun part. It took me a while to read the jQuery documentation to make it works the way I want. And yes, I made it. As usual, I have put comments on each line. I put the animate effect on category page. I have a tutorial about it - Navigation List menu + Jquery Animate Effect Tutorial

$(document).ready(function() {	

  //Get all the LI from the #tabMenu UL
  $('#tabMenu li').click(function(){
    
    //perform the actions when it's not selected
    if (!$(this).hasClass('selected')) {    
           
	    //remove the selected class from all LI    
	    $('#tabMenu li').removeClass('selected');
	    
	    //Reassign the LI
	    $(this).addClass('selected');
	    
	    //Hide all the DIV in .boxBody
	    $('.boxBody div.parent').slideUp('1500');
	    
	    //Look for the right DIV in boxBody according to the Navigation UL index, therefore, the arrangement is very important.
	    $('.boxBody div.parent:eq(' + $('#tabMenu > li').index(this) + ')').slideDown('1500');
	    
	 }
  }).mouseover(function() {

    //Add and remove class, Personally I dont think this is the right way to do it, 
    //if you have better ideas to toggle it, please comment    
    $(this).addClass('mouseover');
    $(this).removeClass('mouseout');   
    
  }).mouseout(function() { 
    
    //Add and remove class
    $(this).addClass('mouseout');
    $(this).removeClass('mouseover');    
    
  });

  
  //Mouseover with animate Effect for Category menu list  :)
  $('.boxBody #category li').mouseover(function() {

    //Change background color and animate the padding
    $(this).css('backgroundColor','#888');
    $(this).children().animate({paddingLeft:"20px"}, {queue:false, duration:300});
  }).mouseout(function() {
    
    //Change background color and animate the padding
    $(this).css('backgroundColor','');
    $(this).children().animate({paddingLeft:"0"}, {queue:false, duration:300});
  });  
	
  //Mouseover effect for Posts, Comments, Famous Posts and Random Posts menu list.
  $('.boxBody li').click(function(){
    window.location = $(this).find("a").attr("href");
  }).mouseover(function() {
    $(this).css('backgroundColor','#888');
  }).mouseout(function() {
    $(this).css('backgroundColor','');
  });  	
	
});

5. Finally

You will get a beautiful jQuery Tabbed Side Menu!

However, in category page, if you were using IE, the LI can't be hightlighted when mouse hover it in (that's why we all hate IE). If you know what's the problem, please advise : )

Last but not least, check out the demo or download the source code to play with it. Any questions. please leave your comment :)

Support me by bookmark this article and share it to your friends : ) Thanks

Update

15-9-2011: Fixed DIV issue.

14-4-2009: Remove click event in the LI, change the display attribute in #category to block.

Demo Download
Join the discussion

Comments will be moderated and rel="nofollow" will be added to all links. You can wrap your coding with [code][/code] to make use of built-in syntax highlighter.

183 comments
joey 16 years ago
New to Jquery how can I make it work in reverse. So the div come down instead of up. I tried to change the code but broke it badly !! Thanks in advance
Reply
KC Hunter 16 years ago
Tabbed browsing is a great way to get a lot of content on one page without it being messy.
Reply
Kyle 16 years ago
@kevin, @ambrosia, & @brian:

Have any of you found a way to include divs inside the panels besides using blocked spans?

This would be ideal for me...

Thanks,
~Kyle~
Reply
kevin Admin 16 years ago
Hi kyle,

yea, I saw a mistake I made, I make all the div display:hidden... hmm, there are two solution at the moment,

1. use span, and make it display:block
2. use div, but add class to it and make it display:block as well. mark it as important.

i think that should able to help u.
Reply
Zilus 16 years ago
Hey, great stuff!! I have a Question.
Is it possible to use this script and make de calls from a different div. e.x.

<div id=\"menu\">...some links...</div>
...blha blah blah...
<div id=\"box\">Here are the tabs</div>
Reply
Kyle 16 years ago
@Kevin-

Thanks for the response. I went with the span - seems to work fine.

Now my issue is getting FF on PC\'s to stop being so jittery when showing an embedded chat box. Let me know if you have any ideas for this: http://sandbox.library.elmhurst.edu/

Thanks,
~Kyle~
Reply
Иво Делин 16 years ago
Hello from Bulgaria.

I like a lot this script and the simplicity of it.

I\\\'m a html and css developer and I have some suggestion for it.

You use java script for mouseover in mouseout function for tab visualization (and that is only for IE6 and lower versions). That add many needless code there.

css:
tabMenu li:hover { ... } //that shall work in all browsers newer than IE6

To remove this problem you can use:
HTML:
<ul id=\\\"tabMenu\\\">
<li class=\\\"posts selected\\\"><a href=\\\"#\\\"></a></li>
<li class=\\\"comments\\\"><a href=\\\"#\\\"></a></li>
<li class=\\\"category\\\"><a href=\\\"#\\\"></a></li>
<li class=\\\"famous\\\"><a href=\\\"#\\\"></a></li>
<li class=\\\"random\\\"><a href=\\\"#\\\"></a></li>
</ul>

CSS:
tabMenu li a:hover { ... } - and that will work

In this case you can use this script also for words not only for icons tab menu.
Reply
abant 16 years ago
Thanks alot looking for this for a long time great stuff
Reply
Thomas 16 years ago
another great tut :)
Reply
Guz 16 years ago
It\'s cute, but has serious problems if you put a form inside it
Reply
Leo Berdu 16 years ago
Tha same thing :)

<script type=\"text/javascript\">
$(document).ready(function(){

$(\'ul#tabmenu li\').live(\'click\', function(){
var name = $(this).attr(\'class\').split(\' \')[0];
$(\'.tabcontent > div\').slideUp(300);
$(\'ul#tabmenu li\').removeClass(\'selected\');
$(\'.tabcontent > div#\' + name).slideDown(300);
$(\'ul#tabmenu li.\'+name).addClass(\'selected\');
});

$(\'.tabcontent > div\').hide();
$(\'ul#tabmenu li:first-child\').trigger(\'click\');

});
</script>
Reply
drizzy 16 years ago
Great stuff...This is what I did with the tutorial so far

The only issue I'm having is;
When I use the <ul><li></li></ul> code it makes it into a hyperlink that goes to a undefined page. I don't mind that when I hover over them it changes colour, but I just want the linking to go away.

How do I go about getting rid of this hyperlink when I hover over <li> elements?
Reply
kevin Admin 16 years ago
i guess this is the reason, its in the .boxBody li click event:

window.location = $(this).find("a").attr("href");

try to remove that line, i think it should work.
Reply