Tutorials

Simple jQuery Modal Window Tutorial

Written by Kevin Liew on 17 Mar 2009
484,566 Views • Shares
797 comments

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
Nicolas 9 years ago
@kevin : No. Actually, I'd like to use this code, but not by a clic.
The "pop up" launches when you clic on a link.

Or I'd like to launch it when the empty test of my fields is true.

I guess, the only thing to change is the beginning but I'm a noob in Ajax, and my english is maybe not good enough to explain what I'd like to do.
Reply
kevin Admin 9 years ago
@Nicholas: Ok, getting there. But I don't understand what you meant by "empty test of my field". Do you mind to elaborate more about it? I'm ready to help. : )
Reply
Markvoce 9 years ago
Just a quick query, when I click the link the popup box is appearing in the center however on a long page, the page is scrolled to the bottom. Any guesses. I have tried winH = $(document).height(); as mentioned in the updates.
Reply
kevin Admin 9 years ago
@Markvoce: Hey, I think I solved your problem, please check the updated code : )
Reply
Markvoce 9 years ago
@kevin, I have tried what you suggested, the modal box now appears at the top of the window and the page scrolls down half way.

If I exclude the $(id).css('top', winH/2-$(id).height()); line the modal box appears at the top of the page with no scrolling.
Reply
kevin Admin 9 years ago
I think you have to calculate the position by getting your modal window's height. Do you mind to show me your example?
Reply
Markvoce 9 years ago
@kevin, yeah sure you can view it at
http://timepg.com/test/test.htm
The link below the first paragraph.
Reply
kevin Admin 9 years ago
Right, I saw it, you want it to display in the middle of the screen? and hey, I think you may want to put the e.preventDefault() under this as well:

$('a[name=modal]').click(function(e) {
......
});
Reply
Markvoce 9 years ago
Yes the idea would be for the modal window to appear in the middle, no matter where the page is scrolled to. Cheers
Reply
Nicolas 9 years ago
@kevin.
It's nice to help me.
Actually I have a JS function :

function verifAll(form)
{
var formulaire_ok = true;
var imgs = form.getElementsByClassName("verif");
for(var i=0; i
Reply
kevin Admin 9 years ago
@Nicolas: I think I know what you mean. Instead of launching it using Link, you want to launch by using javascript calling the modal window.

In order to do that, 2 things you have to do:
- move the modal window code to a new function
- remove the anchor tag detection code

So, I have created the example for you, view source to see the code. Hope this will finally meet your needs. : ) Cheers!

Launch target="_blank" rel="nofollow">http://www.queness.com/resources/html/modal/jquery-modal-window2.html">Launch Modal Window with Javascript
Reply
Nicolas 9 years ago
It's me again.
Sorry to disturb.

I have a question and a problem.

My problem is that it doesn't work with IE but your example works with IE. I don't understand why.

And my question is : My dialog box is just used with an ok to close it. It doesn't work with my keyboard. I would like to put enter to close. Do you know if it is possible ?

Thanks a lot.
Reply
kevin Admin 9 years ago
@Mark J: Hi mark, It was a small mistake, now it's working now. I have changed:
#boxes .window {
position:absolute;
......
}

The PNG background is not displaying correctly tho, you will need pngFix for it. (hate ie6)

@Nicolas: Not sure what is happening to your version. You might have to check carefully. Again, try the position:absolute as well.

For your question, add this, and it will work : )

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