How To Create A ‘Mootools Homepage’ Inspired Navigation Effect Using jQuery
In HTML / CSS, Javascript / AJAX by Bedrich RiosDemo and Source Code
Step 1
Let's begin by writing the necessary HTML to create a simple vertical navigation. For the structure, as you may have guessed, we will use an unordered list <ul> with the ID name "sliding-navigation". Also, we will add some links and give each list item <li> the class name "sliding-element".
I'm also going to add in a title element. This is a useful thing to do as many WordPress blogs for example have title elements in their sidebar navigation (e.g. "Archives"). So it would look something like this:
<ul id="sliding-navigation"> <li class="sliding-element"><h3>Navigation Title</h3></li> <li class="sliding-element"><a href="#">Link 1</a></li> <li class="sliding-element"><a href="#">Link 2</a></li> <li class="sliding-element"><a href="#">Link 3</a></li> <li class="sliding-element"><a href="#">Link 4</a></li> <li class="sliding-element"><a href="#">Link 5</a></li> </ul>
Step 2
Now, let's create a HTML document where we can put the work we just did. Create a new HTML file and call it demo.html. Then open this file with your favorite text editor and insert the following code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Navigation Effect Using jQuery</title>
<link rel="stylesheet" type="text/css" href="styles.css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="sliding_effect.js"></script>
</head>
<body>
<div id="navigation-block">
<ul id="sliding-navigation">
<li class="sliding-element"><h3>Navigation Title</h3></li>
<li class="sliding-element"><a href="#">Link 1</a></li>
<li class="sliding-element"><a href="#">Link 2</a></li>
<li class="sliding-element"><a href="#">Link 3</a></li>
<li class="sliding-element"><a href="#">Link 4</a></li>
<li class="sliding-element"><a href="#">Link 5</a></li>
</ul>
</div>
</body>
</html>
There are a few things to note here:
- The !DOCTYPE for our demo.html file is set to XHTML 1.0 Strict. This is not required for the effect to work but I try to get in the habit of using it as much as I can.
- You may have notice that the <link> tag is refering to a file called style.css. However, no such file exists. No worries though, that is the next step.
- Finally I've wrapped my navigation block into a <div>. We'll make use of this later to position the block on the page.
Step 3
Now that we have our HTML file labelled and working, let's add some styles. Remember that our HTML document is pointing to a CSS file called styles.css. So, let's begin by creating a file called styles.css and saving it in the same directory where our HTML document lives. As we did in the previous step, open this file with your favorite text editor and insert the following code:
body
{
margin: 0;
padding: 0;
background: #1d1d1d;
font-family: "Lucida Grande", Verdana, sans-serif;
font-size: 100%;
}
ul#sliding-navigation
{
list-style: none;
font-size: .75em;
margin: 30px 0;
}
ul#sliding-navigation li.sliding-element h3,
ul#sliding-navigation li.sliding-element a
{
display: block;
width: 150px;
padding: 5px 15px;
margin: 0;
margin-bottom: 5px;
}
ul#sliding-navigation li.sliding-element h3
{
color: #fff;
background: #333;
border: 1px solid #1a1a1a;
font-weight: normal;
}
ul#sliding-navigation li.sliding-element a
{
color: #999;
background: #222;
border: 1px solid #1a1a1a;
text-decoration: none;
}
ul#sliding-navigation li.sliding-element a:hover { color: #ffff66; }
Step 4
At this point your demo.html page should be looking something like this:
- Download the latest version of jQuery.
- Create a new file called sliding_effect.js and save it in the same directory as that of your HTML and CSS file.
- Lastly, insert the two previous files to your HTML document's <head>.
<head> <title>Navigation Effect Using jQuery</title> <link rel="stylesheet" type="text/css" href="styles.css" /> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="sliding_effect.js"></script> </head>
Step 5
Now, we will create the function that will do all the "heavy" lifting for the sliding effect to work. This function will take five parameters (navigation_id, pad_out, pad_in, time, and multiplier) and use them as follows:- navigation_id: This is the ID name of the navigation, which contains the elements the effect will be applied on.
- pad_out: This is the number of pixels to be padded left when one of the links inside the navigation is hovered.
- pad_in: This is the number of pixels to be padded left when one of the links inside the navigation is no longer being hovered.
- time: This represents the amount of time (in milliseconds) that takes for one of the link elements to slide in and back in to place when the page is loaded.
- multiplier: The job of the multiplier is to increase or decrease the amount that takes the a following link element to slide in to the screen. In other words, if the multiplier is 1, all link elements will slide in to the screen in equal time intervals. However, if it is less than 0, the subsequent link elements will slide in faster, and if it is more than 1 the opposite will happen.
function slide(navigation_id, pad_out, pad_in, time, multiplier)
{
// creates the target paths
var list_elements = navigation_id + " li.sliding-element";
var link_elements = list_elements + " a";
// initiates the timer used for the sliding animation
var timer = 0;
// creates the slide animation for all list elements
$(list_elements).each(function(i)
{
// margin left = - ([width of element] + [total vertical padding of element])
$(this).css("margin-left","-180px");
// updates timer
timer = (timer*multiplier + time);
$(this).animate({ marginLeft: "0" }, timer);
$(this).animate({ marginLeft: "15px" }, timer);
$(this).animate({ marginLeft: "0" }, timer);
});
// creates the hover-slide effect for all link elements
$(link_elements).each(function(i)
{
$(this).hover(
function()
{
$(this).animate({ paddingLeft: pad_out }, 150);
},
function()
{
$(this).animate({ paddingLeft: pad_in }, 150);
});
});
}
Step 6
All we need to do in order to trigger the script is call the function when the page has loaded. There are two place to put the following snippet of code. It can either be written inside the sliding_effect.js file (I chose this option for this tutorial) or called within the HTML using a <script> tag. Either case will use the same code, which is as follows:
$(document).ready(function()
{
slide([navigation_id], [pad_out], [pad_in], [time], [multiplier]);
});
Step 7
Finally we'll add a bit of style to the page to make it look slightly more glamourous. First I've created an image block that looks like this:

