diff --git a/snippets/typewriter-effect.md b/snippets/typewriter-effect.md new file mode 100644 index 000000000..50633dc78 --- /dev/null +++ b/snippets/typewriter-effect.md @@ -0,0 +1,64 @@ +--- +title: Typewriter effect +tags: animation,advanced +--- + +Creates a typewriter effect animation. + +- Define two animations, `typing` to animate the characters and `blink` to animate the caret. +- Use the `:after` pseudo-element to add the caret to the container element. +- Use JavaScript to set the text for the inner element and set the `--characters` variable containing the character count. This variable is used to animate the text. +- Use `white-space: nowrap` and `overflow: hidden` to make content invisible as necessary. + +```html +
+
+
+``` + +```css +.typewriter-effect { + display: flex; + justify-content: center; + font-family: monospace; +} + +.typewriter-effect > .text { + max-width: 0; + animation: typing 3s steps(var(--characters)) infinite; + white-space: nowrap; + overflow: hidden; +} + +.typewriter-effect:after { + content: " |"; + animation: blink 1s infinite; + animation-timing-function: step-end; +} + +@keyframes typing { + 75%, + 100% { + max-width: calc(var(--characters) * 1ch); + } +} + +@keyframes blink { + 0%, + 75%, + 100% { + opacity: 1; + } + 25% { + opacity: 0; + } +} +``` + +```js +const typeWriter = document.getElementById('typewriter-text'); +const text = 'Lorem ipsum dolor sit amet.'; + +typeWriter.innerHTML = text; +typeWriter.style.setProperty('--characters', text.length); +```