Building A Fixed-Position Bottom Menu Bar (ala FaceBook)

Posted October 30, 2009 at 9:10 AM

Tags: Javascript / DHTML, HTML / CSS

Now that I've explored two ways of creating fixed-position elements across browsers - using IE6 expressions and absolute layouts - I wanted to give a go at creating a fixed-position bottom menu bar, ala FaceBook. The menu bar isn't going to contain much of anything - just a single button and a pop-up menu; mostly, I wanted to see how easily I could use relative positioning once I was able to attach the menu bar to the bottom of the screen.

 
 
 
 
 
 
 
 
 
 

Even once I was able to get IE6 to put the menu bar at the bottom, using absolute positioning, it was still a real pain to get IE6 to work like the other browsers. Even with the absolute positioning, it was off by a pixel here and a pixel there. Also, the bottom-relative positioning of the pop-up menu seemed to work differently in IE6 than in any of my other browsers; as such, I had to move the "position: relative" CSS property up the parent chain to an element that had no top-padding. Only at that point did all browsers agree on what the bottom positioning meant.

 Launch code in new window » Download code as text file »

  • <!DOCTYPE HTML>
  • <html>
  • <head>
  • <title>Using CSS Fixed Position Across Browsers</title>
  • <style type="text/css">
  •  
  • html,
  • body {
  • margin: 0px 0px 0px 0px ;
  • padding: 0px 0px 0px 0px ;
  • }
  •  
  • #site-body-container {}
  •  
  • #site-body-content {
  • padding: 15px 15px 15px 15px ;
  • }
  •  
  • #site-bottom-bar {
  • background-color: #F0F0F0 ;
  • border-top: 1px solid #CCCCCC ;
  • bottom: 0px ;
  • font-family: verdana, arial ;
  • font-size: 11px ;
  • height: 30px ;
  • position: fixed ;
  • width: 100% ;
  • z-index: 1000 ;
  • }
  •  
  • #site-bottom-bar-frame {
  • height: 30px ;
  • margin: 0px 10px 0px 10px ;
  • position: relative ;
  • }
  •  
  • #site-bottom-bar-content {
  • padding: 3px 0px 0px 0px ;
  • }
  •  
  • #menu-root {
  • background-color: #E8E8E8 ;
  • border: 1px solid #D0D0D0 ;
  • color: #000000 ;
  • display: block ;
  • height: 22px ;
  • line-height: 22px ;
  • text-align: center ;
  • text-decoration: none ;
  • width: 105px ;
  • }
  •  
  • #menu-root:hover {
  • background-color: #666666 ;
  • border-color: #000000 ;
  • color: #FFFFFF ;
  • }
  •  
  • #menu {
  • background-color: #E8E8E8 ;
  • border: 1px solid #666666 ;
  • bottom: 32px ;
  • display: none ;
  • left: 0px ;
  • padding: 5px 5px 1px 5px ;
  • position: absolute ;
  • width: 200px ;
  • }
  •  
  • #menu a {
  • background-color: #E8E8E8 ;
  • border: 1px solid #FFFFFF ;
  • color: #000000 ;
  • display: block ;
  • margin-bottom: 4px ;
  • padding: 5px 0px 5px 5px ;
  • text-decoration: none ;
  • }
  •  
  • #menu a:hover {
  • background-color: #666666 ;
  • border-color: #000000 ;
  • color: #FFFFFF ;
  • }
  •  
  • /* -------------------------------------------------- */
  • /* -- IE 6 FIXED POSITION HACK ---------------------- */
  • /* -------------------------------------------------- */
  •  
  • html,
  • body,
  • #site-body-container {
  • _height: 100% ;
  • _overflow: hidden ;
  • _width: 100% ;
  • }
  •  
  • #site-body-container {
  • _overflow-y: scroll ;
  • _overflow-x: hidden ;
  • _position: relative ;
  • }
  •  
  • /* To make up for scroll-bar. */
  • #site-bottom-bar {
  • _bottom: -1px ;
  • _position: absolute ;
  • _right: 16px ;
  • }
  •  
  • /* To make up for overflow left. */
  • #site-bottom-bar-frame {
  • _margin-left: 26px ;
  • }
  •  
  • /* To fix IE6 display bugs. */
  • #menu a {
  • _display: inline-block ;
  • _width: 99% ;
  • }
  •  
  • </style>
  • <script type="text/javascript" src="jquery-1.3.2.js"></script>
  • <script type="text/javascript">
  •  
  • jQuery(function( $ ){
  • var menuRoot = $( "#menu-root" );
  • var menu = $( "#menu" );
  •  
  • // Hook up menu root click event.
  • menuRoot
  • .attr( "href", "javascript:void( 0 )" )
  • .click(
  • function(){
  • // Toggle the menu display.
  • menu.toggle();
  •  
  • // Blur the link to remove focus.
  • menuRoot.blur();
  •  
  • // Cancel event (and its bubbling).
  • return( false );
  • }
  • )
  • ;
  •  
  • // Hook up a click handler on the document so that
  • // we can hide the menu if it is not the target of
  • // the mouse click.
  • $( document ).click(
  • function( event ){
  • // Check to see if this came from the menu.
  • if (
  • menu.is( ":visible" ) &&
  • !$( event.target ).closest( "#menu" ).size()
  • ){
  •  
  • // The click came outside the menu, so
  • // close the menu.
  • menu.hide();
  •  
  • }
  • }
  • );
  •  
  • });
  •  
  • </script>
  • </head>
  • <body>
  •  
  • <div id="site-bottom-bar" class="fixed-position">
  • <div id="site-bottom-bar-frame">
  • <div id="site-bottom-bar-content">
  •  
  • <a id="menu-root" href="##">Toggle Menu</a>
  •  
  • <div id="menu">
  • <a href="##">Here is a menu item</a>
  • <a href="##">Here is a menu item</a>
  • <a href="##">Here is a menu item</a>
  • <a href="##">Here is a menu item</a>
  • <a href="##">Here is a menu item</a>
  • <a href="##">Here is a menu item</a>
  • </div>
  •  
  • </div>
  • </div>
  • </div>
  •  
  •  
  • <!-- ------- -->
  • <!-- ------- -->
  •  
  •  
  • <div id="site-body-container">
  • <div id="site-body-content">
  •  
  • <cfloop
  • index="i"
  • from="1"
  • to="20"
  • step="1">
  •  
  • <p>
  • Lorem ipsum dolor sit amet, consectetur
  • adipiscing elit. Aliquam dictum enim in mauris
  • luctus convallis. Aliquam erat volutpat.
  • Suspendisse potenti. Duis blandit, urna vitae
  • feugiat porttitor, risus est ornare metus, at
  • dignissim urna velit id enim. Donec lectus nisi,
  • consectetur eget sollicitudin id, bibendum
  • laoreet velit.
  • <p>
  •  
  • </cfloop>
  •  
  • </div>
  • </div>
  •  
  • </body>
  • </html>