The image has a faint gradient, a highlight line, is 190px wide and called "background.jpg". The idea will be to position this to the left of our navigation so that the buttons slide in under it. We'll also add a little heading title to the page. So our HTML becomes:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Navigation Effect Using jQuery</title>
<link rel="stylesheet" type="text/css" href="styles.css" />
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="sliding_effect.js"></script>
</head>
<body>
<div id="navigation-block">
<img src="background.jpg" id="hide" />
<h2><span>Navigation Effect Using jQuery</span></h2>
<p>By Bedrich Rios</p>
<ul id="sliding-navigation">
<li class="sliding-element"><h3>Navigation Title</h3></li>
<li class="sliding-element"><a href="#">Link 1</a></li>
<li class="sliding-element"><a href="#">Link 2</a></li>
<li class="sliding-element"><a href="#">Link 3</a></li>
<li class="sliding-element"><a href="#">Link 4</a></li>
<li class="sliding-element"><a href="#">Link 5</a></li>
</ul>
</div>
</body>
</html>
Notice that I've added the image inside the "navigation-block" element and give it an ID called "hide". Also I've added a heading element and subtitle. Now we add a bit of extra CSS to our styles.css file as follows:
h2
{
color: #999;
margin-bottom: 0;
margin-left:13px;
background:url(navigation.jpg) no-repeat;
height:40px;
}
h2 span
{
display: none;
}
p
{
color: #ffff66;
margin-top: .5em;
font-size: .75em;
padding-left:15px;
}
#navigation-block {
position:relative;
top:200px;
left:200px;
}
#hide {
position:absolute;
top:30px;
left:-190px;
}
So first in the <h2> element, we have set the HTML text to vanish using "display:none" and set a background image of some nicer looking text I prepared earlier.
Also notice that the "navigation-block" element now has a relative position, so that we can move the "hide" image over to the left. This will make the tabs appear from under it.
Lastly to give our tabs a bit of finish I've added a subtle background image that looks like shading like this:
ul#sliding-navigation li.sliding-element h3
{
color: #fff;
background:#333 url(heading_bg.jpg) repeat-y;
font-weight: normal;
}
Finished
And we're done!

