LavaLamp for jQuery lovers!

lavalamp-image

Click on the above image to land in the Lava Lamp Demo page. Then, hover over it and feel for yourself, the nifty effect that Lava Lamp offers. What you just experienced is nothing but the LavaLamp menu packaged as a plugin for the amazing jQuery javascript library. I personally believe that the effect rivals that of flash – Don’t you? Especially considering the fact that it is extremely light weight.

Just so you know, it weighs just 700 bytes(minified)!

Often I have noticed, that the credits are usually granted towards the end. Just for a change, i am going to give my credits at the beginning. This effect was originally written by Guillermo Rauch for the mootools javascript library. All I did was to port it for the benefit of jQuery lovers. Thanks Guillermo for inspiring the javascript world with such a nice effect. A special thanks to Stephan Beal who named it “LavaLamp”, and to Glen Lipka for generously helping with the image sprites. Many fellow jQuery lovers also helped shape this plugin with valuable feedback in the mailing list. Thanks a ton, all you guys.

As User Interface developers, we know that one of the first widgets our visitors use is a “Menu”. Capturing their attention right there is something that we always strive for, and I guess LavaLamp is a step in that direction. Before you get bored with all this useless talk, let me get you started on integrating LavaLamp into your jQuery powered site.

I hope you agree that a typical HTML widget consists of 3 distinct components.

  • A semantically correct HTML markup
  • A CSS to skin the markup
  • An unobstrusive javascript that gives it a purpose

Now lets follow the above steps and implement the LavaLamp menu for your site. Remember, In the process of porting from mootools to jQuery, i have simplified both the javascript and CSS for your convenience. So, be informed that you will need to follow the instructions on this page to get the jQuery version running. Follow the instructions on Guillermo Rauch’s page for the mootools version.

Step 1: The HTML

Since most UI developers believe that an unordered list(ul) represents the correct semantic structure for a Menu/Navbar, we will start by writing just that.

        <ul class="lavaLamp">
            <li><a href="#">Home</a></li>
            <li><a href="#">Plant a tree</a></li>
            <li><a href="#">Travel</a></li>
            <li><a href="#">Ride an elephant</a></li>
        </ul>        

In the markup above, “ul” represents the menu, and each “li” represents a menu-item. At this point it is crucial to understand that we will be adding another artificial “li” to represent the background of the currently highlighted menu-item. Since the background itself is cosmetic and doesn’t represent a menu-item, we will be adding it from javascript. Just to make sure we are in sync, “you need not add this li”, the LavaLamp plugin will take care of it. Once added, the “li” representing the background will look like this.

        <li class="back"><div class="left"></div></li>

Step 2: The CSS

You can skin this markup in many different ways to achieve your own personalized menu. The following style sheet is just one possibility. A few more possibilities are demonstrated in the “Bonus” section towards the end of this blog entry.

/* Styles for the entire LavaLamp menu */        
.lavaLamp {
    position: relative;
    height: 29px; width: 421px;
    background: url("../image/bg.gif") no-repeat top;
    padding: 15px; margin: 10px 0;
    overflow: hidden;
}
    /* Force the list to flow horizontally */
    .lavaLamp li {
        float: left;
        list-style: none;                    
    }
        /* Represents the background of the highlighted menu-item. */
        .lavaLamp li.back {
            background: url("../image/lava.gif") no-repeat right -30px;
            width: 9px; height: 30px;
            z-index: 8;
            position: absolute;
        }
            .lavaLamp li.back .left {
                background: url("../image/lava.gif") no-repeat top left;
                height: 30px;
                margin-right: 9px; 
            }
        /* Styles for each menu-item. */    
        .lavaLamp li a {
            position: relative; overflow: hidden;
            text-decoration: none; 
            text-transform: uppercase;
            font: bold 14px arial;
            color: #fff; outline: none;
            text-align: center;
            height: 30px; top: 7px; 
            z-index: 10; letter-spacing: 0; 
            float: left; display: block;
            margin: auto 10px;    
        }

Trust me, this is a simple style sheet. Follow along to understand what is done in each of its sections.

First, we style the “ul” with the bright orange background image and some basic properties like height, width, padding, margin etc. We use relative positioning because, that way we can absolutely position the background “li” relative to the “ul”. This helps by enabling us to move this background “li” freely within the context of the parent “ul”.