All in all, getting this to work in IE6 was just a pain. I can easily see why a site would choose not to have this bottom bar for non-modern browsers. Especially for features that are not mission critical, it would be much easier to only insert the bar "position: fixed" is available.

Download Code Snippet ZIP File

Post Comment  |  Ask Ben  |  Permalink  |  Other Searches  |  Print Page




Learning ColdFusion 9 - ColdFusion 9 tutorials, samples, examples, demos

Reader Comments

Oct 30, 2009 at 9:24 AM // reply »
1 Comments

Dude... IE6 is dead! lol


Oct 30, 2009 at 9:28 AM // reply »
6,516 Comments

@Timothy,

I'm inclined to agree - it was annoying to work with.


Oct 30, 2009 at 10:12 AM // reply »
1 Comments

http://twibbon.com/join/IE6-Must-Die


Oct 30, 2009 at 10:41 AM // reply »
111 Comments

I've been meaning to point this out for a long time, but the your object/embed code for embedding your videos is a bit messed up. You have different dimensions between the object & embed tags:

object element: width="256" height="246"
embed element: width="546" height="544"

Since I use FeedDemon as my RSS reader (which unforutnately uses IE for rendering) the video's are too small at 256x246 to be really useful. If it's something I end up watching, I've got to go to Firefox to view it.

