Created
February 22, 2018 02:35
-
-
Save LeetCodes/912edb2200cb25bedece15cea19e9c99 to your computer and use it in GitHub Desktop.
YevwXE
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
| <div id="glitch"> | |
| > <div class="text"></div><span id="cursor">█</span> | |
| </div> |
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
| // —————————————————————————————————————————————————— | |
| // TextScramble | |
| // —————————————————————————————————————————————————— | |
| 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)] | |
| } | |
| } | |
| // —————————————————————————————————————————————————— | |
| // Example | |
| // —————————————————————————————————————————————————— | |
| const phrases = [ | |
| 'Neo,', | |
| 'sooner or later', | |
| 'you\'re going to realize', | |
| 'just as I did', | |
| 'that there\'s a difference', | |
| 'between knowing the path', | |
| 'and walking the path' | |
| ] | |
| const el = document.querySelector('.text') | |
| const fx = new TextScramble(el) | |
| let counter = 0 | |
| const next = () => { | |
| fx.setText(phrases[counter]).then(() => { | |
| setTimeout(next, 800) | |
| }) | |
| 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: #212121; | |
| height: 100%; | |
| } | |
| #glitch { | |
| height: 100%; | |
| width: 100%; | |
| justify-content: center; | |
| align-items: center; | |
| display: flex; | |
| } | |
| #glitch { | |
| font-weight: 100; | |
| font-size: 28px; | |
| color: #FAFAFA; | |
| } | |
| #glitch > .text > .dud { | |
| color: red; | |
| } | |
| #glitch { | |
| animation: 1500ms infinite normal glitch; | |
| } | |
| #glitch > span#cursor { | |
| animation: 1500ms infinite normal cursor; | |
| } | |
| @keyframes glitch { | |
| 0% { | |
| opacity: 0; | |
| left: 0px; | |
| } | |
| 40% { | |
| opacity: 1; | |
| left: -2px; | |
| } | |
| 80% { | |
| opacity: 1; | |
| left: -2px; | |
| } | |
| } | |
| @keyframes cursor { | |
| 0% { | |
| opacity: 0; | |
| left: 0px; | |
| } | |
| 40% { | |
| opacity: 0; | |
| left: -2px; | |
| } | |
| 80% { | |
| opacity: 1; | |
| left: -2px; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment