Browsers will automatically display a tooltip when you provide a title attribute. Internet Explorer will also use the alt attribute. But, in this tutorial I'm going to show you how to quickly write a jQuery plugin that will replace the typical browser tooltip with something a little flashier.
Build a Better Tooltip with jQuery Awesomeness
Apr 1st in JavaScript & AJAX by Jon CazierOne of the great tools we have in our web development goodie-bag are tooltips. A tooltip is a box that appears when you hover your cursor over an element like a hyperlink. It provides supplementary information about that element. For example, a link with little or no text (an icon) may become confusing. Provide an extra sentence or two within a tooltip to explain to your users what will happen if they click on it.
Before You Start
This tutorial would probably fit in the category of Intermediate. The instructions assume that you have at least a basic understanding of HTML/CSS, slicing techniques and jQuery.
If you need a refresher on jQuery, here are a few recommended sites:
- jQuery for Absolute Beginners: Video Series
- Create a Custom WordPress Plugin From Scratch
- 15 Resources To Get You Started With jQuery From Scratch
- jQuery and JavaScript Coding: Examples and Best Practices
- Getting Started with jQuery
- How to Get Anything You Want - part 1
Just so you have a clear idea of the files involved in this tutorial, here is what the file structure should look like by the time you are done.
Here's a rundown of what each file/folder is:
- Images folder contains the following images:
- - - tipTip.png - created in Step 2
- - - tipMid.png - created in Step 2
- - - tipBtm.png - created in Step 2
- index.html - - created in Step 3
- style.css - created in Step 3
- jquery-1.3.1.min.js - download this here
- jquery.betterTooltip.js - - created in Step 5
First, Get a Little Creative
Open up Photoshop, or your software of choice, and whip up an awesome looking tooltip. Rather than designing on a plain white background, it may help to draw up your tooltip on a background similar to that of your site. That way it will blend in seamlessly. For the most part, there is no right or wrong way to complete this step. Just use your imagination and creativity.
Step 2 - Slice and Dice Your Tooltip
For this particular design, you will need to slice the tooltip into 3 different images. This particular design will need a PNG to preserve transparency. 1) The top piece. 2) A thin 1 pixel slice that will repeat vertically in the middle. 3) The bottom piece. The 4th part of the diagram below shows the three pieces after they were cut out.
Place these image files into a folder named "images".
Note: Internet Explorer does NOT like PNG transparency. Even IE 7 only partially supports it. If you animate a PNG with JavaScript, any area with transparency will turn black momentarily while in movement. I'm using this design knowing full well it will have issues in IE that are hard to work around.
Step 3 - Write the HTML/CSS Markup
With the images sliced, we can move on to the HTML and CSS markup. This will be the easiest part of the whole tutorial.
The HTML
This HTML markup will soon be moved into an external JavaScript file, so just type this in whatever is most convenient and can be referred to later.
<div class="tip"> <div class="tipMid"></div> <div class="tipBtm"></div> </div>
There are three div tags. Two nested inside a parent. The first div, "tip" will be used to hold everything together
and display the top portion of the tooltip, tipTop.png.
"tipMid" will eventually hold the text that the tooltip will display. It will also have tipMid.png repeating vertically inside it.
"tipBtm" is solely there to display the bottom portion of the tooltip, tipBtm.png.
Inside of index.html, add a bunch of filler text and some elements with their title attributes filled out. Such as:
This is a link
In the head of index.html, you will need to link to the stylesheet and the two JavaScript files.
<link href="style.css" rel="stylesheet" type="text/css" media="all" /> <script type="text/javascript" src="jquery-1.3.1.min.js"></script> <script type="text/javascript" src="jquery.betterTooltip.js"></script>
The CSS
The CSS used for this tooltip is relatively simple, just add the following to style.css
.tip {
width: 212px;
padding-top: 37px;
display: none;
position: absolute;
background: transparent url(images/tipTop.png) no-repeat top;}
.tipMid {background: transparent url(images/tipMid.png) repeat-y; padding: 0 25px 20px 25px;}
.tipBtm {background: transparent url(images/tipBtm.png) no-repeat bottom; height: 32px;}
Let me explain the above.
The wrapping element, .tip, is used to hold everything together. It has a top padding of 37 pixels. That's the height of the image in the background. The padding will push the child elements down to reveal the image behind. It also has a position absolute so that we can move it around on top of the page content.
The other two classes simply have a background image and, in the case of .topMid, padding to give the content that will be placed inside, some room to breathe.
Step 4 - Why a Plugin?
jQuery is pretty cool by itself. But the real magic is in extending it with a plugin. When you put your code into a plugin, you are making it reusable. That way you can build up a code library and never write the same code twice.
Here is the tooltip plugin in its entirety:
$.fn.betterTooltip = function(options){
/* Setup the options for the tooltip that can be
accessed from outside the plugin */
var defaults = {
speed: 200,
delay: 300
};
var options = $.extend(defaults, options);
/* Create a function that builds the tooltip
markup. Then, prepend the tooltip to the body */
getTip = function() {
var tTip =
"<div class='tip'>" +
"<div class='tipMid'>" +
"</div>" +
"<div class='tipBtm'></div>" +
"</div>";
return tTip;
}
$("body").prepend(getTip());
/* Give each item with the class associated with
the plugin the ability to call the tooltip */
$(this).each(function(){
var $this = $(this);
var tip = $('.tip');
var tipInner = $('.tip .tipMid');
var tTitle = (this.title);
this.title = "";
var offset = $(this).offset();
var tLeft = offset.left;
var tTop = offset.top;
var tWidth = $this.width();
var tHeight = $this.height();
/* Mouse over and out functions*/
$this.hover(function() {
tipInner.html(tTitle);
setTip(tTop, tLeft);
setTimer();
},
function() {
stopTimer();
tip.hide();
}
);
/* Delay the fade-in animation of the tooltip */
setTimer = function() {
$this.showTipTimer = setInterval("showTip()", defaults.delay);
}
stopTimer = function() {
clearInterval($this.showTipTimer);
}
/* Position the tooltip relative to the class
associated with the tooltip */
setTip = function(top, left){
var topOffset = tip.height();
var xTip = (left-30)+"px";
var yTip = (top-topOffset-60)+"px";
tip.css({'top' : yTip, 'left' : xTip});
}
/* This function stops the timer and creates the
fade-in animation */
showTip = function(){
stopTimer();
tip.animate({"top": "+=20px", "opacity": "toggle"}, defaults.speed);
}
});
};
Step 5 - Write the Plugin
Now that you've seen what the code looks like, it's time to dissect it. To get started, create a .js file and name it jquery.betterTooltip.js to make it compliant with jQuery plugin standards.
Inside that .js file, include the following code:
$.fn.betterTooltip = function(){
});
This creates a public function that can be invoked from the head of a document or
another external .js file. To invoke your plugin, you need to call the follow line from within a
$(document).ready page event.
$(document).ready(function(){
$('.tTip').betterTooltip();
});
The above line will attach the plugin to every element with the class name of "tTip". Likewise, you could attach it to any element of your choosing.
Expose the Plugin Settings
In order to prevent having to modify the plugin for every project it's important to expose some of the variables and settings so they can be tweaked from outside the plugin itself. The ultimate goal would be to never touch the plugin, just adjust its settings. To do this, add the following to that first chunk of code:
$.fn.betterTooltip = function(options){
/* Setup the options for the tooltip that can be
accessed from outside */
var defaults = {
speed: 200,
delay: 300
};
var options = $.extend(defaults, options);
});
This allows the settings "speed" and "delay" to be modified when the plugin is invoked like this:
$('.tTip').betterTooltip({speed: 600, delay: 600});
These are completely optional. If not specified, the plugin will use the default values.
Inject the Tooltip Markup
Remember that HTML you typed up for the tooltip? It will now make its official appearance.
In this chunck of code, the jQuery "prepend" content manipulation is used to inject the tooltip
immediately after the opening body tag. This way we can make sure that the tooltip
is positioned on top of everything.
/* Create a function that builds the tooltip
markup. Then, prepend the tooltip to the body */
getTip = function() {
var tTip =
"<div class='tip'>" +
"<div class='tipMid'>" +
"</div>" +
"<div class='tipBtm'></div>" +
"</div>";
return tTip;
}
$("body").prepend(getTip());
The $(this).each function
This is one of the most important and useful aspects of a jQuery plugin. The $(this).each function loops through each page element that is associated with the plugin when it was evoked. In this case it's all elements with the "tTip" class. When it loops through each element it applies the properties and methods that you specify.
$(this).each(function(){
var $this = $(this);
var tip = $('.tip');
var tipInner = $('.tip .tipMid');
var tTitle = (this.title);
this.title = "";
var offset = $(this).offset();
var tLeft = offset.left;
var tTop = offset.top;
var tWidth = $this.width();
var tHeight = $this.height();
/* Mouse over and out functions*/
$this.hover(function() {
tipInner.html(tTitle);
setTip(tTop, tLeft);
setTimer();
},
function() {
stopTimer();
tip.hide();
}
);
This is fairly simple. The top half consists of a bunch of properties for the height, width, x & y position and even the title attribute value of the "tTip" elements. I'm using the jQuery offset() CSS method to grab the top and left position. There is also a hover function assigned to each "tTip" class that calls methods on mouse over and out. These methods will be described further down in the tutorial.
One important part of the $(this).each function is this line of code here that removes the title attribute:
this.title = "";
The whole point of this tooltip is to swap the generic tooltip with a better eye catching version. If you don't remove the title attribute, which the browser uses to generate the generic tooltip, you will get duel tooltips. Like this:
Delay the Fade-in Animation of the Tooltip
/* Delay the fade-in animation of the tooltip */
setTimer = function() {
$this.showTipTimer = setInterval("showTip()", defaults.delay);
}
stopTimer = function() {
clearInterval($this.showTipTimer);
}
These two methods, setTimer and stopTimer are used to create a delay from when the user hovers their cursor over the element with the "tTip" class and when the tooltip makes its appearance. This is important to avoid annoying users. I'm sure we all share the frustration when we accidentally hover over one of those pop-up ads that are hidden in the content of sites.
The setTimer method creates a setInterval object that calls "showTip()" after the allotted time has passed. In order for setInterval to not loop infinitely, the method stopTimer is called to stop the setInterval object.
Position the Tooltip
/* Position the tooltip relative to the class
associated with the tooltip */
setTip = function(top, left){
var topOffset = tip.height();
var xTip = (left-30)+"px";
var yTip = (top-topOffset-60)+"px";
tip.css({'top' : yTip, 'left' : xTip});
}
The hover function inside the $(this).each loop, that was created earlier, calls setTip(). Its purpose is to position the tooltip directly above "tTip" element. This is done prior to the fade-in animation.
Tooltip Fade-in Animation
/* This function stops the timer and creates the
fade-in animation */
showTip = function(){
stopTimer();
tip.animate({"top": "+=20px", "opacity": "toggle"}, defaults.speed);
}
});
};
Last but not least, the showTip() function. This uses jQuery's animate() UI effect to fade the tooltip in while simultaneously sliding it down.
Wrapping it Up. . .
Once you are done and happy with your results, you can move your plugin from the basic HTML page full of filler text to the real world and put it to use.
This is a very basic example of what a tooltip plugin can do. The fun part now will be to make it more robust. There are all sorts of ways to expand this plugin. A needed enhancement would be detecting the location of the tooltip in relation to the boundaries of the browser window and displaying the tooltip accordingly so it doesn't get cut off.
Thanks for reading this tutorial. I hope it shed some light on how you can use jQuery to enhance your website's interface.
Let the comments begin! I want to hear what you think. Does this technique actually help users get around easier, or is it just another annoyance?
- Subscribe to the NETTUTS RSS Feed for more daily web development tuts and articles.
Related Posts
Check out some more great tutorials and articles that you might like
Plus Members
Source Files, Bonus Tutorials and
More for $9 a month for all TUTS+
sites in one subscription.












