JSFiddle - React, Tailwind, and code Playground

Yet another modal

by Jennifer Perrin

HTML

<a href="#login-box" class="login-window">Login / Sign In</a>
<a href="#box2" class="login-window">Box 2</a>

<div id="login-box" class="login-popup">
<a href="#" class="close"><img src="close_pop.png" class="btn_close" title="Close Window" alt="Close" /></a>
<form method="post" class="signin" action="#">
    <fieldset class="textbox">
        <label class="username">
            <span>Username or email</span>
            <input id="username" name="username" value="" type="text" autocomplete="on" placeholder="Username" />
        </label>
        <label class="password">
            <span>Password</span>
            <input id="password" name="password" value="" type="password" placeholder="Password" />
        </label>
        <button class="submit button" type="button">Sign in</button>
        <p><a class="forgot" href="#">Forgot your password?</a></p>
    </fieldset>
</form>
</div>

<div id="box2" class="login-popup">
<a href="#" class="close"><img src="close_pop.png" class="btn_close" title="Close Window" alt="Close" /></a>
    <p>Box 2</p>
</div>

CSS

#mask {
    display: none;
    background: #000;
    position: fixed;
    left: 0;
    top: 0;
    z-index: 10;
    width: 100%;
    height: 100%;
    opacity: 0.8;
    z-index: 999;
}
/* You can customize to your needs  */
 .login-popup {
    display:none;
    background: #333;
    padding: 10px;
    border: 2px solid #ddd;
    float: left;
    font-size: 1.2em;
    position: fixed;
    top: 50%;
    left: 50%;
    z-index: 99999;
    box-shadow: 0px 0px 20px #999;
    /* CSS3 */
    -moz-box-shadow: 0px 0px 20px #999;
    /* Firefox */
    -webkit-box-shadow: 0px 0px 20px #999;
    /* Safari, Chrome */
    border-radius:3px 3px 3px 3px;
    -moz-border-radius: 3px;
    /* Firefox */
    -webkit-border-radius: 3px;
    /* Safari, Chrome */
}
img.btn_close {
    Position the close button float: right;
    margin: -28px -28px 0 0;
}
fieldset {
    border:none;
}
form.signin .textbox label {
    display:block;
    padding-bottom:7px;
}
form.signin .textbox span {
    display:block;
}
form.signin p, form.signin span {
    color:#999;
    font-size:11px;
    line-height:18px;
}
form.signin .textbox input {
    background:#666666;
    border-bottom:1px solid #333;
    border-left:1px solid #000;
    border-right:1px solid #333;
    border-top:1px solid #000;
    color:#fff;
    border-radius: 3px 3px 3px 3px;
    -moz-border-radius: 3px;
    -webkit-border-radius: 3px;
    font:13px Arial, Helvetica, sans-serif;
    padding:6px 6px 4px;
    width:200px;
}
form.signin input:-moz-placeholder {
    color:#bbb;
    text-shadow:0 0 2px #000;
}
form.signin input::-webkit-input-placeholder {
    color:#bbb;
    text-shadow:0 0 2px #000;
}
.button {
    background: -moz-linear-gradient(center top, #f3f3f3, #dddddd);
    background: -webkit-gradient(linear, left top, left bottom, from(#f3f3f3), to(#dddddd));
    background: -o-linear-gradient(top, #f3f3f3, #dddddd);
    filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#f3f3f3', EndColorStr='#dddddd');
   ...

JavaScript

$(document).ready(function () {
    $('a.login-window').click(function () {

        //Getting the variable's value from a link 
        var loginBox = $(this).attr('href');
        //Fade in the Popup
        $(loginBox).fadeIn(300);
        //Set the center alignment padding + border see css style
        var popMargTop = ($(loginBox).height() + 24) / 2;
        var popMargLeft = ($(loginBox).width() + 24) / 2;

        $(loginBox).css({
            'margin-top': -popMargTop,
            'margin-left': -popMargLeft
        });

        // Add the mask to body
        $('body').append('<div id="mask"></div>');
        $('#mask').fadeIn(300);

        return false;
    });

    // When clicking on the button close or the mask layer the popup closed
    $('a.close, #mask').live('click', function () {
        $('#mask , .login-popup').fadeOut(300, function () {
            $('#mask').remove();
        });
        return false;
    });
});