jQuery Sliding Tab Menu for Sidebar Tutorial

Written by Kevin Liew on 09 Jun 2009
137,429 Views • Tutorials

Introduction

This tutorial, we will be making a jQuery Sliding Tab Menu for sidebar. Previously, I made a tutorial about jQuery Tabbed Interface / Tabbed Structure Menu, if you have not read it yet, check it out. I'm using it for my sidebar at the moment. The differences between both tab menus are, the sliding direction and this time, we are using a little bit different HTML structure and massive change in jQuery script.

We will be using a famous plugin called jQuery.scrollTo. jQuery scrollTo is an amazing plugin and doing sliding menu has never been so easy! Please continue reading, As usual, this tutorial is separated into 3 sections: HTML, CSS and Javascript.

1. HTML

Structure for jQuery Scroll To Tab Menu

Refer to the image above, it's the DIV structure for this tutorial.

#scroller-header: Inside #scroller-header, this is where we will put the links. In the link HREF attribute, we will put in the id of the sub panels (#panel-1, #panel-2, #panel-3 and #panel-4) inside #panel. jQuery will able to scroll it to the correct position according to the ID specified in the HREF.

#scroller-body: We put a background image about 900px height and set the background position to bottom.

#mask: This DIV plays an important role to hide other panels. Adjusting the height and width of #mask will able to display the panel content. Everytime when a link is clicked, jQuery will get the height of the sub-panel and set the height of #mask accordingly.

#panel: Inside #panel, we have 4 DIVs named #panel-1, #panel-2, #panel3, #panel-4. Those are sub-panels, you can place your content inside here, and feel free to add more sub panels.

<div id="scroller-header">
	<a href="#panel-1" rel="panel" class="selected">Link 1</a>
	<a href="#panel-2" rel="panel">Link 2</a>
	<a href="#panel-3" rel="panel">Link 3</a>
	<a href="#panel-4" rel="panel">Link 4</a>
</div>
<div id="scroller-body">
	<div id="mask">
		<div id="panel">
			<div id="panel-1">
				......
			</div>
			<div id="panel-2">
				......
			</div>
			<div id="panel-3">
				......
			</div>
			<div id="panel-4">
				.......
			</div>	
		</div>
	</div>
</div>

2. CSS

Structure for jQuery Scroll To Tab Menu

There are some important css:

#scoller-header, #scroller-body : We can change the background images in these ID. For the #scroller-body, the vertical alignment of the background must be bottom.

#mask : Width is the size of a sub-panel, this width must be specified because we will do some calculation based on it.

#panel div : Float set the left so that the DIV will display in a single row. If you want to scroll it horizontally, you can remove it.

body {
	padding:0;
	margin:0 20px;
	background:#d2e0e5;
	font:12px arial;
}

#scroller-header a {
	text-decoration:none; 
	color:#867863; 
	padding:0 2px;
}

#scroller-header a:hover {
	text-decoration:none; 
	color:#4b412f
}

a.selected {
	text-decoration:underline !important; 
	color:#4b412f !important;
}

#scroller-header {
	background:url(images/header.gif) no-repeat;
	width:277px;
	height:24px;
	padding:35px 0 0 15px;
	font-weight:700;
}

#scroller-body {
	background:url(images/body.gif) no-repeat bottom center;
	width:277px;
	padding-bottom:30px;

}

#mask {
	width:250px;
	overflow:hidden;
	margin:0 auto;
}

#panel {

}

#panel div {
float:left;

}


/* extra optional styling for each tab content */
#panel-1 {
}

#panel-2 {
}

#panel-3 {
}

3. Javascript

With the scrollTo plugin, we don't have to worry about the transition and scrolling effect. This is the advantage of using plugin, everything can be so easy.

Basically, jQuery performs the following steps on page load:

  1. Get the height of the first sub-panel and set it to #mask.
  2. Calculate the width of #panel by multiplying #mask width with total of sub-panel (#panel div)
  3. Set the width of sub-panel according to the #mask width. As a result, #mask width must be the same with sub-panels and must be specified in the CSS.