Next, we make the “li”s flow horizontally instead of vertically. By default, it flows vertically. There are a couple of techniques to do this. In this case, we are using the “float:left” to achieve this effect.

Next, we style the artifical “li” that represents the background of the currently highlighted menu-item. This uses the sliding doors technique. Also, notice the absolute positioning used as mentioned above.

Finally, we style the anchor that represents the actual clickable portion of each menu-item. These styles are mostly cosmetic and self-explanatory.

Some of the above rules may not be obvious if you are not very confident in how “positioning” works in CSS. For those, i highly encourage you to quickly read this article on CSS positioning. It is short, sweet and very informative.

Step 3: The Javascript

This is the easy part. Most of the javascript work is taken care by the Lava Lamp plugin itself. As a developer, you just have to include the mandatory and/or optional javascript files and fire a call to initialize the menu.

<script type="text/javascript" src="path/to/jquery.js"></script>
<script type="text/javascript" src="path/to/jquery.lavalamp.js"></script>
<!-- Optional -->
<script type="text/javascript" src="path/to/jquery.easing.js"></script>

<script type="text/javascript">
    $(function() { $(".lavaLamp").lavaLamp({ fx: "backout", speed: 700 })});
</script>    

Include a reference to the jQuery library and the LavaLamp plugin. Optionally, include the easing plugin as well. It has many cool effects, that are not contained in the core. For instance, the “backout” effect used in this demo is part of the easing plugin. You can download jQuery here, Easing plugin here, and the LavaLamp plugin here.

Next, in the document.ready event, fire a call to initialize the menu. You have the option to supply an easing “fx” , the “speed” with which the animation happens and a callback to be executed when a menu-item is clicked. They are optional, the default “fx” being “linear” and the default “speed” being “500” ms.

That’s it. At this point you should have a working version of LavaLamp menu for your site.

Bonus

Just with some minor changes in the style sheet, you can get a totally different look n feel for the menu. And yes, the HTML markup and the Javascript remain the same. Click on the image below to experience the demo for this underline-imageless lavalamp.

lavalamp-underline-image

Here is one more variation, again with just some minor changes to the style sheet. I know, they don’t look pretty, but all i am saying is that you are limited only by your imagination. Click on the image below to see the demo for this boxed-imageless lavalamp.

lavalamp-box-image

Finally, for your convenience, i have zipped up all the necessary files into a cohesive package. Download it, and open the demo.html to see all the 3 variations in one page.

Feel free to leave a comment with your feedback, suggestions, requests etc.

Update

Based on popular request, LavaLamp Menu has been updated to support jquery 1.2.x versions. Download the zip file for version 0.2.0 of LavaLamp and open the demo.html to check it out for yourself. Since Firefox 3 has some issues with $(document).ready() function, try using $(window).load() instead if you face any problems. Hopefully a future version of Firefox or jQuery will fix the problem.

Ganeshji Marwaha

