Simple jQuery Modal Window Tutorial

Written by Kevin Liew on 17 Mar 2009
674,911 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
Apu 15 years ago
Nice job.......Good Work Boss..........
Reply
Raju 15 years ago
Hi, thanx for nice tutorial. Dude I am facing problem for scrollbar.

1. javascript scrollbar (e.g. jScrollPane) is not working inside model window. how i can fix it?

2. If i have 3 box with different content & when i click relative button to open window - its opening on top of other. Is there any way to autohide previous box when i click button to open next?

plz help me.
Reply
Kevin Liew Admin 15 years ago
im not sure about the jScrollPane... probably css conflict...

for question 2, yes you can.. give all the modal window a common class name.. and then when you click on the link, hide all the window but grabbing them with the class name and then, show the one you clicked..
Reply
bo 15 years ago
excellent work
can you advise on a way of fading the modal div out when the closed button is clicked?

thanks bo
Reply
Kevin Liew Admin 15 years ago
in the close button event, change:

$('#mask, .window').hide();

to

$('#mask, .window').hide(500);
Reply
kate 15 years ago
It works but clashes with my other jquery UI scripts and stops the tabs i have from working. Is there a UI version? Thanks
Reply
Kevin Liew Admin 15 years ago
ar.. conflict... try to remove the code bit by bit to see which part is conflicting with the ui. Or inspect the console if you're using firebug.
Reply
ADDE 15 years ago
Hello! Perfect script! I found it very useful in many of my projects. but i´m wonder how to make it appear automaticly, without any links or orders?
Reply
Kevin Liew Admin 15 years ago
so i guess you want to display it once website is loaded? Please read section 4 - Launch modal window with Javascript.
Reply
Khaqan 15 years ago
The first one is being used by me on www.plasticcardmonster.com for login box. It looks really well in Chrome, but in Dolphin Browser (Samsung) it looks like nothing is there. How do I fix that:?
Reply
Kevin Liew Admin 15 years ago
sorry, i dont provide support to dolphin browser.
Reply
Nvaley 15 years ago
Hey, thanks for sharing, any idea how can I open an URL inside the modal window?? thanks in advance!
Reply
Kevin Liew Admin 15 years ago
by clicking on it?
Reply
Yan 15 years ago
I think he meant loading a remote webpage inside a modal window/div
Answer is (imo), it's a longer process and also probably wouldn't work too well with javascript alone
Reply
Brian Oburak 15 years ago
Hi Kevin,
I have been searching the web for days in need of a modal dialog to use for a form in my application and I have to say your approach is the first that worked, thanks a lot man. Your tutorial is really great.
Reply
Michelle 15 years ago
Hi,
Excellent modal! Thanx for your work & sharing :)

Just a little problem I am having... If the link is waaay down at the bottom of the page, the popup opens at the top of the page. The user does not see the modal popup, just the mask. How do I fix this?
Reply
Kevin Liew Admin 15 years ago
ar, you will need to recalculate the x and y so it's relative to the scroll bar position.
Reply
uday 15 years ago
Hi, really nice tutorial ... Though in the CSS, i had to give top:0,left:0 for #mask style since you have given it to be absolute position, the mask div started appearing down below after all the divs in my page.
Otherwise a great tutorial.Thanks.
Reply
Vishal Sharma 15 years ago
Thankx a lot.......You just saved my life...:)
Using it in my final year project....:)
Reply
Nick C 15 years ago
This was my first modal window setup. Thanks for making it a breeze!
Reply
viken 15 years ago
how the #mask auto resize it's high and width when Internet browser window's size is change?
Reply
Kevin Liew Admin 15 years ago
add this:

$(window).resize(function () {

//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});

});
Reply