// you’re reading...

Javascript

Expanding/collapsing javascript menu

In this post I'll show you how to create an expanding/collapsing menu like Slashdot left menu used to be, using the YUI library and Dav Glass YUI effects widget.

Preview of the script we are going to build.

The HTML markup for our menu is :

  1.  
  2. <div id="menu">
  3. <h1 id="menu-title">Menu</h1>
  4. <div id="menu-links">
  5. <li>Home</li>
  6. <li>About</li>
  7. <li>CSS</li>
  8. </ul></div>
  9. </div>
  10.  

We use 2 div tags, one for holding the menu itself and the other one which contains the links in an unordered list and 1 h1 tag for the title.

The CSS for the menu :

  1.  
  2. /** width of the menu */
  3. #menu{
  4. width: 180px;
  5. }
  6.  
  7. /** the main title */
  8. #menu h1{
  9. line-height: 35px;
  10. color: #fff;
  11. /** simulate link */
  12. cursor: pointer;
  13. font-weight: bold;
  14. /** background image will change when menu expands/collapses */
  15. background: #666 url(images/block-arrow-expanded.gif) no-repeat scroll 30px 13px;
  16. }
  17.  
  18. /** the links */
  19. #menu-links li{
  20. line-height: 35px;
  21. border-bottom:1px solid #ddd;
  22. background-color: #eee;
  23. }
  24.  

Please pay attention to the background for the #menu h1. It contains the image, which will change when the menu collapses or expands. When the menu collapses we'll be using the block-arrow-collapsed.gif image and when the menu expands we'll be using the block-arrow-expanded.gif image. You can find the images in the sample demo file in the images directory.

To do the collapsing/expanding effects, we need to include the following javascript files beforehand :

  1.  
  2. <!-- js -->
  3. <script type="text/javascript" src="http://yui.yahooapis.com/combo?2.5.2/build/yahoo-dom-event/yahoo-dom-event.js&2.5.2/build/animation/animation-min.js"></script>
  4. <script type="text/javascript" src="js/tools-min.js"></script>
  5. <script type="text/javascript" src="js/effects-min.js"></script>
  6.  

We use Dav Glass YAHOO.Tools package and his effects widget along with yahoo-dom-event-animation aggregate file which are hosted on Yahoo servers.

Finally the javascript to do the magical stuff goes like that :

  1.  
  2. <script type="text/javascript">
  3. YAHOO.util.Event.addListener('menu-title', 'click', function(){
  4. if(YAHOO.util.Dom.getStyle('menu-links', 'display') == 'block'){
  5. new YAHOO.widget.Effects.BlindUp('menu-links', {seconds: 0.2});
  6. YAHOO.util.Dom.setStyle('menu-title', 'background-image', 'url(images/block-arrow-collapsed.gif)');
  7. }
  8. else{
  9. new YAHOO.widget.Effects.BlindDown('menu-links', {seconds: 0.2});
  10. YAHOO.util.Dom.setStyle('menu-title', 'background-image', 'url(images/block-arrow-expanded.gif)');
  11. }
  12. });
  13. </script>
  14.  

In line 3 of the above listing, we wait when the user clicks on the menu-title container and we check the display attribute of our links. If the links are not currently displayed then we display them by using Dav's BlindDown effect with a duration of 0.2 seconds ;-).

  1.  
  2. new YAHOO.widget.Effects.BlindDown('menu-links', {seconds: 0.2});
  3.  

We also change the background image for the menu title by using the YAHOO.util.Dom.setStyle method:

  1.  
  2.  
  3. YAHOO.util.Dom.setStyle('menu-title', 'background-image', 'url(images/block-arrow-expanded.gif)');
  4.  

If the links are visible then we do the contrary, i.e we use the BlindUp effect and use the collapsed gif as background image.

Download sample demo

Share and Enjoy: These icons link to social bookmarking sites where readers can share and discover new web pages.
  • bodytext
  • del.icio.us
  • Facebook
  • Google
  • StumbleUpon
  • Mixx
  • Ma.gnolia
  • Technorati
  • Netvouz
  • Reddit
  • Propeller
  • Slashdot
  • description

Discussion

12 comments for “Expanding/collapsing javascript menu”

  1. Rien compris!!!! Merci quand meme si t’as fait un truc sympa…mais vraiment…rien capté !!!!

    Posted by vijayan | July 18, 2008, 5:06 am
  2. o moins tone essaye compran ;-)

    Posted by asvin | July 18, 2008, 5:30 am
  3. Nice article!!

    Posted by Dav Glass | July 20, 2008, 6:46 am
  4. thanks Dav

    Posted by asvin | July 20, 2008, 9:43 pm
  5. Dave:

    Is it possible to create the same menu effect using the tag rather than the and tags?

    Thanks!

    Posted by shinshuri | August 11, 2008, 7:03 pm
  6. Dave, Ok my last comment dis not post correctly.

    I was asking if I could create the menu using a DIV tag rather than the UL and il tags.

    Thanks!

    Posted by shinshuri | August 11, 2008, 7:04 pm
  7. Shinshuri,

    In fact, it’s Asvin not Dav. ;-) Yes, you can use DIV tags instead of the list. Makes no difference, it should work no problem, you’ll just have to modify the stylesheet. Let me know if you want a helping hand.

    Posted by asvin | August 11, 2008, 10:13 pm
  8. Hey thanks a bunch. I’ll let you know if I do need help.

    Posted by shinshuri | August 11, 2008, 10:18 pm
  9. Asvin:

    I think I’m gonna need some help on trying to implement this expand and collapse method in my code using the DIV tag instead of the List tags. I’d like to take you up on the offer to help me.

    Also, once the .js file is implemented will there be issues of having to access Yahoo’s server to run this in the client internal to my organization?

    Let me know Thanks!

    Posted by shinshuri | August 12, 2008, 3:04 am
  10. Hi Asvin:

    Can you help me with coding the DIV tag in the expand/collapse menu? Or maybe entertain some questions, etc.

    Thanks,

    Shin

    Posted by ShinShuri | August 12, 2008, 10:41 pm
  11. Shin,

    Sure will help you, just give me till tomorrow, i’am overloaded at work ;-)
    Don’t worry will help u

    Posted by asvin | August 12, 2008, 10:49 pm
  12. Shin,

    check out this demo which doesn’t use any LI :
    http://htmlblog.net/demo/yui-menu-slashdot/div.html

    Concerning including the yahoo libraries, no problem, you can download them and extract them to your internal web server.
    Download it here :
    http://sourceforge.net/project/downloading.php?group_id=165715&filename=yui_2.5.2.zip

    Let me know if it’s OK for you.

    Posted by asvin | August 13, 2008, 8:42 pm

No Comments yet, your thoughts are welcome