User Comments
( ADD YOURS )Chris April 1st
Great tutorial! Cant get enought of jquery tutorials.
The tooltip in the demo does not shows up a bit off to the left in IE 7.0, just to let you know
( )iPad April 1st
Great great plug in, lets give it a try
thanks
( )Yoosuf April 1st
nice stuff, ut yesterday i tried this, but u have added some nice graphick bg, keep it up
( )qalih April 1st
Yep very nice, was looking into javascript tool tips for my new project.
( )Colin McFadden April 1st
Great tutorial! Definitely going to be using this soon!
( )Vincent April 1st
Wonderful, it’s soooooooo cooooooool!!!!
( )w1sh April 1st
Cool tutorial.
( )Is Saturday a week day?
ciprian April 1st
Great tutorial Jon
( )insic April 1st
wow cool effect.
( )Diego April 1st
Well done, thanks alot
( )crysfel April 1st
this is a good!! i like this tut!!
( )chris April 1st
Thanx. Just what I need today
( )saurabh shah April 1st
wow ! cool effect.. nice one…
( )Abhijit April 1st
Now this one is a great tutorial. We need more like this
( )Liam McCabe April 2nd
Very cool
( )Snorri - Css April 2nd
cool tut. but the position for the tool tip is a bit off
try resize your browsers window bigger than 1024×768 and do a mouse over and you see what i mean.
( )Rob April 2nd
Yeah that is indeed a big FAIL. I stretched the window wide and the results were terrible.
( )Jon April 2nd
Thanks for bringing that up. It appears that the tooltip isn’t getting along with the layout. Probably something to do with the positioned clouds. It behaves normally in a standard layout but I will address this issue.
Sirwan April 2nd
how will we know you updated it ?
Jon April 2nd
Good question. This is my first article here on nettuts and I’m not sure how that would work yet. You can follow me on twitter @joncazier though and I’ll update the status of things there.
Jason Kealey April 16th
I’m waiting for this fix too!
IBod April 2nd
On ie7 there are some problems, probably png 32 on this browser don’t support alpha.
Someone have the solution??!?!?!
( )Mike July 2nd
I use super-sleight to fix the PNG problems on IE. It’s pretty lightweight and works well – just include it in your head with conditional comments for IE. Google supersleight png fix
( )BroOf April 2nd
Lovely outcome! I can’t get enough of jQuery tutorials. Thanks!
( )bastian April 2nd
nice tutorial and plugin, but there are two things which probably could/should be improved.
A convention for jQuery plugins is that they always should return the jQuery object, so you can use chaining.
Check: http://docs.jquery.com/Plugins/Authoring (right on top)
the second thing is that the functions settip, showTip, etc. are visible outside of the plugin, which isn’t really necessary in this case.
( )Just chnage the code from
showtip = function() …;
to
var showTip = function() …;
and tehy are just visible in the scope of the plugin.
Jon April 2nd
Thanks for pointing that out. I’ll be sure to update the code from all the feedback I’m getting.
( )Fred Campbell April 2nd
Wow! Is there anything that jQuery can’t do? Keep the great tutorials coming!
( )Sirwan April 2nd
will come in useful thanks alot!
( )rafaelrrp April 2nd
Great tutorial!!!!
Thx!
( )Martyn April 2nd
Great tutorial,
Nice tips, I look forward to giving it a try.
( )James April 2nd
You’ve forgotten to preceed your function declarations with “var” meaning that each of them (”setTip”, “getTip”, “setTimer” etc.) will be made into global variables instead of private variables within the scope of he outer function. Why not just use the conventional function declaration syntax? (i.e. function theName(arg1, arg2) {…} ) – using this method ensures that the functions will be parsed before execution time, all you’re currently doing is creating anonymous functions and assigning them to variables.
Also, you should be using setTimeout instead of setInterval.
( )James April 2nd
You’ve also forgotten to return the jQuery object from your plugin – this is required so that the plugin is chain-able.
( )Jon April 2nd
Hey James, thanks for bringing these issues up. I’ll be updating the plugin with all the feedback and issues that you guys are bringing up.
( )Marshall April 2nd
Was comparing your tooltip with another that was on Delicious earlier today: http://www.filamentgroup.com/lab/image_free_css_tooltip_pointers_a_use_for_polygonal_css/
Liked the riddles on the clouds demo page … wish there were new ones upon refresh though …
( )Merijn April 2nd
That was nice indeed. I kinda already build my own tag cloud, however, mine`s all static, with no transparant images, might give your idea a try sometime! Keep it up
( )Jeff Dion April 2nd
Nice effect and i finally know how to develop a jQuery pluggin, thanks a lot for taking the time to publish this tut
( )Diego SA April 2nd
Awsome, nice effect. But I’d change the size of the tip, it looks too big.
( )Rahul Chowdhury April 2nd
Hey dude, this is awesome, this is a perfect choice for Webmasters Thanks for it.
( )Hugo April 2nd
Woho, great tut, thanks
( )Joe McCann April 2nd
Very nice. The only issue is when the screen resizes or when a user scrolls down on the page and then hovers over the tip. The tip is above the viewport or out of position (on resize). I’ve written a tooltip that will flip underneath when this happens…
( )Jon April 2nd
Hi Joe, good feedback. This is a greatly needed feature, but I left it out for the sake of simplicity.
( )Krod April 6th
Nice job. I want to use this on a site I am rebuilding but the fact the tooltip goes above the viewport is the only thing stopping me. Any way of fixing that, or explaining how to fix it?
Thanks again
Chris April 2nd
Very well written and thought out. One of the best on here.
( )Philo April 2nd
Nice Tutorial!
( )T-Law April 2nd
Awesome, thanks
( )Montana Flynn April 2nd
It would be nice to have the PSD file, I am not much good at slicing. Otherwise great tut, thanks!
( )Jon April 2nd
Send me an email to jon at 3nhanced.com and I can get the files to you.
( )lawrence77 April 3rd
Jon your Avatar was so nice…..
Can I have a copy?
laranz.joe@gmail.com
zik April 2nd
Reaaaally cool effects, and well made tutorial.
Thanks a lot and grats !
( )Ferdy April 2nd
Simply awesome, at a time when I need this for a project!
( )Hazel Q. April 2nd
Great tutorial! thanks
( )Hung Bui April 2nd
i think this one is quite sweet! Thanks for sharing.
( )Mike April 2nd
finally a good tutorial for free!! Lately there were good tutorials for paid members only
( )AdrianMG April 2nd
Here is my example of how to build a tip plugin: http://yensdesign.com/2009/01/how-to-display-tips-creating-jquery-plugin/
( )Radoslav Stankov April 2nd
Overall this is good tutorial. But I have some comments about it:
( )1. this should be wrapped with closure, with jquery as argument, so if somebody uses jQuery.noConflict() and $ != jQuery, the plugin will still work
2. getTip, setTimer, stopTimer, setTip, showTip – become global functions! So the second execution of betterTooltip, the first tooltips won’t work
3. the betterTooltip must return $(this), for possible chaining
4. it is good to use jQuery.data, not creating, a showTipTimer reference, to jquery instance
5. you could not have more than one tooltip element [ $('.tip'), $('.tip .tipMid') ] on page, but on every calling you create an dom node for a tip [ $("body").prepend(getTip()); ]
Moksha Solutions April 2nd
Thanks good tutorial lot to learn
( )luk April 15th
heh
( )Maicon April 2nd
awesome. very well explained!
( )b00m April 2nd
Awesomeness! Smooth! Tnx, Gud tut.:)
( )Nikhil - Powerusers April 2nd
Great tutorial!
( )Thanks…
lawrence77 April 2nd
Awesome Effect…
( )I always love Tooltips!
Alan April 3rd
Really nice tut already started using the idea is some projects but as some of the lads have said tehres a few little issues with it… sepecially the one where it sometimes miss reads the X/Y px of the screen size. if you could get it updated would be really cool. thanks again..
( )Srikanth Dhondi April 4th
Really impressive tool tip. I always loved ‘JQuery’. I use this tutorial for my application. thanks
( )Khro April 5th
Very nice! (a good example of using PNG as well)
( )plisvb April 6th
Tooltip is completely off in safari on the mac, firefox is fine, ie8 is ok but there’s a little black flash of the transparent part of the images before it corrects itself. Would be interested if an update happened too.
Good job
( )AlfredN April 7th
Nice one with the plugin; thanks guys.
( )Keay April 10th
Great work….Jquery is always cool!!
( )nurettin April 15th
i like it. this script very good
( )SohoInteractive April 16th
Another awesome plugin. very easy to customize.
for ie6, you will need to use pngfix script
K.
( )Sebastian Rumberg April 16th
At first I was really excited about this tooltip-plugin (and it is still pretty awesome), but unfortunately there is not much use for this plugin right now, especially with the fixed window-size. Therefore it would be great to see this project develop. I’m sure many people can learn a lot from this
All the best!
( )Sebastian
Jhon Doe April 21st
Great tutorial!
( )vivek kr. singh April 27th
Thanks ,
( )Very usefull and it’s important for every developer.
Sinope April 28th
Thanks !!
( )it’s a wonderful tutorial
Andy April 28th
This tutorial really helped me with jquery, after watching the 15 Days of JQuery screencasts I managed to fix a problem I had with the tooltips stuttering by changing :
$this.hover(function()
$this.stop().hover(function()
This stopped the animations overlapping when tooltips were close together
( )jack May 5th
NOT Wokring IN IE 6
PNG DOES’nt transparent….
but its Nice tutorial.
Any ONE KNOW HOW 2 work on IE 6…
( )DoFollow Social Bookmarking May 9th
I’m trying to get better at jQuery at this tutorial has just helped me a bunch.
( )Zoran May 18th
Great tut! Anyway, I’m looking for solution to get some content into this cloud … I want to put some icons (for RSS and SiteMap) and links for it … do I have some possibility with this script?
( )Francesco Aloisio May 19th
Great Tutorial, is there anyway to load content to populate the tooltip with an external file? Just like this script does?
( )thanks
Francesco Aloisio May 19th
Great Tutorial, is there anyway to load content to populate the tooltip with an external file? Just like this script does>>http://www.codylindley.com/blogstuff/js/jtip/?
( )thanks
Alvi May 27th
Nice work,
( )but is there a possibility to change the text without reloading the whole page?
DynamicGuru June 2nd
Nice one…Some issues with IE 6 though,,,
( )i really hate IE 6 (and its creators too)
Mike July 2nd
What kind of issues are you getting? I found that the central part of the tooltip didn’t show on IE6 so I made it a .gif file instead, and that fixed it. And yes, IE is the bane of my life too.
( )James June 12th
Nicely done! There is an issue when you load the page and you hover over one of the clouds to see where the tooltip loads, then resize your browser and hover again and you’ll see that the tip moves… is there anyway to lock it relative to where it’s hovering from?
( )RaMo June 26th
Very Very Good.
( )Very useful .
Hrishi July 20th
amazing…cool tool tips
( )anna July 30th
I tried your tooltip script on my web page. There is no tooltip appeared inside the tabbed panels but it works outside the tabbed panels on the same page. How do I do a turnaround for the tabbed panels?
( )Nitin September 20th
Very Nice Tooltip.. By far one of the best tooltip.
I just have to add one thing. It would have been better if you could have shared the PSD file of the image used in tooltip.
This would allow us to customize the way tooltip looks…
If you can share it please mail it me.
( )Joe October 11th
This should come in useful!
( )giancarlo November 6th
If i want to remove the tooltip, can i do it?
( )For example, after 1 minute, dont show the tooltip… it’s possible?