A Pen by ltrademark on CodePen.
Last active
June 8, 2024 02:19
-
-
Save Jossyboydgenius/db812bbee0bf05323761e70bab8ca855 to your computer and use it in GitHub Desktop.
Cyberpunk Error page
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<section class="error-body"> | |
<video preload="auto" class="background" src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/396624/err.mp4" autoplay muted loop></video> | |
<div class="message"> | |
<h1 t="404">404</h1> | |
<div class="bottom"> | |
<p>You have lost your way</p> | |
<a href="#">return home</a> | |
</div> | |
</div> | |
</section> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$bg: #11111b; | |
$red: #ff6778; | |
$green: #afd33d; | |
$blue: #1122ff; | |
$text: $green; | |
@function font($to, $from, $toWidth, $fromWidth) { | |
$slope: ($to - $from) / ($toWidth - $fromWidth); | |
$base: $from - $slope * $fromWidth; | |
@return calc(#{$base} + #{100vw * $slope}); | |
} | |
@mixin dotgrid($dot: #aaa,$dot-background: #000,$dot-size: 1px,$dot-spacing: 22px) { | |
background: linear-gradient(90deg, $dot-background ($dot-spacing - $dot-size), transparent 1%) center, linear-gradient($dot-background ($dot-spacing - $dot-size), transparent 1%) center, $dot; | |
background-size: $dot-spacing $dot-spacing; | |
background-position: center; | |
} | |
:root { | |
box-sizing: border-box; | |
cursor: default; | |
} | |
::selection { | |
color: $bg; | |
background-color: lighten($text, 10%); | |
} | |
html, body { | |
width: 100%; | |
height: 100%; | |
background-color: $bg; | |
color: $text; | |
font-size: font(22px, 9px, 1920px, 320px); | |
} | |
.error-body { | |
position: relative; | |
width: 100%; | |
height: 100%; | |
overflow: hidden; | |
&:before { | |
content: ''; | |
position: fixed; | |
top: 0; | |
left: 0; | |
width: 100%; | |
height: 100%; | |
background-color: $text; | |
mix-blend-mode: overlay; | |
z-index:1; | |
} | |
&:after { | |
content: ''; | |
position: fixed; | |
top: 0; | |
left: 0; | |
width: 100%; | |
height: 100%; | |
@include dotgrid($dot: lighten($bg, 100%), $dot-background: $bg); | |
opacity: .2; | |
z-index:1; | |
} | |
.background { | |
position: absolute; | |
top: 0; | |
left: 0; | |
width: 100%; | |
height: 100%; | |
z-index: 0; | |
filter: grayscale(1); | |
mix-blend-mode: luminosity; | |
} | |
.message { | |
position: relative; | |
width: 100%; | |
height: 100%; | |
text-align: center; | |
z-index:3; | |
h1 { | |
$faded: rgba($text, .3); | |
position: absolute; | |
top: 10%; | |
left: 0%; | |
width: 100%; | |
font-size: 10em; | |
margin: 0; | |
animation: shake 600ms ease-in-out infinite alternate; | |
text-shadow: 0 0 .07em $text, | |
-.2em 0 2em $faded, | |
.2em 0 2em $faded; | |
user-select: none; | |
&:before { | |
content: attr(t); | |
position: absolute; | |
left: 50%; | |
transform: translate(-50%, .34em); | |
height: .1em; | |
line-height: .5em; | |
width: 100%; | |
animation: scan 500ms ease-in-out infinite alternate random(600)+ms, | |
glitch-anim 300ms ease-in-out infinite alternate; | |
overflow: hidden; | |
opacity: .7; | |
} | |
&:after { | |
$n:random(30); | |
content: attr(t); | |
position: absolute; | |
top: -$n+px; | |
left: 50%; | |
transform: translate(-50%, .34em); | |
height: .5em; | |
line-height: .1em; | |
width: 100%; | |
animation: scan 665ms ease-in-out infinite alternate random(600)+ms, | |
glitch-anim 300ms ease-in-out infinite alternate; | |
overflow: hidden; | |
opacity: .8; | |
} | |
} | |
.bottom { | |
position: absolute; | |
top: 65%; | |
left: 0; | |
width: 100%; | |
} | |
p, a { | |
font-size: 2em; | |
font-family: monospace; | |
text-shadow: 0 0 5px $text; | |
filter: blur(.8px); | |
} | |
a { | |
$dd: 225ms; | |
position: relative; | |
color: $text; | |
text-decoration: none; | |
font-weight: 700; | |
border: 2px solid $text; | |
text-transform: uppercase; | |
padding: 5px 30px; | |
box-shadow: inset 0 0 0 0 rgba($text, .2); | |
transition: 25ms ease-in-out all 0ms; | |
overflow: hidden; | |
animation: attn 3s ease-in-out infinite; | |
&:hover { | |
cursor: crosshair; | |
box-shadow: inset 0 -2em 0 0 rgba($text, .2); | |
transition: 225ms ease-in-out all $dd; | |
animation: none; | |
&:before, | |
&:after { | |
transform: translate(-50%, 0) scale(0, 1); | |
} | |
} | |
&:active { | |
box-shadow: inset 0 -2em 0 0 rgba($text, .5); | |
transition: 225ms ease-in-out all $dd; | |
} | |
&:before, | |
&:after { | |
content: ''; | |
position: absolute; | |
left: 50%; | |
transform: translate(-50%, 0) scale(1, 1); | |
transform-origin: center; | |
background-color: $bg; | |
width: 90%; | |
height: 5px; | |
transition: $dd ease-in-out all; | |
mix-blend-mode: hard-light; | |
} | |
&:before { | |
top: -4px; | |
} | |
&:after { | |
bottom: -4px; | |
} | |
} | |
} | |
} | |
@keyframes scan { | |
$num: random(30); | |
$numVal: $num * .01em; | |
from , 20%, 100%{ | |
height: 0; | |
transform: translate(-50%, .44em); | |
} | |
10%,15% { | |
height: 1em; | |
line-height: .2em; | |
transform: translate(-55%, $numVal); | |
} | |
} | |
@keyframe pulse { | |
$faded: rgba($text, .3); | |
from { | |
text-shadow: 0 0 0 $text, | |
0 0 0 $faded, | |
0 0 0 $faded; | |
} | |
to { | |
text-shadow: 0 0 .07em $text, | |
-.2em 0 2em $faded, | |
.2em 0 2em $faded; | |
} | |
} | |
@keyframes attn { | |
0%, 100% { | |
opacity: 1; | |
} | |
30%, 35% { | |
opacity: .4; | |
} | |
} | |
@keyframes shake { | |
0%, 100% { | |
transform: translate(-1px, 0); | |
} | |
10% { | |
transform: translate(2px, 1px); | |
} | |
30% { | |
transform: translate(-3px, 2px); | |
} | |
35% { | |
transform: translate(2px, -3px); | |
filter: blur(4px); | |
} | |
45% { | |
transform: translate(2px, 2px) skewY(-8deg) scale( .96, 1); | |
filter: blur(0); | |
} | |
50% { | |
transform: translate(-3px, 1px); | |
} | |
} | |
@keyframes glitch-anim { | |
$steps: 10; | |
@for $i from 0 through $steps { | |
#{percentage($i*(1/$steps))} { | |
clip: rect(random(100)+px, 9999px, random(100)+px, 0); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment