Simple jQuery Modal Window Tutorial

Written by Kevin Liew on 17 Mar 2009
674,905 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
kausar 15 years ago
its really nice, very helpful n easy to implement ... thanks body... i will try to customize model window.. on that time i may need some more help? anyway, well done .. thanks
Reply
Sammy 15 years ago
For those wanting to launch from a button, use
$('#btnSceenListDetail').click(function(e) {
Reply
richard 15 years ago
where do i put that code for the button?

can't get buttons to work!
Reply
Kevin Liew Admin 15 years ago
In the javascript section, line 6.. replace

$('a[name=modal]').click(function(e) {

to

$('#btnSceenListDetail').click(function(e) {
Reply
jonny 15 years ago
how do and ta for this tho, i'm having bother with safari and chrome. the mask is working but the dialog boxes aren't showing. it's fine in ff and amazingly ie. bit baffled. any ideas.
test page is
http://www.piggbydesign.co.uk/testportfolio.html
Reply
Kevin Liew Admin 15 years ago
I have tested it on chrome and safari, they are working. Does the demo version work for you?
Reply
Jay 15 years ago
have somebody tried this in IE8, model popup comes up and then just disappears.
Reply
Sammy 15 years ago
Very nice starting point. You made my life easier. Thank you.

A couple of points:

- There is no need for a separate background div. Combine your background window div with your display div to simplify. Borders, padding and other decorations can be added here. You probably don't need to mess with z-order (though I kept that in just in case).

Your divs could be named better. Why not popupWindow or popupDialog? Makes the code much easier to read.

But these are minor points. Thanks again for your tutorial.

Reply
Kevin Liew Admin 15 years ago
my bad on the naming and also html structure. This tutorial was 2 years ago.
Reply
daniel 15 years ago
the tab key is allowed even in the background panel, I mean you can move over the entiry document (dom elements). That is not correct.
Reply
Kevin Liew Admin 15 years ago
This can be solved with simple solution. Put keypress event and return false if tab key is press. For more details about this one, check out this post:

http://www.queness.com/code-snippet/6427/disable-spacebar-in-a-textfield-with-jquery
Reply
Kiseki 15 years ago
This is great thank you very much, is it possible for this to pop up automatically as the page loads?
Reply
Kevin Liew Admin 15 years ago
Yes, please read section 4 Launch modal window with Javascript.
Reply
coki 15 years ago
i really need your help how to wrap it into a function. i need to display this modal window when form loaded. can you please help me.
Reply
Shahid Mirza 15 years ago
Superb excellent very nice even we can insert swf in it. MashaAllah
Reply
Saja 15 years ago
Hello, is it possible to position the modal window in the center horizontally and 130 px from the top? I have been trying to figure it out for a couple of months and still can't get it to work
Reply
Kevin Liew Admin 15 years ago
yes, you can do that.. change this line to:

//Set the popup window to center
$(id).css('top', winH/2-$(id).height()/2);

to

//Set the popup window to center
$(id).css('top', 130);

that should do the trick :)
Reply
Ricker Silva 15 years ago
I just implemented it in a clean aspx page and it's not working, not with referred files ofr styles or script, not with inline styles and scripts. I tested it on ff last version
Reply
Kevin Liew Admin 15 years ago
does the demo work for you?
Reply
Ian 15 years ago
Great Tutorial, thanks.
Reply
Err 15 years ago
First of all, congratulations, it is awesome and very nice....i only have one question and it could be ring very stupid, but...anyways i want to know and hope you tell me hehehe...how can i open this window from a button??? thanks
Reply
mjvb 15 years ago
Hi, Thanks for the tutorial.. I'm implementing it but having problem with the flash object. The flash object doesn't covered by the mask. I already tried to adjust the z-index but still haven't get what the display I want. Can you help me?
Reply
Stevs.net 15 years ago
In the Flash object add < parameter="wmode" value="opaque" >
Reply