Fancy text input
by Sebastian Kay
HTML
<div class="wrapper">
<input
id="demoInput"
placeholder="TYPE HERE"
class="text-input smooth-type"
type="text"
/>
<label for="demoInput" class="brutalist-label">SMOOTH BRUTALIST</label>
</div>
CSS
body {
width: 100vw;
height: 100vh;
display: grid;
place-items: center;
overflow: hidden;
background: #1e1f1f;
font-family: "Arial";
}
.wrapper {
position: relative;
width: 250px;
font-family: monospace;
}
.text-input {
width: 100%;
padding: 15px;
font-size: 18px;
font-weight: bold;
color: #000;
background-color: #fff;
border: 4px solid #000;
position: relative;
overflow: hidden;
border-radius: 0;
outline: none;
transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
box-shadow: 5px 5px 0 #000, 10px 10px 0 #4a90e2;
}
@keyframes glitch {
0% {
transform: translate(0);
}
20% {
transform: translate(-2px, 2px);
}
40% {
transform: translate(-2px, -2px);
}
60% {
transform: translate(2px, 2px);
}
80% {
transform: translate(2px, -2px);
}
100% {
transform: translate(0);
}
}
.text-input:focus {
animation: focus-pulse 4s cubic-bezier(0.25, 0.8, 0.25, 1) infinite/*,
glitch 0.3s cubic-bezier(0.25, 0.8, 0.25, 1) infinite*/;
}
.text-input:focus::after {
content: "";
position: absolute;
top: -2px;
left: -2px;
right: -2px;
bottom: -2px;
background: white;
z-index: -1;
}
.brutalist-input:focus::before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: black;
z-index: -2;
clip-path: inset(0 100% 0 0);
animation: glitch-slice 4s steps(2, end) infinite;
}
@keyframes glitch-slice {
0% {
clip-path: inset(0 100% 0 0);
}
10% {
clip-path: inset(0 5% 0 0);
}
20% {
clip-path: inset(0 80% 0 0);
}
30% {
clip-path: inset(0 10% 0 0);
}
40% {
clip-path: inset(0 50% 0 0);
}
50% {
clip-path: inset(0 30% 0 0);
}
60% {
clip-path: inset(0 70% 0 0);
}
70% {
clip-path: inset(0 15% 0 0);
}
80% {
clip-path: inset(0 90% 0 0);
}
90% {
clip-path: inset(0 5% 0 0);
}
100% {
clip-path: inset(0 100% 0 0);
}
}
.brutalist-label {
position: absolute;
...