.typewriter h1 {
overflow: hidden; /* Ensures the content is not revealed until the animation */
border-right: .15em solid orange; /* The typwriter cursor */
white-space: nowrap; /* Keeps the content on a single line */
margin: 0 auto; /* Gives that scrolling effect as the typing happens */
letter-spacing: .15em; /* Adjust as needed */
animation:
typing 3.5s steps(40, end),
blink-caret .75s step-end infinite;
}
/* The typing effect */
@keyframes typing {
from { width: 0 }
to { width: 100% }
}
/* The typewriter cursor effect */
@keyframes blink-caret {
from, to { border-color: transparent }
50% { border-color: orange; }
}
笔记
- 演示依赖于 flexbox,因此在测试中可能会影响布局
- 假设使用 Autoprefixer
- 文本容器的宽度将由所用文本的长度决定
- 在
typing
动画中添加更多步骤将增加打字的平滑度 - 根据所使用的字体系列和字号调整
letter-spacing
更多!
有些人使用 JavaScript,这有时可能更可取(逐个字符地添加文字感觉更像真实的打字机),有时则不然(潜在的可访问性问题)。
Typed.css
从 Brandon McConnell 那里发现了 这个 SCSS @mixin,它具有强大的选项,可以识别多个字符串、速度、插入符号配置、暂停以及其他各种功能。
用纯 CSS 做这个非常巧妙。
我实际上以前写过一个 jQuery 插件 (http://macarthur.me/typeit),它用一些额外的自定义功能做了同样的事情,但它显然依赖于 jQuery。如果我想要制作一个原生的 JS 版本,我可能会从你的 JS 示例中汲取一些提示——尤其是 CSS 注入的想法。其中一些依赖于 jQuery 来完成 CSS 动画可以原生完成的事情,我希望看到这一点改变。
哇,这太棒了!感谢分享!
这个还在某个地方可以访问吗?我想看看它,但页面不再可用。
抱歉,我把网站移到了一个专门的 URL,看起来重定向有一段时间没有运行。
新地址是 https://typeitjs.com,但重定向现在也应该正常工作了。
// 喜欢动态类型的文字?你会喜欢这个
// 编辑这些字符串以查看它们在屏幕上键入
$strings: (
“CSS 打出了这个字符串!”
“它也打出了这个字符串”
“享受 ☕”
);
// 现在进行一些计时(所有时间单位为秒)
$durCharFwd: 0.10; // 键入字符
$durFullGap: 5.00; // 键入/删除之间的间隔时间
$durCharBwd: 0.08; // 删除字符
$durDoneGap: 5.20; // 字符串之间的间隔时间
// 初始化一些变量和函数 ✊
$charCount: 0; $durTotal: 0;
@each $string in $strings {
$charCount: $charCount + str-length($string);
$durTotal: $durTotal
+ (str-length($string) * ($durCharFwd + $durCharBwd))
+ $durFullGap + $durDoneGap;
}
@function percent($string, $letter) {
$stringsPast: $string – 1; $time: 0;
@while $stringsPast > 0 {
$time: $time
+ (($durCharFwd + $durCharBwd) * (str-length(nth($strings, $stringsPast))))
+ $durFullGap + $durDoneGap;
$stringsPast: $stringsPast – 1;
}
@if $letter <= str-length(nth($strings, $string)) {
$time: $time
+ ($durCharFwd * ($letter – 1));
} @else {
$time: $time
+ ($durCharFwd * str-length(nth($strings, $string)))
+ $durFullGap
+ ($durCharBwd * ($letter – str-length(nth($strings, $string))));
}
@return $time / $durTotal * 100 + “%”;
}
$currentPercentage: 0;
// 现在,这里才是魔法发生的地方… ✨
@keyframes typed {
@for $i from 1 through length($strings) {
// @for $j from 1 through (str-length(nth($strings, $i)) * 2 – 1) {
@for $j from 1 through (str-length(nth($strings, $i)) * 2) {
/* 字符串 #{$i},字符 #{$j} */
@if $j < str-length(nth($strings, $i)) * 2 { // 不是最后一个删除的字符
#{percent($i, $j)}, #{percent($i, $j+1)} {
@if $j <= str-length(nth($strings, $i)) {
content: quote(#{str_slice(nth($strings, $i), 1, $j)});
} @else {
content: quote(#{str_slice(nth($strings, $i), 1, str-length(nth($strings, $i)) – ($j – str-length(nth($strings, $i))))});
}
}
} @else {
@if $i < length($strings) { // 不是最后一个字符串
#{percent($i, $j)}, #{percent($i+1, 1)} {
content: “”;
}
} @else { // 最后一个字符串
#{percent($i, $j)}, 100% {
content: “”;
}
}
}
}
}
}
@keyframes beam-blink {
75% { border-color: transparent; }
}
* { backface-visibility: hidden; }
html, body { height: 100%; }
body {
display: flex;
align-items: center;
justify-content: center;
background-color: #000;
background-image: // 拟物化 anyone?
radial-gradient(rgba(#fff, 0.125), rgba(#fff, 0)),
linear-gradient(to bottom, #000, #000 2px, #111 3px);
background-repeat: repeat-y;
background-position: center center;
background-size: cover, 100% 3px;
font-size: calc(10px + 2vw);
font-family: ‘VT323’, monospace, sans-serif;
color: #3f3; // 黑客绿色
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
&::after {
content: “”; // 当为空时保留元素高度的零宽度空格
position: relative;
top: -13px;
@media (max-width: 575px) { top: -33px; }
display: inline-block;
padding-right: 3px;
padding-right: calc(3px + 0.1vw);
border-right: 10px solid rgba(#3f3, 0.75);
border-right: calc(1.1vw + 4px) solid rgba(#3f3, 0.75);
text-shadow: 0 0 5px rgba(51, 255, 51, 0.75);
white-space: nowrap;
animation: typed #{$durTotal + “s”} linear 1s infinite, beam-blink 1s infinite;
}
&::before { // 只是在这里生成一些有用的统计数据
content: “#{length($strings)} 个字符串 / #{$charCount} 个字符 / #{$durTotal} 秒持续时间”;
@media (max-width: 575px) {
content: “#{length($strings)} 个字符串 \A #{$charCount} 个字符 \A #{$durTotal} 秒持续时间”;
}
display: block;
position: absolute;
bottom: 0;
width: 100%;
padding: 3px 0;
background: #00f; // 海王蓝
color: #fff; // Brandon-McConnell 白
text-align: center;
font-size: 18px;
letter-spacing: 0.7px;
white-space: pre-wrap;
}
}
你是传奇人物,感谢你将这一切都列出来。
喜欢这个纯 CSS 版本!太有创意了。
我也创建了一个打字库——没有 jQuery(或任何其他)依赖项——https://github.com/qodesmith/typer
上述 github 页面上有一个演示链接。它有一个强大的 API,提供了许多自然的“打字”用例:后退、继续等等。希望你们觉得它有用!
非常酷的技巧!我现在正在做个人项目,并且尝试使用纯 CSS/SCSS 通过 ::before/::after 和 content 属性来实现类似于此(类似于 typed.js)的动态功能。因为该属性不可动画化,所以它将自动显示每个字符,而无需进行任何宽度或溢出更改,以及隐藏/显示文字。
我现在遇到了一些关键帧错误,但我正在解决,它已经很接近了。看看吧
非常感谢这个,我有一个问题。我为客户使用 Squarespace 构建了很多网站,不知何故,在实现这个之后,在 HTML 中键入的内容之后,光标会一直移动。有人能帮我解决一下吗?
嘿 Brandon!CSS 代码片段依赖于内容长度和动画步骤数量之间的微妙平衡。如果你发现光标超出容器,那么尝试调整动画中的步骤数量,使其与使用效果的内容长度相对应。
将容器设置为 “display: inline-block;” ;)
我也遇到了这个问题。将你想要键入的内容的长度从 24em(在打字机动画中)更改为你需要的尺寸
太棒了!谢谢。您是否可以在纯 CSS 中实现对多行的这种效果呢?
大家好,我是一个自学者,想知道如何调整第二个选项(第一个选项用 js)来限制循环重复的次数。
您好,我真的很需要您的帮助……如何在同一个页面中应用不同的跑马灯行为?
这取决于您根据文章中的示例选择哪种方法,但我认为使用不同的类名来区分每个实例是一个很好的起点。:)
有没有办法在滚动时实现这个效果?也就是说,只有当用户滚动到页面上的那个部分时才会加载它?
试试 wow.js
也许可以在滚动事件处理程序上设置该部分,或者在鼠标悬停时,或者类似的东西。
我希望能够使用滑块来实现打字效果,当滑块改变时,每次都会重新打出文本,并使用铅笔或笔图标,然后滑块会改变,此时文本将自动重新打出(重新加载),没有任何图像,只有文本滑块,所以请帮忙。
太棒了!我喜欢它。我正在使用的文本有两行,只有第一行正在打出,第二行根本没有出现。我该怎么做才能解决这个问题?
谢谢!
我这样做的,给第二行文本赋予 .line2 类,依此类推。
这非常有帮助,谢谢!
我还发现这个 Stack Overflow 问题对多行打字很有帮助
https://stackoverflow.com/questions/22805189/typing-effect-for-multiple-lines
在第二个 #more 示例中(从 ‘Hi Im Si.’ 开始的 Javascript 版本),是什么导致了无限循环,以及如何停止它只循环遍历列表一次?
你找到解决办法了吗?
非常感谢,太棒了!
您好,
我想知道如何删除光标,以及如何让它只打到文本长度?
很棒的工作。
谢谢!
嘿,Manuel!
你可以删除这个属性
border-right: .15em solid orange; /* 打字机光标 */
您好
我知道这篇文章很旧,但由于我第一个没有使用 JavaScript 的打字机解决方案最初就是从这里开始的,所以我认为提供我的多行打字机解决方案会很不错。
此解决方案允许
1. 使用任何字体系列、大小和样式
2. 在多行上实现打字机效果
3. 为每行单独修改速度
4. 让光标在最后一行最后一个打出的字母处闪烁,或不闪烁
5. 您还可以修改每行的光标颜色,甚至可以将其从 -> 更改为 ->,或者在同一行上更改为(依此类推)。
实际上,大多数使用 JavaScript 添加的技巧或效果最终都可以使用纯 CSS 添加,不需要其他任何东西。
查看 Pen 使用闪烁的光标在 CSS 中打出多行文本 by Joeri Boudewijns (@Bojoer) on CodePen.
https://production-assets.codepen.io/assets/embed/ei.js
在 Stack Exchange 和其他论坛以及开发人员博客上,有人问了一些关于这方面的问题,这也是我在这里发布它的主要原因。
谢谢,Joeri,很棒的工作!我已将您的 pen 添加到集合中。
嘿,Joeri!我想知道如何使光标仅在最后一个子行的末尾闪烁?现在闪烁会让整行闪烁,这很分散注意力,不是我想要的 :)
如果您能建议将闪烁属性移到哪里,我将不胜感激您的指导!
喜欢它!
我该如何让它在该部分出现时开始(它在我的页面底部)
谢谢
您好!是否可以使用纯 CSS 来打字和删除?我正在使用 WordPress 中的 CSS 编辑器,它可以工作一行,但我想能够在同一行上使用类似的打字和删除功能,而这种功能是使用 JS 实现的。
那里有一些不错的。我真的很喜欢 $.t.js ( https://github.com/mntn-dev/t.js ),它也支持嵌套的 html 标签。
那么如何在第三个示例中插入 HTML/CSS 文本呢?
// 用于在打字机中打出的文本数组
var dataText = [ “Amsterdam.”, “Full Service.”, “Webdevelopment.”, “Wij zijn Occhio!”];
将顶部的变量替换为
有没有办法让这个效果不断循环,以便在完成时继续播放?
谢谢!我一直在寻找一个好的打字机效果!我把它放在 https://welearntechnology.com 上
感谢您的帮助
您好!我正在使用类似的东西,但如何确保它在移动设备或较小的窗口大小下缩小?它目前保持着相同的大小,看起来很乱 :(
很棒的文章:),我只是想知道你所说的使用 JS 可能存在可访问性问题是什么意思?
如果 JS 被阻止了。:)
感谢回复 :) 这说得通,但由于我对所有这些都很陌生,我想也许还有其他我没想到的原因 xD
嘿 - 我喜欢这个。有人想出如何将文本退格删除吗?
同样的问题
您好,
我在我的网站中添加了这个 (https://codepen.io/hi-im-si/pen/DHoup) 打字效果,但我希望光标在左边。
非常感谢!
将第 54 行更改为
css.innerHTML = “.typewrite > .wrap { border-left: 0.08em solid #fff}”;
有没有办法做到这一点,使其具有响应性,并换行?我有一行比较长的文本 (
var languages_i_speak =["HTML", "CSS", "Ruby on Rails", "JS", "WordPress", "Human"];
),它不能全部在一行显示,我的问题是它要么没有显示,要么超出了我想要的框。我尝试删除whitespace: no-wrap
,但这会导致它一开始就全部显示,看起来很乱。我对所有这些都很陌生,需要一些帮助!您好,
非常感谢!
只有一个问题:在第一个示例“The cat and the hat”中,我需要添加哪些属性才能实现擦除效果?
感谢您的帮助
React 版本:https://codepen.io/AliKlein/pen/aPyKjy
嗨!不确定这是否只是个小故障,但它总是先打出前几个单词,然后重新开始(实际上在第二次完成时才完成)。我的意思是它最终会完成打字,但我想知道为什么每次都会出现这种小故障,以及如何修复它?
嘿,Mackenzie!可能是动画中的步骤数。可能需要根据文本的长度调整该数字和其他一些数字。
我如何循环打字机效果?
嗨。我喜欢 CSS 打字机效果。我现在正在做一个项目,想实现它,但在较小的屏幕尺寸上,我遇到了 overflow hidden 和 white-space:no wrap 的问题。我对编码还很陌生,所以也许有人可以指导我一个简单的解决方案?谢谢!
打字机只有在页面加载时才起作用,但当用户点击后退箭头时,它就不起作用了
嗨!我在这方面完全是新手,但这正是我想在我的 Squarespace 网站上整合的东西。我使用 JS 打字机来定制文本和样式。如何在 Squarespace 中添加各种代码(html、css、javascript)?
非常感谢!
嘿!看起来 Squarespace 有些关于如何在页面/网站上添加自定义 HTML/CSS/JS 的说明
https://support.squarespace.com/hc/en-us/articles/205815928-Adding-custom-HTML-CSS-and-JavaScript
嗨。非常感谢您。我正在使用第一个示例,但是,我发现很难让它在多行上打字。我应该如何处理这个问题?
您好,
光标移到网站的右侧边缘,如何解决这个问题
嘿!您是否在包含文本的容器中添加了填充?
我急需帮助。我目前正在做一个名为 SNOW 的网站。该公司是一家营销解决方案类型的公司。我想要一个打字效果,其中“SNOW”这个词打出来成为“Solutions Now”。“Solutions Now”的“S”从“SNOW”的“S”开始打出。然后在“Solutions Now”打完后,再回到最初的“SNOW”这个词。
任何关于如何在所有代码格式中实现此效果的帮助。
提前感谢
如何用这个写一个段落
它一行一行地写?
感谢您发布这篇文章,我正在我的项目中使用它。谢谢 :)
我如何让它响应式?在手机上,我的文本超出了手机屏幕的宽度。
如果打字机文本换行,下一个 div 会被字体的间距推开。是否有解决这个问题的方案?
我创建了一个(更复杂、更容易调整)的解决方案,它不依赖于等宽字体
https://stackoverflow.com/a/57887588/2397550
使用打字效果真的很有帮助,而且有很多示例。
感谢,CSS Tricks。
我们可以将这些打字的单词设为超链接吗?
嗨,各位,
我的问题是,即使我将容器的 display 设置为 inline-block 并调整步骤,橙色的光标仍然会继续到最后一个字符之后,并且在动画结束时会返回到最后一个字符之后。
因此我的文本中有 27 个字符,但它打出了大约 30 个(比我需要的多),然后返回。
有什么想法如何解决这个问题吗?我想使用它,因为它很酷 :)
我将 Simon Shahriveri 的 TxtType 构造函数重构为一个工厂函数,这样更容易直接插入并通过 start 方法打开:https://codepen.io/maxxheth/pen/LYEaxPO
以下是使用方法
const TxtType = TxtTypeFactory({loopOnce: true}); // 如果你只想在 data-type 属性中循环遍历文本数组一次!=)
TxtType.start();
嘿,这太棒了,非常感谢。有没有办法让效果在数组末尾停止?
谢谢!
你救了我好几个小时!谢谢
很棒的作品。但我有一个加载器。所以我想要在 5 秒后播放它。我该怎么做?
我是一个 CSS 新手,我想使用“更多”部分中给出的第一个动画,但动画不是无限循环的,请告诉我如何将其设置为无限循环。
如何在搜索输入的占位符中制作自动打字动画?这里有人知道吗?点击搜索输入后,占位符的动画应该暂停。在焦点离开输入后,动画应该再次恢复。希望这里有人足够聪明,能够找到解决方案!谢谢
你好
我正在尝试将其实现到 WordPress CSS 编辑器中。
它可以正常工作,但光标总是跳到行的末尾。有谁知道如何解决这个问题吗?(在上面的示例中,光标停在最后一个字母上。)
这看起来太棒了!我如何为垂直文本做到这一点?
你好!使用 JS 的第二个选项对我不起作用,当我粘贴 html 代码时,我看不到任何文本,这可能是什么原因?