Simple jQuery Modal Window Tutorial

Written by Kevin Liew on 17 Mar 2009
674,879 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
andrew 14 years ago
GREAT..thanks a lot

Any way to load the modal window only one time / visitor? so that in case he comes back to the same page, the modal window won't appear any more. :)

Many thanks!
Reply
Kevin Liew Admin 14 years ago
Hi Andrew, you can use cookie from this post: http://www.queness.com/post/666/weekly-tips-learn-how-to-use-cookie-with-javascript

The whole concept is something like this:

if ( not set cookie ) {
launchModal()
setcookie()
}

if the cookie is not found, launch the window modal, then you set the cookie. Next time when the user visit again he/she won't see the popup.
Reply
Aleksandar 14 years ago
Hello. i have some problems? i have copy and past all whats needed but my system model window dont make anything dont know whats the problem? :s



<script>
$(document).ready(function() {
//id is the ID for the DIV you want to display it as modal window
launchWindow(id);
});
//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 heigth 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').hide();
$('.window').hide();
});

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

});

</script>
<html>
<body>
<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>


</body>
</html>

realy need help! thanks in advance
Reply
Kevin Liew Admin 14 years ago
You can download the demo and tweak it from there.
Reply
Bennett 14 years ago
Fantastic code, thank you very much.
Reply
Jolynn 14 years ago
Hi Kevin,

Thank you so much for sharing, it works great!

However, I can't figure out how to get a scroll bar to appear when the screen height is less than 800? The content in some of my modal windows is a little long and causes my modal window to exceed the screen height on smaller screens. I know how to get the scroll bar to appear at all times but I just want it available when the modal window height exceeds the screen height. If you could help me out, I would greatly appreciate it. Thanks
Reply
Kevin Liew Admin 14 years ago
This is something new. You need to check:

if the offset + windowmodal height > screen height, then set the body height to the new height.
Reply
Jolynn 14 years ago
Thanks Kevin. Below is what I came up with and it seems to be working. So, now when a screen height is less than 800px, a vertical scroll bar will appear on the right side of the modal window. It doesn't appear when the screen size is greater than 800px. I am using this for biographies so that a visitor can read a bio without being redirected to another web page and I just want to make certain the info is viewable in various heights.


var h = $(window).height();
if (h < 800) {
$('.window').css("overflow-y","scroll");
$('.window').css('height', h*.95);
$(id).css('top',15);
}

else {
$('.window').css("overflow","auto");

The only thing that I noticed is that when I start with the browser window size at less than the 800 in height and then I enlarge the window, the scroll bar remains until I refresh my browser and then re-open the modal in the larger browser window. However, I am not thinking that people are going to be switching their browser window size like I am. Thanks again for the great code.
Reply
Kiddy 14 years ago
onload code does not work for me. any suggestion please that calls from javascript
Reply
VIJIL C 14 years ago
I am so happy. This tutorial is useful to me.
Reply
Andrew 14 years ago
I have been looking for something like this for ages. Great work!

One problem though. I have built a form within the window, and several fields are required fields. If the user hits submit without these fields populated, an error box appears at the top of the form. At present, once you hit submit, the popup disappears and you have to bring up the popup again to see that the form has not been submitted.

Any ideas would be gratefully appreciated.

Andrew
Reply
Kevin Liew Admin 14 years ago
Hi Andrew, I see what you're trying to achieve here. You want to be able to submit the form in the popup window. The problem you have could be due to the submit button which force the webpage to be refreshed.

There are two ways to do it:

1 - using iframe, basically you embed the iframe to the form. This would be the quickest.
2 - using ajax, it's harder and probably the most elegant way to do it.
Reply
Andrew 14 years ago
Hi Kevin,

Thanks for that. I have used an iframe as I don't have much experience with ajax and its working great. Fantastic work :)

Andrew
Reply
MANOJ 14 years ago
good example for me
Reply
joe 14 years ago
Hi Kevin,
The code <a href="#" class="close">Close it</a>;
I removed the 'Close it' text and replaced it with a 'close icon'. Tried to shift it all the way to the right but it won't budge. It looks funny being stubbornly stucked 1/4 way from the left border...

I removed the class="close" and it worked but i can't click on it anymore...
I thought it must be alignment in css since its the class that's responsible for this but i couldn't find a class named .close or #close...

Did i miss something out?
Thanx...
Reply
Ben Tew 14 years ago
I love your easy-to-understand script! I removed the mask portions...they didn't fit my application. Now i have multiple popups, piling up on each other. Is there a simple way to close all current popups, before triggering the new one?
Reply
Ben Tew 14 years ago
Never mind I found the code I needed:
//close previous popup
$('.popup').fadeOut(500);

//Get the A tag
var id = $(this).attr('href');


Reply
Alex 14 years ago
thanks for the tutorial. Any way I can creat next, prev buttons so user can go to the next modal window? Usually it's done with rel="something" attribute...
Reply
Kevin Liew Admin 14 years ago
Sorry Alex, you can't do that.
Reply
Zain 14 years ago
Hi I was wondering how to edit the js to include a function by which the mask and window hide by pressing the escape key.

$(document).keypress(function(e){
if(e.keyCode==27 && popupStatus==1){
$('#mask').hide();
$('.window').hide();
}
});

This doesn't seem to work.

Thanks for your help.
Reply