And, jQuery performs the following steps when a link is clicked:

  1. Get the height of the sub-panel. jQuery grabs the sub-panel id from href attribute of the anchor element.
  2. Remove selected class from all the links, and add the selected class to the user has just clicked.
  3. Do the animation on height, Animate the #mask by setting the height of the sub-panel.
  4. After that, run the scrollTo plugin, scroll it to the sub-panel.
  5. Remember to disable the link default behavior by adding 'Return false' in the end.
$(document).ready(function() {	

	//Get the height of the first item
	$('#mask').css({'height':$('#panel-1').height()});	
	
	//Calculate the total width - sum of all sub-panels width
	//Width is generated according to the width of #mask * total of sub-panels
	$('#panel').width(parseInt($('#mask').width() * $('#panel div').length));
	
	//Set the sub-panel width according to the #mask width (width of #mask and sub-panel must be same)
	$('#panel div').width($('#mask').width());
	
	//Get all the links with rel as panel
	$('a[rel=panel]').click(function () {
	
		//Get the height of the sub-panel
		var panelheight = $($(this).attr('href')).height();
		
		//Set class for the selected item
		$('a[rel=panel]').removeClass('selected');
		$(this).addClass('selected');
		
		//Resize the height
		$('#mask').animate({'height':panelheight},{queue:false, duration:500});			
		
		//Scroll to the correct panel, the panel id is grabbed from the href attribute of the anchor
		$('#mask').scrollTo($(this).attr('href'), 800);		
		
		//Discard the link default behavior
		return false;
	});
	
});

Conclusion

That's it. Make sure you check out the demo and download the source code to play with it. If you have created your own, feel free to drop your link in the comment section to show off! : )

Last but not least, I need your support :) If you like this article, please help me to promote it by adding this post into your bookmark. Or you can subscribe to my RSS for more jQuery tutorial posts! Thanks!

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.

89 comments
psd to xhtml 11 years ago
many thanks for sharing this article. It is very use full designers.
Reply
ed parton 11 years ago
Wonderful set of scripts! Thanks for your help.

How do you add a menu item? 4 items is not enough, but when I add a panel-5 I get the panel-5 on a second line. But it jumps around when you select the other menu items.????
Reply
aqsa 11 years ago
Hi

this is really great and very very help many things we can show in a slide. am also looking sliding tabs with content that\'s also awesome and useful.

many many thanks for sharing n keep it up .
Aqsa
Reply
Mikkel 11 years ago
Hi guys, I know this is a noobie question but how do i make the content to to link to a site in the same window? I tried <a href=, but i cant get it to work ? Any ideas ? thanks alot ;)
Reply
sid 11 years ago
Hi
It is nice work, i would like to increase 1 more tab, any one has a clue, i mean this work has left and right and i want left middle and right.

Thanks
Reply
richard 11 years ago
amazing tutorial, Thanks For assistance
Reply
masini 10 years ago
The information is very good. Are hard to implement. But if you succeed you are satisfied.
Reply
Avangelist 10 years ago
Really great, but I got a few queries.

I forgot a few basic CSS float fundamentals at first.

Panels must have a defined width to start with in order to float in a fixed-width space.

Factor any panel padding into your overall width for both the panels container and the mask.

Do the same for margin.
Reply
Pariuri Sportive 10 years ago
Well worth the read. Thanks for sharing this information. I got a chance to know about this.
Reply
AndyD 10 years ago
Is it possible to use div instead of ul so that paragraphs can be pulled into place.
Reply
Apartments in Michigan 10 years ago
This is the real deal in web designs! And has clean codes too!
Reply
DK 10 years ago
How do I get the mask to resize without pushing all the content of the entire page down? I've tried absolute positioning with no success. Am i missing something?
Reply
Custom Dresses 10 years ago
this is really great and very very help many things we can show in a slide. am also looking sliding tabs with content thats also awesome and useful.
Reply