Simple jQuery Modal Window Tutorial

Written by Kevin Liew on 17 Mar 2009
660,032 Views • Tutorials

Introduction

In this tutorial, I'm going to share how to create a simple modal window with jQuery. I like jQuery, it makes everything so simple and so easy. In case you don't know what's modal window. You can click here. That's an example of a modal window.

In this website, I'm using facebox (inspiration from facebook). Others, such as lightbox, thickbox, multibox, litebox...... it's too many of them and they all are having different features.

Right, let's start, this example will show you how to create a modal window that will display the content of a DIV #ID.

My objectives are:

  • Able to search the whole html document for A tag NAME="modal" attribute, so when users click on it, it will display the content of DIV #ID in the HREF attribute in Modal Window.
  • A mask that will fill the whole screen.
  • Modal windows that is simple and easy to modify.
Advertisement

1. HTML code and A tag attributes

<!-- #dialog is the id of a DIV defined in the code below -->
<a href="#dialog" name="modal">Simple Modal Window</a>

<div id="boxes">

	
	<!-- #customize your modal window here -->

	<div id="dialog" class="window">
		<b>Testing of Modal Window</b> | 
		
		<!-- close button is defined as close class -->
		<a href="#" class="close">Close it</a>

	</div>

	
	<!-- Do not remove div#mask, because you'll need it to fill the whole screen -->	
 	<div id="mask"></div>
</div>

2. CSS code

<style>

/* Z-index of #mask must lower than #boxes .window */
#mask {
  position:absolute;
  z-index:9000;
  background-color:#000;
  display:none;
}
  
#boxes .window {
  position:fixed;
  width:440px;
  height:200px;
  display:none;
  z-index:9999;
  padding:20px;
}


/* Customize your modal window here, you can add background image too */
#boxes #dialog {
  width:375px; 
  height:203px;
}
</style>

3. Javascript

<script>

$(document).ready(function() {	

	//select all the a tag with name equal to modal
	$('a[name=modal]').click(function(e) {
		//Cancel the link behavior
		e.preventDefault();
		//Get the A tag
		var id = $(this).attr('href');
	
		//Get the screen height and width
		var maskHeight = $(document).height();
		var maskWidth = $(window).width();
	
		//Set height and width to mask to fill up the whole screen
		$('#mask').css({'width':maskWidth,'height':maskHeight});
		
		//transition effect		
		$('#mask').fadeIn(1000);	
		$('#mask').fadeTo("slow",0.8);	
	
		//Get the window height and width
		var winH = $(window).height();
		var winW = $(window).width();
              
		//Set the popup window to center
		$(id).css('top',  winH/2-$(id).height()/2);
		$(id).css('left', winW/2-$(id).width()/2);
	
		//transition effect
		$(id).fadeIn(2000); 
	
	});
	
	//if close button is clicked
	$('.window .close').click(function (e) {
		//Cancel the link behavior
		e.preventDefault();
		$('#mask, .window').hide();
	});		
	
	//if mask is clicked
	$('#mask').click(function () {
		$(this).hide();
		$('.window').hide();
	});			
	
});

</script>

It's very straight forward and easy to understand. Remember, you need to include jQuery framework.

Demonstration Download

4. Launch modal window with Javascript

Due to popular demand :), I have an example for it. The concept is simple. I wrapped the modal window script inside a function, and then you will able to call the modal window using javascript function call.

Yes, you will able to load the modal window on page load as well :)

$(document).ready(function () {
  //id is the ID for the DIV you want to display it as modal window
  launchWindow(id); 
});

Demonstration

And, if you want to close the modal window on key press, any keys you want, you can add the following function.

$(document).keyup(function(e) {
  if(e.keyCode == 13) {
    $('#mask').hide();
    $('.window').hide();
  }
});

Use Cookie on First Load

Another popular demand from readers and this is how you do it. You need two functions (createCookie and readCookie) from this post about web cookies

$(document).ready(function() {
//if the cookie hasLaunch is not set, then show the modal window
if (!readCookie('hasLaunch')) {
	//launch it
	launchWindow('#dialog1');		
	//then set the cookie, so next time the modal won't be displaying again.
	createCookie('hasLaunch', 1, 365);
}

});

Demonstration

Recalculate the Position of Modal window and mask on window resize

Don't know how I missed it, this is the code that reposition the modal window and recalculate the dimension of mask if user resized the windows.

$(document).ready(function () {
$(window).resize(function () {
 
 		var box = $('#boxes .window');
 
        //Get the screen height and width
        var maskHeight = $(document).height();
        var maskWidth = $(window).width();
      
        //Set height and width to mask to fill up the whole screen
        $('#mask').css({'width':maskWidth,'height':maskHeight});
               
        //Get the window height and width
        var winH = $(window).height();
        var winW = $(window).width();
 
        //Set the popup window to center
        box.css('top',  winH/2 - box.height()/2);
        box.css('left', winW/2 - box.width()/2);
 
});

});
I think I should make another post about modal window. :)

