Skip to content

Instantly share code, notes, and snippets.

@danwarfel
Created December 8, 2015 14:59
Show Gist options
  • Save danwarfel/a238d4ccef7b8bc9a5a2 to your computer and use it in GitHub Desktop.
Save danwarfel/a238d4ccef7b8bc9a5a2 to your computer and use it in GitHub Desktop.
DEAD Simple Newsletter Form
<h1>Subscribe to my awesome <span class="subtext">(fake)</span> newsletter!</h1>
<form class="newsletter">
<span class="container active">
<label for="name">What's your name?</label>
<input type="text" id="name" name="name" class="required"/>
<span class="next" title="next"></span>
</span>
<span class="container">
<label for="email">What's your email?</label>
<input class="required" type="email" id="email" name="email"/>
</span>
<span class="submit" title="Subscribe"></span>
</form>
<div class="reset">Reset the Form</div>
$('.next').click(function(){
var nextTarget = $(this).parent().siblings('span');
var currentTarget = $(this).parent();
currentTarget.removeClass('active');
nextTarget.addClass('active').find('input').focus();
});
$('input#email').on('keydown',function(e){
var keyCode = e.keyCode || e.which;
if (keyCode == 13) {
$('.submit').trigger('click');
}
})
$('.submit').click(function(){
var target = $(this);
var lastInputContainerLabel = target.parent().find('.container.active label');
target.addClass('submitted');
lastInputContainerLabel.addClass('fadeOut');
})
// capture tab press
$(".container").on('keydown', 'input', function(e) {
var keyCode = e.keyCode || e.which;
if (keyCode == 9) {
e.preventDefault();
//tabbing backwards
if (e.shiftKey) {
var currentInput = $(this);
var prevInput = currentInput.parent().prev('.container').find('input');
var currentContainer = currentInput.parent();
var prevContainer = currentInput.parent().prev('.container');
if (currentContainer.is(':first-of-type')){
// do nothing if is first input
} else {
currentContainer.removeClass('active');
prevContainer.addClass('active');
prevInput.focus();
}
//tabbing forwards
} else {
var currentInput = $(this);
var nextInput = currentInput.parent().next('.container').find('input');
var currentContainer = currentInput.parent();
var nextContainer = currentInput.parent().next('.container');
if (currentContainer.is(':nth-last-of-type(2)')){
// do nothing if is last input
} else {
currentContainer.removeClass('active');
nextContainer.addClass('active');
nextInput.focus();
}
}
}
});
// validate the form
$('.newsletter').validate({
errorElement: "span"
});
// reset the form
$('.reset').click(function(){
var target = $('form.newsletter');
var targetInput = target.find('span.container > input');
var inputContainer = target.find('span');
var firstContainer = target.find('span.container:first-of-type');
targetInput.val('');
inputContainer.removeClass('active');
firstContainer.addClass('active');
$('span.submit').removeClass('submitted');
$('label').removeClass('fadeOut')
});
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="http://cdn.jsdelivr.net/jquery.validation/1.14.0/jquery.validate.min.js"></script>
*, *:before, *:after {
box-sizing:border-box;
transition:.5s ease-in-out;
}
body, html {
font-family: -apple-system, helvetica neue, helvetica, arial, sans-serif;
font-weight:200;
position:relative;
height:100%;
}
h1 {
font-size:30px;
line-height:30px;
font-weight:200;
padding:75px 0 50px 0;
text-align:center;
.subtext {
opacity:.3;
}
}
.newsletter {
max-width:400px;
margin:50px auto;
position:relative;
> span.container {
display:block;
width:100%;
position:absolute;
z-index:1;
top:0px;
left:0px;
padding:20px 10px 10px 10px;
opacity:0;
&.active {
opacity:1;
z-index:2;
&+.submit {
z-index:3;
top:20px;
opacity:1;
}
}
> label {
display:block;
position:absolute;
top:-5px;
line-height:18px;
&.fadeOut {
opacity:0;
top:10px;
}
}
> input {
padding:15px;
margin:0;
width:100%;
outline:none;
border:1px solid #d1d1d1;
border-radius:3px;
font-family: -apple-system, helvetica neue, helvetica, arial, sans-serif;
font-weight:200;
font-size:18px;
line-height:18px;
}
.next {
display:block;
position:absolute;
height:53px;
width:53px;
top:20px;
right:10px;
text-align:center;
border-radius:0 3px 3px 0;
border-top:1px solid transparent;
border-right:1px solid transparent;
border-bottom:1px solid transparent;
&:hover {
color:#22a31b;
cursor:pointer;
&:before {
color:#22a31b;
}
}
&:before {
content:'\f061';
font-family:FontAwesome;
font-size:18px;
font-weight:200;
line-height:51px;
color:#b6b6b6;
}
}
span.error {
color:red;
position:absolute;
display:block;
width:100%;
font-size:12px;
line-height:12px;
bottom:-10px;
}
}
> span.submit {
display:block;
position:absolute;
height:53px;
width:53px;
top:20px;
right:10px;
text-align:center;
opacity:0;
border-radius:0 3px 3px 0;
border-top:1px solid transparent;
border-right:1px solid transparent;
border-bottom:1px solid transparent;
overflow:hidden;
background:#b6b6b6;
&:hover {
background:#22a31b;
border-top:1px solid #158010;
border-right:1px solid #158010;
border-bottom:1px solid #158010;
cursor:pointer;
&:before {
color:white;
}
}
&:before {
content:'\f1d8';
font-family:FontAwesome;
font-size:18px;
font-weight:200;
line-height:51px;
color:white;
}
&:after {
content:"You're subscribed!";
display:block;
color:white;
font-weight:400;
text-shadow:1px 1px 0 rgba(0,0,0,.3);
height:100%;
width:100%;
line-height:51px;
position:absolute;
top:10px;
opacity:0;
}
&.submitted {
transition:.75s cubic-bezier(0.19, 1, 0.22, 1);
width:calc(100% - 20px);
background:#22a31b;
border:1px solid #158010;
cursor:pointer;
border-radius:3px;
&:before {
color:white;
position:relative;
top:-50px;
right:-100px;
transition:.25s .75s ease-in-out;
}
&:after {
top:0;
opacity:1;
color:white;
transition:.5s 1s ease-in-out;
}
}
}
}
.reset {
width:100%;
text-align:center;
position:absolute;
bottom:25px;
cursor:pointer;
color:#747474;
&:hover {
color:red;
}
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet" />
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment