Simple jQuery Modal Window Tutorial

Written by Kevin Liew on 17 Mar 2009
674,827 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
Ryan S 14 years ago
thanks for sharing it help me a lot, I’ve use the pop up idea in my upcoming tutorial.
Reply
Kjetil 14 years ago
Nice work, man!

Is it possible to make the modal box scrollable like Pinterest? Basically freeze the background and make the modal box scrollable.
Reply
Kevin Liew Admin 14 years ago
I get what you mean, it kinda hard though and it needs a lot of modification to the existing script.
Reply
T Ace 14 years ago
Thanks much. My second foray into jQ. However, after I have cut and pasted into my editor, the mask does not darken the original link to the modal, but begins beneath the link. Any help?
Reply
Sven 14 years ago
Hey!
You did a great job. Works very well and a good documentation!
Will suit perfectly with my project (login modal window) :)
Thanks!
Reply
Jose 14 years ago
it's awesome to have this codes....... :)
Reply
Siva 14 years ago
Its prety good stuff. I am in a great need of using this type of Modal window in one of our News letter.
I have Problem. Will it be possible to add Scroll bar for this modal window?
if so can please let me know how to do it.

Thanks
Reply
Kevin Liew Admin 14 years ago
If you set the overflow to auto, it should display a scrollbar

#boxes #dialog {
width:375px;
height:203px;
overflow:auto;
}
Reply
Suma Gowda 14 years ago
Quick and easy....thanks
Reply
Gina 14 years ago
Hi,
I love the Modal window, works without problem. Thank you!
I have very limited knowledge of scripting. Can you tell me how to make the modal window open on loading the page?
I would very much appreciate it.
Reply
Gervase 14 years ago
Gina: I think this will do it.
replace this

$('a[name=modal]').click(function(e) {
//Cancel the link behavior
e.preventDefault();
//Get the A tag
var id = $(this).attr('href');

with
$('body').ready(function() {
var id = $('#dialog');
Reply
Chris Creighton 14 years ago
Hi Kevin,

Just wanted to say thank you for this script you provided, it's working quite well for my project.

I wanted to share a problem I ran into and offer my simple solution, that took me hours to figure out.

I have an image that takes up most of the screen (width:824 height:624), when the page was initially loaded the image was half off the top of the screen. When I would shrink (readjust width or height) of the browser the image would center as it should have initially.

What ended up correcting the problem was by adding the resize function into the launchWindow function:
//Set the popup window to center
$(id).css('top', winH/2-$(id).height());
$(id).css('left', winW/2-$(id).width()/2);
$(window).resize();
//transition effect
$(id).fadeIn(2000);

So now when I open the webpage initially it centers the image perfectly from the start. I know very little about javascript so I am open to a better solution. Hope this helps save someone hours of frustration. Regards.





Reply
Gina 14 years ago
Hi,
I love the Modal window, works without problem. Thank you!
I have very limited knowledge of scripting. Can you tell me how to make the modal window open on loading the page?
I would very much appreciate it.
Reply
Kevin Liew Admin 14 years ago
Please read section 4. Launch modal window with Javascript.
Reply
nico 14 years ago
is it possible to add some text AND 2 buttons to the window? thnx
Reply
Kevin Liew Admin 14 years ago
The content of the modal is fully control by you. This script basically popup up the content.
Reply
Jon Lowrey 14 years ago
I've seen a couple of ppl post that the mask begins below their anchor tag instead of covering their entire page. Here is how I fixed it for my site. I had the same problem. Not sure why since I copied and pasted it into my site but I wonder if my tabbed panels were interfering. Anyway I added this into the script and it now covers the site properly.

$('#mask').css('top',  winH/2-$('#mask').height()/2);
 $('#mask').css('left', winW/2-$('#mask').width()/2);

This centers it over the site the same way the popup window is centered. Since the mask is the same size as the screen it will force it to be centered over the highest possible space. Not sure how this will effect window resizing and such.
Reply
Jay 14 years ago
I'm having this problem with the mask beginning after the anchor tag. I tried adding Jon Lowery's code, but it hasn't fixed the problem. Where should those two lines be added? Are they replacing any lines?
Reply
entusiast 14 years ago
I like the good documentation, that helped me install the Modal window and it works without problem. Thank you!
I have very limited knowledge of scripting. I would like to have the Modal window open when the page loads.
I’ll be very grateful if you explain how to do that.
Reply
Kevin Liew Admin 14 years ago
You can find the info bout it in 4. Launch modal window with Javascript section.
Reply
Enthusiast 14 years ago
Thank you very much.
It works!
Reply