5. Conclusion

Yes, that's all you need to make a simple jquery modal window. In this tutorial, it shown you the concept of how to display DIV content inside a modal window. However, you can further develop it to accept a link and display it in an iFrame and image gallery.

For those who's looking for a fully customizable Modal Window, you can try my method, if you have any other questions, please let me know. Thanks for reading.

Update

29-2-2012: - Fixed auto resize, change modal window's position from absolute to fixed.

 

22-5-2009: - Added a new section "Activate modal window with Javascript"

16-4-2009: - If you prefer this article in Portuguese, please visit Simple jQuery Modal Window in Portuguese by Maujor

27-3-09: - Added e.preventDefault() to link to launch the modal window.
- Changed css position to fixed, so that the modal window also fixed to center. - Changed var winH = $(window).height(); to var winH = $(window).height();

24 Mar 09:
- Added e.preventDefault() to cancel the anchor link effect, we can also able to cancel it by removing the href attribute.
- Changed var winH = $(window).height(); to var winH = $(document).height();

Demo Download
Join the discussion

Comments will be moderated and rel="nofollow" will be added to all links. You can wrap your coding with [code][/code] to make use of built-in syntax highlighter.

797 comments
MarkJ 16 years ago
Ah, this is just what I was looking for, except I can't get it to work in IE6? The mask covers the modal window when I try to use it, so does the example you provided?
Reply
Nicolas 16 years ago
Thank you very much.
I had to modify it but now it works very well.
Reply
Raido 16 years ago
Hi! I wanted to say thanks for that example You made for Nicolas. It seems to fit for me quite well too. (I'm trying to open modal window when "Add new" is chosen from
list. :) )
Reply
Raido 16 years ago
By the way...when I have long page(scrollbar is visible) and when I'm at the end of the page, modal still appears at the beginning of the page. So I have to scroll up. Might it be my mistake or does this script just works that way ? :)
Reply
kevin Admin 16 years ago
That's the behaviour of the script, you can try to put position:fixed in the .window class. But it will cause some problem in ie6. Yea, just try that...
Reply
Raido 16 years ago
I'm still waiting for that day when IE6 will be ashes. :)
If You know CSS well, it's possible to find fixes for IE, but if You know basic CSS like me, then IE6 is real pain in the arse. :)
But yes, that position attribute fixed it ...and I'm going to ignore IE6 at this time. Actually it's quite good idea to make some complications to IE6 users...and there should be a small note: "If You encounter any bugs on the site, know, that they are because of the browser You are using. " It's called browser racism. :)
Once again, thank You Kevin.
Reply
kevin Admin 16 years ago
@Raido: you're welcome. haha, out there, they have petition to ban ie6! : ) ie6 has been causing heaps of problems.

Btw, hey, you actually can try this, after the window class add this line:

*html #boxes .window {
position:absolute;
}

only ie6 will able to interpret that line. So, all the browsers will use position:fixed except ie6. Of course, you will have the scrolling problem in ie6, but hey it will be far more better than couldn't display it at all! :)
Reply
Raido 16 years ago
Thanks, I might try that. Today it's unfortunately impossible.
And talking about IE6, today I was sent a link: http://www.saveie6.com/

Kinda ironic. :)
Reply
kevin Admin 16 years ago
haha.. that's hilarious. look at this one:
http://www.stopie6.com/

I read an article from arctechnica (forgot the link)... the usage of ie6 is dropping prominently, in Europe tho... so, yea, it's just a matter of time...
Reply
kevin Admin 16 years ago
@Nicolas: hi, I looked at your code... and it's killing me :P... I think the modal window is working, because I can launch it using:

<input type="button" onclick="launchWindow('#dialog')"/>

however, the position:fixed causing it display behind the mask, you might want to put it back as absolute in IE6.

So, there is nothing wrong with the modal window. I think is your validation script causing the problem. In ie6, when you click the "Envoyer le message" button, if you observe carefully, ie6 submit the form.
Reply
Nicolas 16 years ago
Hi Kevin, it's Nicolas again.
Actually, I tried but I don't understand why it doesn't launch on IE.
I upload the test, could you look and tell me what's wrong please ?

Link : http://devilangels.free.fr

Thanks for all.
Reply
Nicolas 16 years ago
Hi Kevin !

Everything is ok now. It works very well.
To close de window with enter (keyboard), your function didn't work.

However if you put :
$('.window .close').focus();

it works very well.

Thanks for everything.
Reply
kevin Admin 16 years ago
@Franco: I think you just have to put the CSS code inside your file. Make sure the #mask and #boxes are not duplicated. It should work :)
Reply