Simple jQuery Modal Window Tutorial

Written by Kevin Liew on 17 Mar 2009
669,693 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
Jeremy 13 years ago
Thanks for this tutorial. It helped me when I was trying to make a modal for for a Wordpress plugin. I made a few changes for my needs. My problem was that my page scrolled and I wanted to prevent the page from scrolling. I also had a problem with the mask not properly being displayed in the admin section of Wordpress so I was able to isolate this and solve the issue. I hope you find this useful although I am not sure how this will be displayed properly with no HTML in the comments... but I'll give it a try anyways (due to the character limitation I will only be able to show my changes.)

In the open:
First I added top to adjust for page scroll
//Set height and width to mask to fill up the whole screen
jQuery('#mask').css({'width':maskWidth,'height':maskHeight, 'top':jQuery(window).scrollTop()});

Then I locked the srollbar after the fadein
// lock scroll position
var scrollPosition = [
self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
];
var html = jQuery('html'); // IE7 friendly
html.data('scroll-position', scrollPosition);
html.data('previous-overflow', html.css('overflow'));
html.css('overflow', 'hidden');
window.scrollTo(scrollPosition[0], scrollPosition[1]);

Now in the bottom of close:
// un-lock scroll position
var html = jQuery('html');
var scrollPosition = html.data('scroll-position');
html.css('overflow', html.data('previous-overflow'));
Reply
Deepak 13 years ago
@Steele

You seems to have miss one line at the bottom which has masking, look at the entire block of <div id="boxes"> and go to bottom and before this <div> get closed you need to paste
<div style="width: 1280px; height: 794px; display: none; opacity: 0.8;" id="mask"></div>
This will help you to get the mask.
Reply
Tomasz Rybak 13 years ago
Thanks for tutorial! In zip file is an iisue

//if close button is clicked
$('.window #close').click(function () {
$('#mask').hide();
$('.window').hide();
});

The button should have id not class.
So...
<input type="button" value="Close it" id="close"/>
and it works
Reply
Amit 13 years ago
A dropdownlist SelectedIndexChanges event doesn't fire from inside of the modal window. It only posts back as the AutoPostback is set to true. How can I fix this? Thanks for a simple and great modal window
Reply
vijay 13 years ago
good popup
Reply
Michelle 13 years ago
Fantastic! Best modal box I found so far. Set up in 5 minutes and works perfectly.
Reply
naffripperz 13 years ago
Thanks a lot for tutorial.
it's very help me (y)
Reply
Dinesh 13 years ago
Awesome script . Learn a lot
Reply
Bryan CS 13 years ago
Thanks so much to this, will be adding this feature to my blog.
Reply
sourabh 13 years ago
i am trying to open registration page in pop-up in multi-steps, what i want is when i click on submit from one page it re-direct me to second page in same pop-up
Reply
Kevin Liew Admin 13 years ago
I dont think that will be the best solution, you need ajax here to replace the content of the modal instead of redirecting the user to a new page.
Reply
patrick 13 years ago
It's works perfect in Chrome and FF, but very bad in IE9. ¿Someone with the same issue that could help me?
Reply
Patrick 13 years ago
Dismiss my last message, was a problem of mine, the modal window works perfectly on IE, FF, and Chrome, Thanks for share.
Reply
Mario 13 years ago
Hello Patrick, I have the same problem with IE9. How do you fix that? Thanks a lot.
Reply
faraz 13 years ago
nice tutor, thks
Reply