Created
April 3, 2020 04:50
-
-
Save hackistic/79dca7dca0323130dbc7f8e50654db98 to your computer and use it in GitHub Desktop.
Scramble text animation js
This file contains hidden or 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
<html> | |
<head> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | |
</head> | |
<body bgcolor="“#000000”"> | |
</> | |
<div class="container"> | |
<div class="text"></div> | |
</div> | |
</> | |
</body> | |
</html> |
This file contains hidden or 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
class TextScramble { | |
constructor(el) { | |
this.el = el; | |
this.chars = "!<>-_\\/[]{}—=+*^?#________"; | |
this.update = this.update.bind(this); | |
} | |
setText(newText) { | |
const oldText = this.el.innerText; | |
const length = Math.max(oldText.length, newText.length); | |
const promise = new Promise((resolve) => (this.resolve = resolve)); | |
this.queue = []; | |
for (let i = 0; i < length; i++) { | |
const from = oldText[i] || ""; | |
const to = newText[i] || ""; | |
const start = Math.floor(Math.random() * 40); | |
const end = start + Math.floor(Math.random() * 40); | |
this.queue.push({ from, to, start, end }); | |
} | |
cancelAnimationFrame(this.frameRequest); | |
this.frame = 0; | |
this.update(); | |
return promise; | |
} | |
update() { | |
let output = ""; | |
let complete = 0; | |
for (let i = 0, n = this.queue.length; i < n; i++) { | |
let { from, to, start, end, char } = this.queue[i]; | |
if (this.frame >= end) { | |
complete++; | |
output += to; | |
} else if (this.frame >= start) { | |
if (!char || Math.random() < 0.28) { | |
char = this.randomChar(); | |
this.queue[i].char = char; | |
} | |
output += `<span class="dud">${char}</span>`; | |
} else { | |
output += from; | |
} | |
} | |
this.el.innerHTML = output; | |
if (complete === this.queue.length) { | |
this.resolve(); | |
} else { | |
this.frameRequest = requestAnimationFrame(this.update); | |
this.frame++; | |
} | |
} | |
randomChar() { | |
return this.chars[Math.floor(Math.random() * this.chars.length)]; | |
} | |
} | |
const phrases = [ | |
'ITS LIKE THE FLU "THEY"said', | |
'WE WILL BE FINE "THEY"said', | |
'"THEY" LIED TO YOU', | |
'WHO are "THEY?"', | |
"the MEDIA", | |
"the GOVERNMENT", | |
"The Misinformation", | |
"STOPS HERE.", | |
"REAL COVID-19 Information", | |
"EVERYTHING WE SHARE IS VETTED", | |
"WE CHECK THE SOURCES, SOURCES", | |
"WE LOOK AT EVERYTHING", | |
"NO MORE MISINFORMATION", | |
"coronafact.us", | |
"COMING SOON" | |
]; | |
const el = document.querySelector(".text"); | |
const fx = new TextScramble(el); | |
let counter = 0; | |
const next = () => { | |
fx.setText(phrases[counter]).then(() => { | |
setTimeout(next, 2200); | |
}); | |
counter = (counter + 1) % phrases.length; | |
}; | |
next(); |
This file contains hidden or 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
@import 'https://fonts.googleapis.com/css?family=Roboto+Mono:100'; | |
html, | |
body { | |
font-family: 'Roboto Mono', monospace; | |
background: #000000; | |
height: 100%; | |
} | |
.container { | |
height: 100%; | |
width: 100%; | |
justify-content: center; | |
align-items: center; | |
display: flex; | |
} | |
.text { | |
font-weight: 500; | |
font-size: 50px; | |
color: #fafafa; | |
} | |
.dud { | |
color: #757575; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment