Simple jQuery Modal Window Tutorial

Written by Kevin Liew on 17 Mar 2009
674,871 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
Vic Dinovici 14 years ago
#mask has to have a defined value otherwise will stay in the middle of nowhere. I used top:0; margin:0;

Another thing is, the window stays at the top screen, if the link to modal is down on page you won't see it. Any workaround to make it stay centered based on the position of the link on the page?

Thanks, awesome tut! Is inspiring me for years!

Cheers from Toronto!
Reply
Kevin Liew Admin 14 years ago
You can change this:
#boxes .window {
position:absolute;
....
}

to position:fixed.
Reply
Jason Allum 14 years ago
Hi, great tutorial, simple easy to understand code. I have this working on a website I'm working, using only the simple modal and adding my custom form to it. My issue is that I can't seem to change the size of the modal. I tried changing the #dialog .window height and width but it does not affect the modal's size. Any suggestions?
Reply
Jason Allum 14 years ago
Oh forget about my stupid question a few minutes ago, I should have known I was supposed 2 change #boxes #dialog and not window's height and width,
Reply
Brightson 14 years ago
Hi Kevin,
Its really good script thanks for this.
Am facing a problem when i tried to open on page load,
let me know what mistake am doing!!!
Reply
Kevin Liew Admin 14 years ago
Guru 14 years ago
Thanks a lot for this popup.. it works fine.. i am facing a problem... on adding another jquery function (TINY scrollbar ) in the popup seems not working.. could you please guide me..
Reply
Chris 14 years ago
First of all, great script!

It is working fine for me!

I tried to mix it up a little, got an old php script where info is added to a db. I used a delete function somewhat href looking like this "/del.php?id=".$record['id']." since I used your script the it gets lost when opening a pop-up.

Do you have any ideas how to make it work?
Reply
Bobby 14 years ago
Hi,

fantastic script!

i loaded an iframe just fine by just putting the iframe link within the html. there's a small problem though, one of the iframe pages uses tabs (not related to the problem) and two of those tabs have forms. I used a form-mail script on one of the forms and it redirects to a confirmation page. however, when i close the popup and click the link that brings up the popup again, what i see is the confirmation page and not the original page with the tabs. any help with this would be greatly appreciated as this script of yours is the simplest, by far, for creating modal windows.

Thanks
Reply
Kevin Liew Admin 14 years ago
Thanks for your clear description. It's normal because this script hide the modal window, so whatever you did on the iframe will remain the same state even though you have close the modal. The solution is pretty straight forward. You need to add extra line of js code to refresh the iframe to force refresh the iframe before it's shown:

//add this after $('a[name=modal]').click(function(e) {
$('#iframe')..contentWindow.location.reload(true);

hope that help :)
Reply
roger 14 years ago
aqui hay uno mas simple para wordpress pero no estan completo como este espero le sirva http://blog.rogersoto.com/blog/programacion/abrir-una-ventana-al-cargar-el-blog/

gracias
Reply
varun 14 years ago
Calendar is not being displayed on the pop up rather displaying on the parent window.
Any help?
Reply
AkosGergely 14 years ago
The fadeTo is not working on second time when you hide #mask, because the #mask opacity value is remains 0.9. Add $(this).css({'opacity':1});
Reply
Jason 14 years ago
I'm using this modal as a form and was wondering if there was any way of refreshing it without refreshing the main page so that it can use form validation to show any errors if they exist. I have the modal in a separate .php file to the main page.
Reply
Hal 14 years ago
Beautiful and elegant solution, but I have one question - is there any particularly reason you use the NAME attribute instead of, for instance, CLASS?
Reply
Kevin Liew Admin 14 years ago
More semantic I guess, this tutorial is aging, the best way to do it now is using CLASS. It's easy to change.
Reply
Vijay 14 years ago
I tried out this example but it gives javascript errors.In the ready function there is a statement: e.preventDefault();
Not sure where this e variable is defined.
Reply
Kevin Liew Admin 14 years ago
e is defined in function(e)
Reply