Simple jQuery Modal Window Tutorial

Written by Kevin Liew on 17 Mar 2009
674,869 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
kevin Admin 16 years ago
@washington: DS_STORE, it's like THUMB.db in windows, it's a mac file, I think it stores the detail of a mac folder, you can ignore or remove it.
Reply
Dan B 16 years ago
Thanks - added a few things:

$(id).css('top', Math.max(winH/2-$(id).height()/2 + $(window).scrollTop(),0));
$(id).css('left', Math.max(winW/2-$(id).width()/2 + $(window).scrollLeft(),0));

Accounts for scrolling of the window such that the dialog box will be visible on the screen if it's been scrolled.
Accounts for the case when the window is sized smaller than the modal box, the top/left was less than zero.

I also added an event to window resizing if the modal box is up to obscure newly visible content.

$(window).bind('resize', function(e) {
var maskHeight = $(document).height();
var maskWidth = $(window).width();

//Set height and width to mask to fill up the whole screen
$('#modalMask').css({'width':maskWidth,'height':maskHeight});
});

I then unbind the resize event. This can cause issues if other routines are adding resize events to the window.
Reply
online furniture stores 16 years ago
Hi,
The modal pop up looks very nice.
I do have a tiny problem though with the width of the mask on IE. It's bigger than the window width and since my bg is centered it moves it when I have the pop up.
Any idea?
Reply
Andy 16 years ago
This works fine unless your page is longer than one screen. The popup seems to always appear centered at the top of the page (as if the page were only one screen in length) - not much good if your page is longer than one screen.
Reply
Christian 16 years ago
well I suggest to everybody that the "HTML code and A tag attributes" put on of any DIV so the structure of xhtml will be like that
<body>
<!-- #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>
later put your xhtml code
<div id="wrapper">
code......................
code.......................
</div>
Reply
goluhaque 16 years ago
Had seen a tutorial on the same topic at another place but couldn't understand it very well. Your tutorial cleared everything.
Reply
Munawar 16 years ago
I'm trying to automate testing a .NET web app with vbscript/jscript. Whenever our application blows up, it gives user the message in a modal dialog box. Is there any way to programmatically detect that this dialog box is thrown.
Reply
Nick Marsh 16 years ago
Does anyone know how I can make the modal window open when the page loads?
Reply
Rodney 16 years ago
THANK YOU!!! Finally a simple modal that works! I've worked through several today and none of them would do what I wanted. Yours ROCKS!
Reply
NeoX 16 years ago
Hi, is it possible to use a href to a div defined in other url, not in the code below? I'm trying it but it doesn't work. I don't know if javascript file needs a change...
Thanks

1. <!-- #dialog is the id of a DIV defined in the code below -->
2. <a href="#dialog" name="modal">Simple Modal Window</a>
Reply
Darius 16 years ago
I am trying to add this script to a website I'm working on that already uses jQuery to scroll through content DIVs (Coda style). When I add this Modal script to the website and click the link to open the Modal window it screws up the positioning of my content DIVs. Anyone have any suggestions on how to make the two play well with each other?
Reply
Donald 16 years ago
Any solution to Andy's comment?
I am facing the same problem, that I have pages the are longer than one screen, then the dialog is not visible until one start scrolling...

great stuff apart from that!
Reply
Kahlil Black 16 years ago
Great little modal window.

There's a typo in the example code for loading the form via javascript or on page load (that is: http://www.queness.com/resources/html/modal/jquery-modal-window2.html)

The problem is that close is an id in the code, but a class in the html.

Change
//if close button is clicked
$('.window #close').click(function () {

to

//if close button is clicked
$('.window .close').click(function () {

to get the close link to work.

Reply