Interactive input form built with just CSS. Abusing focus state & labels to handle transitions & navigation.
Navigate between inputs using Tab (Next) & Shift + Tab (Prev).
Pure CSS. No JS included.
A Pen by Emmanuel Pilande on CodePen.
<form> | |
<input id="input-1" type="text" placeholder="John Doe" required autofocus /> | |
<label for="input-1"> | |
<span class="label-text">Full Name</span> | |
<span class="nav-dot"></span> | |
<div class="signup-button-trigger">Sign Up</div> | |
</label> | |
<input id="input-2" type="text" placeholder="john" required /> | |
<label for="input-2"> | |
<span class="label-text">Username</span> | |
<span class="nav-dot"></span> | |
</label> | |
<input id="input-3" type="email" placeholder="[email protected]" required /> | |
<label for="input-3"> | |
<span class="label-text">Email</span> | |
<span class="nav-dot"></span> | |
</label> | |
<input id="input-4" type="text" placeholder="●●●●●●" required /> | |
<label for="input-4"> | |
<span class="label-text">Password</span> | |
<span class="nav-dot"></span> | |
</label> | |
<input id="input-5" type="text" placeholder="●●●●●●" required /> | |
<label for="input-5"> | |
<span class="label-text">Confirm Password</span> | |
<span class="nav-dot"></span> | |
</label> | |
<button type="submit">Create Your Account</button> | |
<p class="tip">Press Tab</p> | |
<div class="signup-button">Sign Up</div> | |
</form> |
Interactive input form built with just CSS. Abusing focus state & labels to handle transitions & navigation.
Navigate between inputs using Tab (Next) & Shift + Tab (Prev).
Pure CSS. No JS included.
A Pen by Emmanuel Pilande on CodePen.
// Not Today |
$background: #111E25; | |
$dark: #111; | |
$primary: #bb1515; | |
input, | |
button { | |
position: fixed; | |
top: 50%; | |
left: 50%; | |
transform: translate(-50%, -300%); | |
display: block; | |
width: 70vw; | |
opacity: 0; | |
pointer-events: none; | |
transition: all .5s cubic-bezier(.4, .25, .8, .3); | |
} | |
input { | |
padding: .25rem 0; | |
border: 0; | |
border-bottom: 1px solid $primary; | |
outline: 0; | |
background: transparent; | |
color: #fff; | |
font-size: 3rem; | |
line-height: 4rem; | |
letter-spacing: .125rem; | |
transition: all .5s cubic-bezier(.4, .25, .8, .3); | |
} | |
input::selection { | |
background: rgba($primary, 0.25); | |
} | |
button, | |
.signup-button { | |
padding: .25em 0; | |
border: 0; | |
outline: 0; | |
background: $primary; | |
color: rgba(#fff, 0.85); | |
font-size: 2rem; | |
line-height: 3.6rem; | |
letter-spacing: .0625rem; | |
box-shadow: 0 3px 5px 1px rgba(#000, 0.25); | |
text-shadow: 0 -2px 0 rgba(#000, 0.25), 0 1px 0 rgba(#fff, 0.2); | |
} | |
input:focus, | |
button:focus { | |
opacity: 1; | |
transform: translate(-50%, -100%); | |
pointer-events: auto; | |
transition: all .4s cubic-bezier(.1, .45, .1, .85) .5s; | |
z-index: 10; | |
} | |
input:focus ~ input, | |
input:focus ~ button { | |
transform: translate(-50%, 500%); | |
transition: all .5s ease-in; | |
} | |
input:focus ~ label .label-text { | |
transform: translate(-50%, 300%); | |
transition: all .5s ease-in; | |
} | |
input:focus ~ .tip { | |
opacity: 1; | |
} | |
input:focus ~ .signup-button, | |
button:focus ~ .signup-button { | |
opacity: 0; | |
} | |
input:focus + label .label-text { | |
opacity: 1; | |
transform: translate(-50%, -100%); | |
transition: all .3s cubic-bezier(.1, .45, .1, .85) .4s; | |
} | |
input:focus + label .nav-dot:before { | |
background: darken($primary, 5%); | |
box-shadow: 0 0 0 .15rem $dark, 0 0 .05rem .26rem $primary; | |
} | |
.tip { | |
position: fixed; | |
top: 57%; | |
left: 50%; | |
transform: translate(-50%, -50%); | |
width: 70%; | |
opacity: 0; | |
color: #fff; | |
font-size: .875rem; | |
font-weight: 300; | |
letter-spacing: .125rem; | |
text-transform: uppercase; | |
text-align: right; | |
transition: opacity .25s .5s; | |
} | |
.signup-button, | |
.signup-button-trigger { | |
position: fixed; | |
top: 50%; | |
left: 50%; | |
transform: translate(-50%, -100%); | |
width: 70vw; | |
padding: .25rem 0; | |
line-height: 3.6rem; | |
text-align: center; | |
pointer-events: none; | |
cursor: pointer; | |
transition: opacity .4s .3s; | |
} | |
.signup-button-trigger { | |
opacity: 0; | |
pointer-events: auto; | |
} | |
.label-text { | |
position: fixed; | |
top: calc(50% - 4rem); | |
left: 50%; | |
transform: translate(-50%, -300%); | |
width: 70vw; | |
padding: 3.125rem 0 1.5rem; | |
text-transform: uppercase; | |
color: #fff; | |
opacity: 0; | |
font-size: 1.125rem; | |
font-weight: 300; | |
letter-spacing: .125rem; | |
pointer-events: none; | |
transition: all .4s cubic-bezier(.4, .25, .8, .3) .05s; | |
} | |
.nav-dot { | |
cursor: pointer; | |
position: fixed; | |
padding: .625rem 1.25rem .625rem .625rem; | |
top: 52%; | |
right: 1.25rem; | |
&:before { | |
content: ''; | |
display: inline-block; | |
border-radius: 50%; | |
width: .375rem; | |
height: .375rem; | |
margin-right: .625rem; | |
position: fixed; | |
background-color: lighten($background, 3%); | |
border: 0; | |
transition: all 0.25s; | |
} | |
&:hover:before { | |
width: .625rem; | |
height: .625rem; | |
margin-top: -.125rem; | |
margin-left: -.125rem; | |
background-color: darken($primary, 5%); | |
} | |
} | |
@for $i from 1 through 5 { | |
label[for="input-#{$i}"] .nav-dot { | |
margin-top: -150px + (25 * $i); | |
} | |
} | |
* { | |
margin: 0; | |
padding: 0; | |
box-sizing: border-box; | |
} | |
html, body { | |
width: 100%; | |
height: 100%; | |
background-image: linear-gradient(to bottom right, $background 0%, $dark 100%); | |
font-family: 'Lato', sans-serif; | |
} | |
form { | |
width: 100%; | |
height: 100%; | |
overflow: hidden; | |
} |