Comments
Leave a CommentAdd a Comment














Martin Rogalla
May 10th, 2008
Wow very nice! Thanks Nettuts!
Keep the good work up!
James
May 10th, 2008
Nice effect Bedrich!
If you scramble the mouse around a lot the effect takes a while to catch up - it plays over and over again - maybe some kind of timeout/interval function would fix this.
Thanks for the tut!
Travis
May 10th, 2008
Very cool, Bedrich. I love the simple interactivity jQuery adds to navigation. Keep the tutorials like this comin’!
Collis Ta'eed
May 10th, 2008
Yay the first tutorial not by me
Phew! Great job Bedrich!
Bruce Alrighty
May 10th, 2008
Excellent tutorial Bedrich.
Razvan
May 10th, 2008
Great tut, thanks!
Danny
May 10th, 2008
Haha I like sliding over each tab a lotta times and then moving my cursor over and watching the tabs jiggle in and out
Medium
May 10th, 2008
Very nice ! A solid tutorial
Ben Griffiths
May 10th, 2008
Great tutorial, thanks!
Johan
May 10th, 2008
Thanks! Please continue with these tutorials to great effects and functions using existing Javascript frameworks! With this code, you could construct a meny similar to the coloured menu on http://www.mootools.net, the one with “Download, docs, blog” etc. or ?
giackop
May 10th, 2008
That’s cool thanx!! jQuery is so good
N Avery
May 10th, 2008
I haven’t used jQuery, but I presume adding $(this).focus(… would do the same for focusing on the links. If I were to implement this, I’d want it to work for hovering and focusing.
Nice tutorial
Daniel
May 10th, 2008
very useful! thank you very much!
Sumesh
May 10th, 2008
Nice tutorial, Bedrich.
Collis, I don’t know if you have realized it, but in feed readers (I’m using FeedDemon), every link with an href=”folder/filename.extension” format, the feed item URl is prefixed. Of course, this maybe a problem of FeedDemon alone or all feed readers, but just saying
Adis Arifagic
May 10th, 2008
Hi,
Great tutorial and effect like your style!
Keep up the good work..
Nate
May 10th, 2008
Very nice tutorial, thank you!
Ali
May 10th, 2008
excellent tutorial, i like these type of effects tutorials. thanks for your help
Designer
May 10th, 2008
very neat….. looks really cool
Tiempo
May 10th, 2008
Reading book on jQuery and yours tutorials are great addition!
Great! Thank you!
Bedrich
May 10th, 2008
@james
Nice catch. I hadn’t even noticed that myself, it kinda looks cool :). But you are right, some form of time out function may fix it.
@all
Thanks! This is my first attempt at a tutorial of this magnitude, so, it’s good to know you guys liked it.
Lex Beelen
May 10th, 2008
Nice tutorial.
Little bug in internet explorer and firefox on the mac. You get a scrollbar at the bottom. If you don’t want the scrollbar. Replace this code:
#navigation-block {
margin-top:200px;
padding-left:190px;
background:url(background.jpg) no-repeat;
}
And delete this rule.
Demo:
http://www.lexperts.nl/nettuts/demo.html
Lex Beelen
May 10th, 2008
Sorry, forgot the rule:
D. Carreira
May 10th, 2008
I’ll need use this in a future website! Thanks
David Carreira
Lamin Barrow
May 10th, 2008
Thanks for the TUT Bedrich.
Lamin Barrow
May 10th, 2008
Just a tip… you might want to add the following css code to prevent dynamic outlines from forming on an active link in Firefox.
ul#sliding-navigation li.sliding-element a:active { outline: none; }
Nico
May 10th, 2008
Thank you Bedrich - this has a very clean overall effect.
@Lamin THANK YOU! I’ve been looking for the workaround the past THREE WEEKS! lol
Nick
May 10th, 2008
Does anyone else get a nasty horizontal scroll on Safari 3.1.1 on OSX 10.5.2 ?
Sean
May 10th, 2008
Very nice, thank you!
Eric
May 10th, 2008
Thank you for the tutorial, just finished it. I took a second and tried it in IE6 and there is an odd issue with vertical padding when animating. Mootools seems to work on it though : P
Rata
May 10th, 2008
Muchas gracias
Tyler
May 10th, 2008
Nice tut. thanks for sharing
Abozar
May 11th, 2008
Great! Thank you, Keep this nice work up!
Jacob Gube
May 11th, 2008
Splendid tutorial, and I’ve recently switched from mootools over to jQuery, and like the author, I agree that the mootools site is beautiful… I also like the download section where you select the packages you want included and it compiles it for you on the fly.
Couple of notes:
- to save declaring arrays at the beginning of the function (and save some lines of code), I would just select the elements directly. Instead of
$(list_elements).each, I would just use$("li.sliding-element").each- I think it’s good practice to reduce the number of CSS classes and ID’s as much as I can, and doing
$(ul#sliding-menu li a)would select the appropriate list items without having to assign a class to the actual list item.Anyways, just my two cents - great tutorial and the detail and quality of writing was excellent! Keep up the awesome work!
Paul @ web design Ireland
May 11th, 2008
I assume this has a smaller footprint than the mootools.js file etc? I always thought it was a very light framework.
Boris Strahija
May 11th, 2008
Very nice, but…
I think you have some markup that’s not needed. The right way would be:
Navigation Title
Link 1
Link 2
Link 3
Link 4
Link 5
You can then reference the elements in JQuery like this:
$(”#navigation-block”)
$(”#navigation-block ul”)
$(”#navigation-block li”)
$(”#navigation-block li a”)
Shane
May 11th, 2008
I’d not even seen the original effect, and it’s impressive - nothing too over the top. I find that some effects do little for usability and are more an annoyance than anything else.
A great tutorial and showcase for the type of things that are so much easier to achieve with an empowering library such as jQuery. I’ve been using it for about a month now, and have never looked back.
Go jQuery!
Jacob
May 11th, 2008
Awesome… Someone should do a tutorial on how to skin a wordpress from start to finish or an oscommerce. Seems to be what everyone is looking for. That would be sweet.
Joefrey Mahusay
May 11th, 2008
Yay! this is the one i like. Thanks!
Ehab
May 12th, 2008
Superb Tut ! Thank you so much
Troyenne
May 12th, 2008
Thank you, this is an excellent tutorial !
Drupal Museum
May 12th, 2008
Very cool effect. Thanks!
Samaar
May 12th, 2008
Heey
really really great tutorial. really love the clean and sleek look of the menu
nice job Thank you!!!
Tom
May 12th, 2008
Amazing final result, love it!
Well done.
Jack Keller
May 12th, 2008
Nice tutorial, I have always liked the “quiks” stuff from Mootools, it’s nice to see it done by an alternate library, I have been using Mootools for the past year but have started to play more with jQuery lately.
benstewart
May 12th, 2008
Great tutorial. I will definitely be using this one!
As Jacob was saying, there are a lot of unnecessary ids and classes in your xHTML, though. As long as you only have one ul in your div#navigation-block then you can reference everything in your CSS and JS relative to that element. This will not only make your markup look nicer, but it will also save some bandwidth and hand-coding time.
For example, to reference one of your li’s you could get rid of those class assignments and just say:
div#navigation-block li
…instead of…
li.sliding-element
It doesn’t make the CSS any leaner, but all of the class assignments in the xHTML add up on a larger site. Plus, IMHO, it’s just good practice.
max239947
May 12th, 2008
The page unnecessarily scrolls horizontally in Firefox 3
Qbrushes
May 12th, 2008
love the effect, well done!
Aj
May 13th, 2008
great tutorial, thanks
Rant
May 13th, 2008
Nice but why no active css example?
CB-DESIGNS
May 13th, 2008
Hi I Would Like To See More TUTS On Myspace A Lot Attention Is Nowadays Being Turnt To Myspace And It Involves A Lot Of CSS/HTML Codes For Layouts
CBDESIGNS
http://www.GrimeGenre.com/CBDESIGNS
Tyler Bramer
May 13th, 2008
Great way to add a simple effect. Thanks.
mamjed
May 13th, 2008
maybe a follow up on adding sub navigation with a similar effect of perhaps a fade?
Avinash
May 14th, 2008
Someone’s written a jQuery library to handle the hard work of your “slide” function. I refer to it in a tutorial.
nb
May 14th, 2008
nice menu, like it.
not really on topic but i’ll just add this to the css (if you’re not a valid css freak)
a:active { outline: none; }
a:focus { -moz-outline-style: none; }
so you don’t get the dotted border on click with ff ^_^
daniel
May 15th, 2008
Muchas Gracias !!!
Nick
May 15th, 2008
I love jquery!
Jacob Gube
May 15th, 2008
I’ve been tinkering around the idea of creating a Wordpress theme from scratch, start to finish. I’ve written parts of it but it’s a tremendous task.
As for oscommerce, I never really liked creating themes for it, neither for Zen Cart (it’s derivative). I think it’s more worthwhile to invest time in learning Magento - http://www.magentocommerce.com/
Would there be an interest in a Drupal “start to finish” theming tutorial?
Muhammad
May 16th, 2008
Anyone interested in doing a textpattern tutorial?
Daniel Buchner
May 22nd, 2008
Because of the animate reference instead of a true Penner based easing function, I presume, the menu tabs continue to jiggle uncontrollably if you move over them a bit and then exit the menu. I have seen a lot of this porting of scripts from Mootools lately and I am starting to wonder why there are so many people switching over. For some reason I can always tell if a site’s effects are done in Libs other than Moo, they are usually way more jumpy and jerkish than their Moo counter parts. Whatever though, I’ll stick with Moo 1.2 and its native iframe class, swiff object native, and ridiculous effect goodness anyday over 30k jQuery and the other 100k they don’t tell you about from includes like jQ Interface that it needs to get it up to snuff. :)>
lethrj
May 23rd, 2008
I have always enjoyed the fact that mootools.net showcases some of its most sought-after effects. I don’t know if anybody remembers their old site design, but it was pretty great as well. We should all be thankful for Valerio and John Resig. I know I am.
deep
May 28th, 2008
is it possible to use this effect by replacing the text with an image? like a button that i have created in photoshop??
Justin
May 29th, 2008
Which font dit you use for the heading: Navigation Effect using jQuery? I can’t get it matching with the arial?
Danny
June 1st, 2008
I just love using mootools…
Evan
June 2nd, 2008
Yeah, totally… what is the name of that font used in navigation.jpg?
Creative451
June 5th, 2008
Hey guys… Off the top of my head (Evan/Justin) I’d say that font was something like Helvetica Neue (45 = Ultra Light)… Want me to check for you?
Iuga
July 2nd, 2008
GRACIAS !!! Excelente creacion …
Edward
July 2nd, 2008
Was wondering how this script would run with 2 menus in two different DIV?
one menu works the other doesnt?
Khalid
July 8th, 2008
Great tut. I put it together and everything worked, excepted when I tried to add it to a page with other “cool effects” from this website. The first thing I thought was that my site was disorganized and looked like a hurricane had plowed through. After organizing everything and updating I still couldn’t get it to work, thanks for any help you can provide
Jonathan Merriweather
July 12th, 2008
A fix for IE6:
change
line 14: $(this).css(”margin-left”,”-180px”);
to
line 14: $(this).css(”margin”,”0px 0px 5px -180px”);
Lashan
July 25th, 2008
Very cool effect.
I used it here - http://diamondandgembox.com/
turu
August 30th, 2008
so cool !
elvisparsley
September 2nd, 2008
I have seen this in moord.com which uses mootools.
Unfortunately none of them work in IE6 as you expect.
Time will come for me to use in future.
Windows Themes
September 4th, 2008
I like the effect, well done! Thanks