This tutorial is aimed at getting beginners familiar more advanced concepts like data attributes and, at times, there will be more “efficient” ways of doing things, like creating advanced functions and optimising the output. However, as this tutorial is aimed at helping beginners, I’ll be taking a more procedural approach than some people might take. There is no right or wrong way here, there are simply more advanced and less advanced methods of getting the desired outcome.
If you get stuck at all please leave me a comment below with a description of the problem and a link to a JSFiddle showing your code in action. I’m here to help, no matter what the problem.
You might also like: How to Create a 12 Column Grid System with Sass
If you’re running a PHP powered site, like a WordPress blog, then it’s a good idea to put the code for the popup itself in the footer include file. This way you can always be sure the popup will be included on every page.
<a class="btn" data-popup-open="popup-1" href="#">Open Popup #1</a>
<div class="popup" data-popup="popup-1">
<div class="popup-inner">
<h2>Wow! This is Awesome! (Popup #1)</h2>
<p>Donec in volutpat nisi. In quam lectus, aliquet rhoncus cursus a, congue et arcu. Vestibulum tincidunt neque id nisi pulvinar aliquam. Nulla luctus luctus ipsum at ultricies. Nullam nec velit dui. Nullam sem eros, pulvinar sed pellentesque ac, feugiat et turpis. Donec gravida ipsum cursus massa malesuada tincidunt. Nullam finibus nunc mauris, quis semper neque ultrices in. Ut ac risus eget eros imperdiet posuere nec eu lectus.</p>
<p><a data-popup-close="popup-1" href="#">Close</a></p>
<a class="popup-close" data-popup-close="popup-1" href="#">x</a>
</div>
</div>
The structure of the popup is quite straightforward, so nothing to worry about there. We start off with a wrapper div and give it a class of popup. This is the black background around the popup but also what we’ll animate with jQuery.
You may notice those data attributes I’m using, for example data-popup="popup-1"
. The reason for using these is to make the code easier to use and maintain in the long run. Some people are advocates of using IDs in the same approach, however, this can become confusing as IDs are also commonly used for styling.
<div class="popup" data-popup="popup-1">
</div>
The open button also uses a data attribute of data-popup-open="popup-1"
, which you may notice is the same value as the popup itself. This is handy because it will allow us to dynamically open the popup with jQuery.
<a class="btn" data-popup-open="popup-1" href="#">Open Popup #1</a>
To close the popup there’s a normal anchor link and a specially positioned anchor link with data-popup-close="popup-1"
applied to them. The good thing about using a data attribute on both links is that it allows us to have a special close button in the upper right of the popup, but also use a normal link inside of the popup to close it as well.
<p data-popup-close="popup-3"><a href="#">Close</a></p>
<a class="popup-close" data-popup-close="popup-3" href="#">x</a>
/* Outer */
.popup {
width:100%;
height:100%;
display:none;
position:fixed;
top:0px;
left:0px;
background:rgba(0,0,0,0.75);
}
/* Inner */
.popup-inner {
max-width:700px;
width:90%;
padding:40px;
position:absolute;
top:50%;
left:50%;
-webkit-transform:translate(-50%, -50%);
transform:translate(-50%, -50%);
box-shadow:0px 2px 6px rgba(0,0,0,1);
border-radius:3px;
background:#fff;
}
/* Close Button */
.popup-close {
width:30px;
height:30px;
padding-top:4px;
display:inline-block;
position:absolute;
top:0px;
right:0px;
transition:ease 0.25s all;
-webkit-transform:translate(50%, -50%);
transform:translate(50%, -50%);
border-radius:1000px;
background:rgba(0,0,0,0.8);
font-family:Arial, Sans-Serif;
font-size:20px;
text-align:center;
line-height:100%;
color:#fff;
}
.popup-close:hover {
-webkit-transform:translate(50%, -50%) rotate(180deg);
transform:translate(50%, -50%) rotate(180deg);
background:rgba(0,0,0,1);
text-decoration:none;
}
The popup wrapper is using RGBA colour values to enable transparency, something a basic #HEX code can’t do. It also has fixed positioning, which makes it stay centred if the page is scrolled.
/* Outer */
.popup {
background:rgba(0,0,0,0.75);
}
The inner content area of the popup is absolutely positioned but also repositioned with transform. The absolute positioning moves the inner popup content left 50% and down 50%. The transform then moves it left -50% of its own width and down -50% of its own height. This then enables the inner popup to be exactly centred no matter what the size of the screen.
/* Inner */
.popup-inner {
position:absolute;
top:50%;
left:50%;
-webkit-transform:translate(-50%, -50%);
transform:translate(-50%, -50%);
}
The close button actually has a lot more styling rules than you’d expect. The reason it has a fon-family and font-size added is to make the popup work better across different projects. I highly advise using an icon font for the close button. For a good example, click the newsletter subscribe button at the top of the sidebar on this site. There’s also a transition on the button, this comes into play when you hover.
/* Close Button */
.popup-close {
transition:ease 0.25s all;
-webkit-transform:translate(-50%, -50%);
transform:translate(50%, -50%);
}
On hover, the button is spun around 180 degrees. If you put 360 degrees it will actually not look any different so 180 is what’s needed for the desired spinning effect.
.popup-close:hover {
-webkit-transform:translate(50%, -50%) rotate(180deg);
transform:translate(50%, -50%) rotate(180deg);
background:rgba(0,0,0,1);
}
That’s it for the CSS. If you’ve got any question on what we covered so far, please leave me a comment below.
$(function() {
//----- OPEN
$('[data-popup-open]').on('click', function(e) {
var targeted_popup_class = jQuery(this).attr('data-popup-open');
$('[data-popup="' + targeted_popup_class + '"]').fadeIn(350);
e.preventDefault();
});
//----- CLOSE
$('[data-popup-close]').on('click', function(e) {
var targeted_popup_class = jQuery(this).attr('data-popup-close');
$('[data-popup="' + targeted_popup_class + '"]').fadeOut(350);
e.preventDefault();
});
});
Do you remember those data attributes from the HTML? This is where they come into play. We first set up a click event on any of the open buttons and stop the default behaviour, which in this case, would be to follow the link. If we don’t use e.preventDefault();
to stop the default behaviour, a # will be added to the URL in the address bar.
$('[data-popup-open]').on('click', function(e) {
e.preventDefault();
});
The next step is to grab the value from the attribute and save that information to a variable. The value saved will be whatever has been added to that buttons attribute data-popup-open
. In our case, the output will be popup-1
.
var targeted_popup_class = jQuery(this).attr('data-popup-open');
Now comes the fun part, fading in the popup. The code below might look pretty scary but really, it’s quite simple. All it says is “find the popup with a data-popup value of popup-1 and fade it in for 350 milliseconds“. Also, because we’re using a variable, it saves us from having to repeat the open functionality for each popup we create, as it’s dynamically found and used.
$('[data-popup="' + targeted_popup_class + '"]').fadeIn(350);
Closing the popup is actually just a reverse of opening it. Instead of looking for the value of the open button we’re looking for the value of the close button. We’re also fading out instead of fading in.
Custom popup modals can be incredibly powerful, but also far more annoying if used incorrectly. When implementing your popup modal please don’t have it to autoload. This is a big problem as it will cause people to never return, even if you remove the popup because there only thought of your site and brand is an annoying popup the second they open up some of your content.
Help and support: If you have questions and/or need help with any code, please leave a comment below with a link to a JSFiddle showing your code in action.
You might also like: Tooltips in HTML and CSS.
Join the newsletter to get the best articles, tutorials and exclusive freebies every two weeks.
Carmen Campos
March 2, 2018 at 9:41 pm
Excelent! This was a very useful example for me. Thanks.
phil green
February 8, 2018 at 12:13 am
For those of you wanting to close it when clicking outside, put this third part into your function:
olu
January 25, 2019 at 4:16 pm
Where did you get the “active” class from as it’s not in the css?
Zulmy Eve
December 23, 2017 at 4:27 pm
thanks its working properly 🙂
Dili
December 8, 2017 at 4:42 am
code is not active, please check again
stefan
December 2, 2017 at 1:36 pm
the popup is not popping up as it suppose to…. I think the code might have an error… could you assist me??
Tori
November 26, 2017 at 6:52 pm
How can I adapt this to where when you click outside of the modal (the transparent black background), it closes the modal just like the X button does?
Tori
November 26, 2017 at 6:05 pm
How can I adapt this so that when the transparent black background div is clicked, it closes out the modal like the x button does?
Honey
June 27, 2017 at 8:49 pm
Hi, How can i trigger this popup with wordpress menu link
Thanks
James Daniel
June 25, 2017 at 10:51 pm
Great code, works perfectly on some browsers. However, the modal popups don’t work on firefox? Is there additional code to work around this?
Thank you,
James.
Fooman
November 3, 2017 at 8:56 pm
No asking questions for you. Just use the code as is.
Jean-Pierre Harzdorf
June 22, 2017 at 8:48 pm
Hi
I really like your popup-modal but I have to ask,
How can I make the modal close by clicking outside it?
Regards
Jean-Pierre
kerrie
May 24, 2017 at 4:58 pm
Hello,
Is there a way to make this open upon page load? Thanks! Kerrie
Kerrie
May 24, 2017 at 5:32 pm
I saw after I posted my question you don’t recommend the modal show up on page load. This is how we’ve implemented it in the past, but we’re switching from Coldfusion to PHP. Sorry for asking the question before I saw your comment about it.
Sowmiya P
February 21, 2017 at 5:52 pm
how to show a modal window or pop-up window after submitting contact us form?
Akshara
February 16, 2017 at 12:06 pm
Wonderful code! Clean and easy to use! Thank you for sharing 🙂
Akhilesh Maurya
February 12, 2017 at 8:05 am
Neat and clean tutorial and explanation.
vurso
November 27, 2016 at 11:03 am
Great post a good basis for developing something further.
Lacey
November 15, 2016 at 9:50 pm
Wow! This was actually pretty easy. Thank you for taking the time to explain.
shilpa
November 15, 2016 at 5:55 pm
How to access angular js scope values in this modal?
PR
October 30, 2016 at 3:09 pm
this is a great tutorial!
i have a video playing in the popup, when clicking on the X to close,, i need to pause the video and then close. how can that be done?
thank you!
pratyush
September 19, 2016 at 10:23 am
how can make it open on window loading… also show when clicked on pop up open link
Son
September 11, 2016 at 1:54 pm
Very useful tutorial.
I suggest the followings:
– Add data-popup-close attribute to the parent div:
(inner div, and content, etc.)
– And in the JavaScript close event handler, add
if (e.target !== this) return;
This will allow clicking anywhere on the background (except the dialog itself) to close the dialog.
Peter
September 2, 2016 at 8:55 am
This tutorial is great, i have been your follower Seb and I see you have written great guides.
I was wondering will it be possible to add some translation in this model with css only like we see in jquery based models where they appear from right or fade away to right. This is just an example.
jay
August 22, 2016 at 5:30 pm
Hi there — I cannot seem to get the code to work, if localising the code:
https://jsfiddle.net/jd5am/cmtjyfLy/5/
Can you help?
Scott
December 16, 2016 at 1:46 pm
It will work if you add this line to your HTML code:
Jquery is a pre-req for this code.
janet
August 20, 2016 at 10:08 am
how to close the pop up on clicking outside??
Prasanna
July 13, 2016 at 7:41 am
Excellent tutorial, thank you so much! I recommend adding z-index: 999; to .popup. That’s the only change I had to make.
Dexter
June 24, 2016 at 7:49 am
Thanks for this tutorial it is very helpful. But there is a problem with it when it comes to mobile devices the content is chopped of on the top and bottom and there is no way to close it. I think it is not responsive.
Manu
June 16, 2016 at 6:16 am
i wanto load the popup when the page loading itself instead of clicking the button.thanks
JY
May 26, 2016 at 1:26 pm
Hi, I followed your instructions exactly, and they all worked (thanks a lot!) except strangely for the very last element. So I’m generating a bunch of buttons dynamically in jQuery, then attach the required classes and data attributes as you mentioned, along with your event handlers. All of them work and produce the pop-up, except the very last one which always seems to ignore the e.preventDefault(), and instead just adds the ‘#’ link in the URL, and doesn’t bring up the pop-up. Do you know why that’s the case?
moshe
May 18, 2016 at 10:44 am
where shuld i put the code?
do i need the all 3 code or can i use only html?
Markus Roberts
April 30, 2016 at 5:49 pm
This tutorial helped me a lot so thanks. Can you tell me how you’d modify the code to also close the modal window on pressing the esc key or clicking outside the modal window please.
Manu Mahesh
September 10, 2016 at 10:15 am
Here is the video tutorial for custom popup https://www.youtube.com/watch?v=zK4nXa84Km4
Linnea
April 12, 2016 at 12:54 am
This is exactly what I was looking for! Thanks!
Dhuny
March 8, 2016 at 10:31 pm
The Create a Fading Popup Modal with jQuery, was a good example to apply with buttons specially when to explain about the concept. I tried to fellow you instruction of the codes, but fail to make the pop up work. Do you have the complete codes to test it and play with it. Many thanks for your help.
Rashid
March 7, 2016 at 12:04 pm
Can i open this popup with form submit button i tried to put the data-popup-open=”popup-1″ as submit button attribute but no success
trisha
February 17, 2016 at 10:26 pm
Hi Seb
I implemented your code exactly in term CSS and JQuery and HTML I put my content but use the data class in the tutorial well no error render by online.js the JS editor I use but nothing showing up not even the link zero blank page. Do I need to use a google library
Leon
January 30, 2016 at 7:19 pm
Great tutorial! I would like to incorporate in a website I manager for a nonprofit. I have the board of directors page with their photos and I would like a popup to be shown with the individual’s bio when their image is click. I tested it in liveweave.com and it works great but can someone explain how to use it in a wordpress site?
Thanks!
Arpit Goyal
January 28, 2016 at 6:24 am
The link to Fiddle is not working, it seems to be pointing to no snippet but landing page of JSFiddle.
John
January 18, 2016 at 11:11 pm
The popup is showing under other elements. I have tried changing the z index and also making it relative.
Vladislav
January 5, 2016 at 11:05 pm
Hey, thanks for tutorial – it’s great and simple.
Could you please add a line of code, so I can click anywhere on black in order to close popup? it is kind of a usual UX thing, I guess.
Mike
January 5, 2016 at 5:38 pm
I am wondering if you know if this will work with Squarespace sites given their structure. I cannot believe I cannot find a player that does not go full screen (using the grid layout in SS). It dominates the site with the video and at the end does not reduce or go away so the user must “x” out to see the site itself. Any help for a non css/JQuery guy.
Highest Regards.
Rahul
December 9, 2015 at 10:24 am
Awesome… nicely explained and I found it simple too. Thanks… bookmarked (y)
Maha
November 29, 2015 at 2:53 pm
Great tutorial, Thanks you! ☺
Olov Nilsen
October 9, 2015 at 11:12 pm
Really awesome tutorial. I can’t wrap my head around how the data attributes work. If one were to use id instead, how would one do, just in comparison? I would really like to get the full understanding of this great example.
Damir
September 15, 2015 at 9:46 am
I found this article accidentally and found it very useful. Just wanted to add to this article that the best practice would also be to add z-index:999 to a class .popup as than the bg will cover all other elements and popup will be in focus.
Chris
September 9, 2015 at 11:43 pm
I like the popup modal. I was wondering if this will work outside of Word Press? I am creating just a standard website with a folder call JS and CSS for the style sheet. The style sheet is Styles.css. It appears that the html, css, jquery is to be put into one page, I couldn’t get it to work. Any ideas on what to do to create a .js, do I need to name it something specific? on the html, do I just create a simple html with no head or title or body? Do I save it out to popup-1.html or is it supposed to go into the already written html? Can I put the CSS you have in my existing Styles.css? I would like to get it working but I am not experienced enough yet to know how to structure it into my site fully. thanks for any help!
Santiago
August 31, 2015 at 5:29 am
Hi bro ! , thanks for the post. It works great.The only thing is that the video keeps playing after you close the popup.
Ineed that the video stops , when i close the pop up.Is there any way to do that ? Thanks !
Joe
July 19, 2015 at 7:41 am
Hi! Great tutorial, thanks!
I’m using Squarespace (Pacific theme) and the problem I am having with this is that the modal shows up, however the rest of the content on the page overlaps the popup – in other words, if you think of the page as layers, where the modal should be the top layer, it’s actually kind of showing up as a layer UNDER the rest of the page content. Hope that makes sense.
Any suggestions?
THANKS!
Joe
Joe
July 19, 2015 at 7:47 am
Me again!
Just put the html in the footer (as you suggested!) and it’s perfect!
This is so great! Thanks so much!
Joe
Vladimir
December 24, 2015 at 1:19 pm
Hi Joe
I’m using Squarespace too, but can’t seem to get this to work. Where do I place the codes. CSS, I know. But JQuery and HTML, no idea. I don’t understand “put the HTML code in the Footer” when I want the popup to show when a text in the body is clicked, not a text in the footer. Please help. Thank you very much!
Deepika
July 11, 2015 at 5:22 pm
hello
i am the very beginner of web site designing
so help me by answering my simple ques.
tell me whether the above programs are seperated program or a same one single program
Boum
July 10, 2015 at 10:32 am
Hello ! Very good tutorial but It doesn’t work with my wordpress website …
I have enqueue the jquery function in my functions file and added your css file in mine but it still not work …
Have you an idea why ?
My function code :
function popup(){
wp_register_script("popup", get_template_directory_uri()."/js/jquery.popup.js", array("jquery", "jquery-ui"), true);
wp_enqueue_script("popup");
}
add_action("init","popup");
Boum
July 10, 2015 at 11:40 am
I have found de solution ! I have not enqueued the jQuery files in the google library and not created a separated css file for the popup
Very good tutorial again !!!
andrei
April 10, 2015 at 1:17 pm
can i use it like a wordpress plugin? is there a zip file to download?
Seb Kay (Author)
April 10, 2015 at 2:00 pm
There isn’t currently a download for the code above, but I’ll see what I can do about adding one.
James
April 9, 2015 at 3:08 am
as I can download “Create a Modal Popup Loading with jQuery” ??
Seb Kay (Author)
April 10, 2015 at 1:59 pm
Sorry but I don’t understand the question. Can you phrase it another way? 🙂
Liam
March 23, 2015 at 10:15 am
I never comment on things, but in the modern day web, you would most definitely not use jQuery alone with animations. NO! We have a non CPU hogging animation system. It’s called CSS3! Add a class and do your magic!
Seb Kay (Author)
March 23, 2015 at 12:18 pm
I agree, CSS3 animations are the way forward. However, as I explain in the beginning of the tutorial, it’s aimed at beginners and I do state there are better ways to go about this. I’ll make it more clear in future tutorials.