纯CSS实现字符串打字特效附带擦除重写效果(内含tailwind css版)
原生CSS实现实现的打字和擦除重写效果
HTML
<h1 aria-label="Hi! I'm a developer"> Hi! I'm a <span class="typewriter"></span> </h1> <h1 aria-label="Hi! I'm a developer"> Hi! I'm a <span class="typewriter thick"></span> </h1> <h1 aria-label="Hi! I'm a developer"> Hi! I'm a <span class="typewriter nocaret"></span> </h1>
CSS
h1 {
font-size: 9vmin;
color: #8bf;
text-align: left;
font-family: Lato, sans-serif;
font-weight: 700;
margin: 1rem 0 1rem 2rem;
}
/* Typewriter effect 1 */
@keyframes typing {
0.0000%, 27.3488% { content: ""; }
1.1395%, 26.2093% { content: "d"; }
2.2791%, 25.0698% { content: "de"; }
3.4186%, 23.9302% { content: "dev"; }
4.5581%, 22.7907% { content: "deve"; }
5.6977%, 21.6512% { content: "devel"; }
6.8372%, 20.5116% { content: "develo"; }
7.9767%, 19.3721% { content: "develop"; }
9.1163%, 18.2326% { content: "develope"; }
10.2558%, 17.0930% { content: "developer"; }
30.7674%, 51.2791% { content: ""; }
31.9070%, 50.1395% { content: "w"; }
33.0465%, 49.0000% { content: "wr"; }
34.1860%, 47.8605% { content: "wri"; }
35.3256%, 46.7209% { content: "writ"; }
36.4651%, 45.5814% { content: "write"; }
37.6047%, 44.4419% { content: "writer"; }
54.6977%, 75.2093% { content: ""; }
55.8372%, 74.0698% { content: "r"; }
56.9767%, 72.9302% { content: "re"; }
58.1163%, 71.7907% { content: "rea"; }
59.2558%, 70.6512% { content: "read"; }
60.3953%, 69.5116% { content: "reade"; }
61.5349%, 68.3721% { content: "reader"; }
78.6279%, 96.8605% { content: ""; }
79.7674%, 95.7209% { content: "h"; }
80.9070%, 94.5814% { content: "hu"; }
82.0465%, 93.4419% { content: "hum"; }
83.1860%, 92.3023% { content: "huma"; }
84.3256%, 91.1628% { content: "human"; }
}
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
.typewriter {
--caret: currentcolor;
}
.typewriter::before {
content: "";
animation: typing 13.5s infinite;
}
.typewriter::after {
content: "";
border-right: 1px solid var(--caret);
animation: blink 0.5s linear infinite;
}
.typewriter.thick::after {
border-right: 1ch solid var(--caret);
}
.typewriter.nocaret::after {
border-right: 0;
}
@media (prefers-reduced-motion) {
.typewriter::after {
animation: none;
}
@keyframes sequencePopup {
0%, 100% { content: "developer"; }
25% { content: "writer"; }
50% { content: "reader"; }
75% { content: "human"; }
}
.typewriter::before {
content: "developer";
animation: sequencePopup 12s linear infinite;
}
}原生CSS打字效果(无重写)
# Option1
<style>
.writer {
font-family: Courier, monospace;
display: inline-block;
}
.writer-text {
display: inline-block;
overflow: hidden;
letter-spacing: 2px;
animation: typing 5s steps(30, end), blink .75s step-end infinite;
white-space: nowrap;
font-size: 30px;
font-weight: 700;
border-right: 4px solid orange;
box-sizing: border-box;
}
@keyframes typing {
from {
width: 0%
}
to {
width: 100%
}
}
@keyframes blink {
from, to {
border-color: transparent
}
50% {
border-color: orange;
}
}
</style>HTML部分
<div class="writer">
<h1 class="writer-text overflow-hidden whitespace-nowrap border-r-4 border-r-white pr-5 text-5xl text-white font-bold">Building the Next Generation Websites</h1>
</div>#Option 2
<!DOCTYPE html>
<html>
<head>
<style>
.writer {
font-family: Courier, monospace;
display: inline-block;
}
.writer-text {
display: inline-block;
overflow: hidden;
letter-spacing: 2px;
animation: typing 5s steps(30, end), blink .75s step-end infinite;
white-space: nowrap;
font-size: 30px;
font-weight: 700;
border-right: 4px solid orange;
box-sizing: border-box;
}
@keyframes typing {
from {
width: 0%
}
to {
width: 100%
}
}
@keyframes blink {
from, to {
border-color: transparent
}
50% {
border-color: orange;
}
}
</style>
<body>
<div class="writer">
<div class="writer-text">Twinkle, twinkle, little star.</div>
</div>
</body>
</html>Tailwind CSS实现的打字特效(无擦除重写)
config
/** @type {import('tailwindcss').Config} */
module.exports = {
theme: {
extend: {
keyframes: {
typing: {
"0%": {
width: "0%",
visibility: "hidden"
},
"100%": {
width: "100%"
}
},
blink: {
"50%": {
borderColor: "transparent"
},
"100%": {
borderColor: "white"
}
}
},
animation: {
typing: "typing 2s steps(20) infinite alternate, blink .7s infinite"
}
},
},
plugins: [],
}
HTML
<div class="flex min-h-screen items-center justify-center bg-gradient-to-tr to-blue-400 from-green-500 p-10">
<div class="w-max">
<h1 class="animate-typing overflow-hidden whitespace-nowrap border-r-4 border-r-white pr-5 text-5xl text-white font-bold">Hello World</h1>
</div>
</div>