If you just fixed the object element's dimensions, all would be good.


Oct 30, 2009 at 10:52 AM // reply »
6,516 Comments

@Dan,

Ahh, thanks for pointing that out. The HTML for the embed gets auto-generated from the JING FTP process; I must have messed something up in the template that it is using.


Oct 30, 2009 at 1:28 PM // reply »
55 Comments

@Ben,

Thanks for sharing this. I was actually just checking out CometChat (http://www.cometchat.com/?ref=sw) which also has the Facebook-ish toolbar at the bottom of the browser but geared more for the chat functionality. I was digging through their demo's css, etc. for ideas and then eventually happened across your post.

Anyway, thanks!


Oct 31, 2009 at 11:15 AM // reply »
1 Comments

Thanks for sharing, useful post.


Oct 31, 2009 at 12:32 PM // reply »
6,516 Comments

@Steve,

Looks like a cool service. Looks very much like the FaceBook design - which is nice and clean.


Nov 1, 2009 at 10:00 AM // reply »
1 Comments

Great stuff Ben....but we need to let IE6 go!!!


Nov 1, 2009 at 2:48 PM // reply »
6,516 Comments

@David,

I think I even tried opening up FaceBook in IE6 and if I recall correctly, they don't use the bottom bar.... I could be making that up, though.


Nov 11, 2009 at 5:46 AM // reply »
2 Comments

It is excellent code,

please suggest me how to create 2 link next to Menu,
so i can use the space properly.


Nov 11, 2009 at 10:32 AM // reply »
1 Comments

Great code dude, thanks for this article.


Nov 11, 2009 at 12:18 PM // reply »
1 Comments

you can give a warning to your visitor

"don't use IE6 hahahha....."


Post Comment  |  Ask Ben

Recent Blog Comments
Nov 22, 2009 at 1:56 AM
Learning ColdFusion 9: Using CFQuery In CFScript Can Enable SQL Injection Attacks
Why adobe would give you script equivalent of cfquery is beyond me. I love cfquery tag because it helps me wriite clean sql, and get away from the horrible jdbc queries If I wanted to write javali ... read »
Nov 22, 2009 at 1:45 AM
Streaming Text Using ColdFusion's CFContent Tag And The Variable Attribute
The reason you would want to do this is to stream. Ack json/xml files to ria clients I used thus technique before because putting json in response stream causes debugging info to come thru As well a ... read »
Nov 21, 2009 at 6:47 PM
Hal Helms - Real World Object Oriented Development, Sarasota - Day Five
@charlie griefer, Thank you.. ... read »
Nov 21, 2009 at 5:15 PM
Using ColdFusion Structures To Remove Duplicate List Values
@Jose Galdamez, Oh heh yeah I didn't paste the whole code. I should have defined the vars -- my bad. It's fixed thou. Thanks. ... read »
Nov 21, 2009 at 4:49 PM
Styling The ColdFusion 8 WriteToBrowser CFImage Output
Great work yet again Ben! Whilst I didn't use this whole code, I copied some of your regex code for a similar problem with the lack of an alt attribute and unescaped ampersands in CFIMAGE for Railo 3 ... read »
Nov 21, 2009 at 1:13 PM
My First ColdFusion Builder Extension - Encrypting And Decrypting CFM / CFC Files
@Ben, Because I am pedantic, I just want to make sure that everyone knows there is absolutely no encryption going on. There is only encoding and obfuscation. The cfencode tool only obfuscates your C ... read »
Nov 21, 2009 at 12:28 PM
Using ColdFusion Structures To Remove Duplicate List Values
@Jody I can't seem to get your code sample to work. If you are still having problems, try this code out and see if it gets you what you wanted. <!--- Comma delimited list with various duplicates ... read »
Nov 21, 2009 at 11:03 AM
Groovy Operator Overloading Does Not Work In The ColdFusion Context
Hi Ben, Thanks for this informative post. Now I am reading ur old posts too ... read »