I spend my days as the Director of Technology for Mobility practice and help my clients design enterprise and consumer mobile strategies. Mobile Payments, Digital Wallet and Tokenization technologies are my areas of specialization

  • Pingback: 10 Best Jquery Navigation Menu | Vishnu Valentino()

  • thanks very much

  • bim

    hi there, why does this plugin conflicts with my jquery slider? it shows this error,

    c.easing[this.options.specialEasing && this.options.specialEasing[this.prop] || a] is not a function

    c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);

    can you please give us an advice on how we’ll work on this?

    thanks.

    btw, great plugin.

  • You have done a great job by placing this particular article here. Its a great source for all of us to get help from one place.I like this nafty effect.You must keep your self engaged to write such brilliant write-ups.I am looking forward for the next post..Keep it up

  • Thanks @Martin for this

    a little code snippet i created to make the links work – with framesets, even … it also takes care of people clicking beside the text 🙂

    if (e.target != “[object HTMLLIElement]“)
    {
    top.frames[3].location = e.target;
    }

    works like a charm.

  • sorry for the double post but it doesn’t resolve the working href problem. I cannot find a solution for that. My links doesn’t work on any browser. The code makes the links work but the lava lamp animation disappears.

    Can anyone help me please?

  • thanks for inf.

  • thanks

  • Joe

    Guys i’ve read a lot of comments complaining about the links not working, there is a guy (thank you nevertheless) that actually counted the quotes and escape characters to fix that issue.

    in order to make the links working just replace the return false to return true in the html file and that’s it.

    Enjoy 😉

  • thanks very much

  • vijaya

    Hi,
    Need a help,
    how do I make the font color of only the current tab white and others in black.

    I have given this one in css but its taking the only one color for all menus.

    how do I use the current class.

    thanks in advance, looking forward for your suggestion

  • Really great post, very informative and interesting.
    I was looking for this kind of information and enjoyed reading this one.
    Keep posting. Thanks for sharing.

  • Pingback: Tony Space » Blog Archive » 240??jQuery??()

  • Great stuff guys! I really don’t know how much time it takes for your guys to compile such a list of excellent resources but it takes a lot of time for me to digest it all! Keep up the good work! Thank you!

  • Pingback: 13????Javascript?CSS??? | ????()

  • You are a genuine life saver, no strings attached like other websites. I was stuck on where to start with or what to include in my letter to the property manager and then I ran into your sample letter and all I had to do was fill in the blanks. I recommend your sample letter to all interested without any reservations.

  • Pingback: 35+ Ultimate Collection of JavaScript for Web Developers | Dzineblog360()

  • thanks for sharing this informative post with us…

  • That was an awesome comeback..

  • Pingback: 20????Javascript???? | ????()

  • dawid

    hi, does anybody know why doesn’t happends when i clicked the links inside my ul list with lava plugin ? please help

  • Please give me the solution..

  • Car

    thanks for sharing this.
    now i know how to do.

  • wholesale usb Let us always meet each other with a smile,for the smile is the beginning of love,wholesale usb flash drivesand once we begin to love each other naturally we want to do something.
    Branded usb drive

  • Omar

    nothing happened when you click? Just remove the below code.

    click: function(event, menuItem) {
    return false;
    }

  • Please give me the solution

  • thanx bro…

  • Very Nice post webmaster

  • Thank You …

  • good comment

  • Pingback: ????? » ?????JQuery 240???()

  • thank you very much for the this quality work.
    i will try that what you say in here to my works like

    http://www.rrkweb.com

  • Pingback: sharebit.net » 35 Easy to use Free Ajax/Javascript Navigation Solutions()

  • Pingback: ??? » Jquery??(??)()

  • thanc you

  • thanks so much for sharing. cheers!

  • Good stuff. Thanks.

  • Pingback: LavaLamp – Menu Dinamico con Jquery « Ebug – Discussioni da Web Designer()

  • Pingback: Minimalist Web Design » 52 Best of the Best jQuery Navigation()

  • I guess LavaLamp is a step in that direction. Before you get bored with all this useless talk, let me get you started on integrating LavaLamp into your jQuery powered site.

  • This was a really awesome post. I found it on google.

  • nice post. thanks for sharing that.

  • jigen

    Help!
    After removing the ‘return false’ of making it ‘return true’, the page now goes to the desired link, but then again, the menu selector resets to the first index or menu…
    Any ideas?

    oh btw, aside from this minor problem, this plugin is kicking dude!

    thanks

  • m

    So yeah, I hear there’s this 700 byte lavalamp-menu, and I’m soked to see what kind of wizardry has been used to get something like that together.
    Well it turns out it’s real easy, just take your 721 byte script, add in a 2.5KB easing-plugin, 5.2KB of CSS and 3.8KB of images, and you’re done! Wow!

    It looks real good, but maybe not advertise in bold red letters that your menu is 700 bytes, when it really weighs something close to 12 kilobytes, sans jquery.

  • Pingback: ??CSS JavaScript?????? | IP250()

  • Danele

    Hi,

    Awesome menu, thanks.

    i need it to do the following tho, will it be possible?

    the BG should not load, or display, until you actually hover over the LI’s, and if you click a LI, the BG should disappear.

    so basically the lavalamp effect must only run on mouseover of the LI’s.

    can anyone help perhaps?

    thanks Dan

  • Danele

    also, is there an updated plugin that works with jQuery 1.4.4?

  • Pingback: ?????240??jQuery?? | Chinasb's Blog()

  • Thank you for the information provided java script code. I’m trying to learn good Java script and CSS.