前言

在 web 应用中,模拟编辑器或者模拟输入框中文字啪啦啪啦输入的效果,往往能够吸引人们的眼球,让用户的注意力聚焦在输入的内容上,其实使用的是 web 动画模拟打字机效果,本文将和大家探讨打字机效果的实现方式以及应用。

纯 css 实现

最简单的方式是莫过于直接使用 CSS 。大概思路是借助 CSS3 的 @keyframe 动画来不断改变包含文字的容器的宽度,超出容器部分的文字隐藏不展示。

<style> .typing {font-size: 20px;/* 初始宽度为0 */width: 0;height: 30px;border-right: 1px solid darkgray;animation: write 4s steps(14) forwards,blink 0.5s steps(1) infinite;overflow: hidden;}@keyframes write {0% {width: 0;}100% {width: 240px;}}@keyframes blink {50% {/* transparent是全透明黑色(black)的速记法,即一个类似rgba(0,0,0,0)这样的值。 */border-color: transparent; /* #00000000 */}} </style><body><div class="typing">自在,轻盈,我本不想停留</div>
</body>

Steps(<number_of_steps>,<direction>)

animation steps 可以让动画断断续续,而非连续执行。接收两个参数:

第一个参数指定动画分割的段数;

第二个参数可选,接受 start 和 end 两个值,指定在每个间隔的起点或是终点发生阶跃变化,默认为 end。

可以看到其实现原理很简单,打字效果其实就是改变容器的宽度实现的。 初始文字是全部在页面上的,只是容器的宽度为 0,设置文字超出部分隐藏,然后不断改变容器的宽度; 设置 border-right,并在关键帧上改变 border-colortransparent,右边框就像闪烁的光标了。

优点是简单,缺点也是有的,首先我们要先获得文本的宽度,上面的截图就是因为宽度写错了,导致光标在文字后面,然后只支持 1 行。若想要支持多行,就得使用 JavaScript 了。

js 实现

setInterval 实现

<style> /* 产生光标闪烁的效果 */#content::after{content: '|';color:#000;animation: blink 1s infinite;}@keyframes blink{from{opacity: 0;}to{opacity: 1;}} </style>
<div id='content'></div>
<script> (function () {// 获取容器const container = document.getElementById('content')// 把需要展示的全部文字进行切割const data = '自在,轻盈,我本不想停留'.split('')// 需要追加到容器中的文字下标let index = 0let timer = nullfunction writing() {if (index < data.length) {// 追加文字container.innerHTML += data[index ++]// 也可以使用,clearTimeout取消setInterval的执行// index === 4 && clearTimeout(timer)} else {clearInterval(timer)}console.log(timer) // 这里会打印出 1 1 1 1 1 ...}// 使用 setInterval 时,结束后不要忘记进行 clearIntervaltimer = setInterval(writing, 200)
})(); </script>

setInterval 版本的实现也很简单,只需把要展示的文本进行切割,使用定时器不断向 DOM 元素里追加文字即可,同时使用::after 伪元素在 DOM 元素后面产生光标闪烁的效果。代码和效果图如下:

setTimeout 实现

和 setInterval 一样,setTimeout 也可以实现

<style> /* 产生光标闪烁的效果 */#content::after{content: '|';color:#000;animation: blink 1s infinite;}@keyframes blink{from{opacity: 0;}to{opacity: 1;}} </style><div id='content'></div><script> (function () {// 获取容器const container = document.getElementById('content')// 把需要展示的全部文字进行切割const data = '自在,轻盈,我本不想停留'.split('')// 需要追加到容器中的文字下标let index = 0function writing() {if (index < data.length) {// 追加文字container.innerHTML += data[index ++]let timer = setTimeout(writing, 200)}}writing()})(); </script>

需要强调一点:定时器指定的时间间隔,表示的是何时将定时器的代码添加到消息队列,而不是何时执行代码,所以真正何时执行代码的时间是不能保证的,取决于何时被主线程的事件循环取到,并执行。

那如果想要实现暂停和播放,那就必须使用 clearTimeout() 方法来终止,

<div id='content'></div>
<button id='pause'>暂停</button>
<script> // 获取容器
const container = document.getElementById('content')
// 把需要展示的全部文字进行切割
const data = '最简单的打字机效果实现'.split('')
// 需要追加到容器中的文字下标
let index = 0
let timerdocument.querySelector('#pause').addEventListener('click',()=>{clearTimeout(timer)
})function writing() {if (index < data.length) {// 追加文字container.innerHTML += data[index ++]timer = setTimeout(writing, 200)}
}
writing() </script>

但除了暂停,还有回退,修改等操作,需要修改光标位置等,我们可以使用一个 npm 库来搞定。

Typeit 实现

<script src="https://unpkg.com/typeit@8.6.0/dist/index.umd.js"></script>

或是使用 npm 安装这个包

npm install typeit

官网首页 demo 代码

new TypeIt("#hero", {speed: 50,startDelay: 900,
}).type("the mot versti", { delay: 100 }).move(-8, { delay: 100 }).type("s", { delay: 400 }).move(null, { to: "START", instant: true, delay: 300 }).move(1, { delay: 200 }).delete(1).type("T", { delay: 225 }).pause(200).move(2, { instant: true }).pause(200).move(5, { instant: true }).move(5, { delay: 200 }).type("a", { delay: 350 }).move(null, { to: "END" }).type("le typing utlity").move(-4, { delay: 150 }).type("i").move(null, { to: "END" }).type(' on the <span class="place">internet</span>', { delay: 400 }).delete(".place", { delay: 800, instant: true }).type('<em><strong class="font-semibold">planet.</strong></em>', {speed: 100,}).go();

代码一目了然,支持暂停、删除,移动、而且还支持 html。

需要注意的是 TypeIt 在商用项目上是收费的, 在个人或者开源项目上是免费的。商用项目需要支付 $19,那么有没有免费的呢?

typed.js 实现

那如果想在商用项目上免费使用,可以使用 typed.js ,采用 MIT 开源协议,与 TypeIt 类似的 api

<script> var typed = new Typed('#typed', {stringsElement: '#typed-strings'}); </script>
<div id="typed-strings"><p>Typed.js is a <strong>JavaScript</strong> library.</p><p>It <em>types</em> out sentences.</p>
</div>
<span id="typed"></span>

对 seo 非常友好,它是在从页面上的 HTML 元素读取,再通过 js 动态插入。

打字机效果应用

程序讲究的输入和输出,虽然我们在页面上实现了动态输入的效果,若能够同步实现输出,岂不是实现了编译器的效果?

Sildev 使用 markdown 写 PPT

之前分享的 Sildev,就完美地将输入和输出效果展现在页面上

源码在这里

new TypeIt(block.value, {speed: 50,startDelay: 900,afterStep: () => {code.value = JSON.parse(JSON.stringify(block.value!.innerText.replace('|', '')))},}).type('<br><span class="token title"># 欢迎使用 Slidev!</span><br><br>', { delay: 400 }).type('为开发者打造的演示文稿工具', { delay: 400 })

其主要原理是通过 afterStep 回调函数 将页面上的输入值,设置到 state 中,然后再使用 vue 中的 watch,监听输入值的变化,将 markdown 解析成 HTML 插入到页面中。

import { ref, onMounted, watch } from 'vue'
import { parse } from '@slidev/parser'...
watch([code, paused], () => {if (paused.value)returntry {info.value = parse(code.value)}catch (e) {}
})
...

实现方式简单,但却让用户一目了然,让用户不用看文档就可以学会使用 markdown 写 PPT。

动态简历

之前在知乎上看到@方应杭用 vue 写了一个会动的简历,也是运用了打字机效果,将输入和输出完美的展现在浏览器里,若不了解其原理会觉得很高大上,但实现代码却很简单,源码在这里

学以致用

我之前使用 MDX 写了一个微信排版编辑器 MDX Editor,正好少了一个首页,能否加上打字机效果呢?

可自定义组件、样式、生成二维码、代码 diff 高亮,一键拷贝到微信,可导出 markdown 和 PDF。 关于代码和原理就就不贴了,大致和 Sildev 差不多,只不过我使用的是 react 来实现,代码已经开源,若对你有帮助, 可以点个 star,感谢您的支持!

以上就是本文全部内容,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

打字机效果的实现与应用相关推荐

  1. jq挑战30天——打字机效果+小程序

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. cdn加载插件和npm安装的差别_web开发:打字机效果插件Typed.js

    本文同步发表在我的个人博客中: 沧沧凉凉​www.cclliang.com 打字机效果是非常酷的文字显示效果,视觉表现极佳,而通过Typed.js可以很简单的在web开发中实现打字机效果. 1. 官网 ...

  3. Gamemaker studio2经验(4)——打字机效果

    问题概述 在很多游戏中--算了实在不好意思写引言了,就直说啦.如果你是UT粉,想用gm搞搞UT的同人作品但是又无从下手,那么请看过来. 对于RPG类游戏,文字交流系统是不可或缺的,但是gm的文字系统- ...

  4. 如何实现文字逐个出现的打字机效果

    嗨!大家好,我是小蚂蚁. 今天分享一下如何在微信小游戏制作工具中实现文字逐个出现的打字机效果,这个小功能可以用于游戏中的文字对白的展示,如果你要做的是一个文字类游戏的话,那么肯定用的上. 最终的效果如 ...

  5. html5 打字机效果,使用JavaScript制作打字机文本效果

    我们在看电影时经常能够看到一些炫酷的打字机效果,用于显示一些地名或剧情简介.我们在网页中也能够实现类似的效果,目前网上已经有很多打字机效果的插件,如轻量级响应式jQuery打字机特效插件和逼真的js打 ...

  6. java图形打字机_Android模仿打字机效果的自定义View实现

    前言 在做splash界面的时候,需要做类似于打字机打字的效果,字一个一个地蹦出来,显示每一个字都带有打字的声音. 效果演示 本例自定义View的演示效果如下(PS:一直不知道在Android上怎么录 ...

  7. AEJoy —— 表达式之闪烁光标的打字机效果(二)【JS】

    效果图 打字机效果之红色闪烁的鼠标光标 一旦您知道在哪里添加表达式,为键入动画的光标添加颜色实际上是很容易的. 演示的打字机动画与闪烁的彩色光标下面 下面我创建了 4 种方法来学习这个 After E ...

  8. Vue3实现打字机效果

    typeit 介绍 typeit是一款轻量级打字机特效插件.该打印机特效可以设置打字速度,是否显示光标,是否换行和延迟时间等属性,它可以打印单行文本和多行文本,并具有可缩放.响应式等特点.官方文档 安 ...

  9. Creator新手引导 | 限制只能点击一个按钮 | 文字打字机效果

    效果 实现这个非常简单巧妙 源码在文末 实现思路 节点有点多,一个一个讲解下 bg是游戏背景图,主要是为了和灰黑色的遮罩区别 Btn_parent是三个按钮的父节点,加了一个layout,使每个按钮不 ...

  10. 利用JavaScript分别实现倒计时、跑马灯和打字机效果

    倒计时代码如下 <!DOCTYPE html> <html lang="en"> <head><meta charset="UT ...

最新文章

  1. python几种数据类型的取值方式
  2. 计算机网络安全防护体系研究
  3. Logstash5.4.1解析日志报错处理
  4. Javaweb学习笔记——(五)——————DOMXML目录
  5. Linux下文本处理命令的使用
  6. 250相当于什么显卡_2K(4K)144hz显示器需要什么显卡来带? 本文将给你答案。
  7. 各国市场分析(捷克,印度)
  8. 从sqlserver中数据写入mysql_从SQL server数据库导入Mysql数据库的体验
  9. idea中开启Run Dashboard
  10. STM32F1笔记(三)UART/USART
  11. dll侧加载_WORD打开时出现加载DLL错误解决方法
  12. 新书速递 | 《知识图谱:方法、实践与应用》
  13. 一个黑色全屏的计时器_我入手了一个1000多的智能手环,值吗?|Fitbit Charge 4测评...
  14. clipse中使用maven插件的时候,运行run as maven build的时候报错:
  15. 推荐linux输入法,linux中文输入法 【搞定技巧】
  16. C语言中的常见关键字
  17. 自动驾驶扎堆“重感知”路线:毫末智行如何从独行到领航?
  18. 置信区间的临界值_在用正态分布进行置信区间估计时,临界值2.58所对应的置信水平是( )。...
  19. 工地上的这些工种工资差距很大,你知道是哪些工种吗?
  20. linux刷新分区表,linux磁盘分区的详细步骤(图解linux分区命令使用方法)

热门文章

  1. 寻找反素数python
  2. unity il2cpp 热更实现
  3. UI设计公司面试时会提哪些问题?
  4. NCBI数据上传(一):扩增子测序数据
  5. DirectX显示流程学习小结
  6. 注塑模具设计的技术知识汇总
  7. HttpClient:connection still allocated 完美处理
  8. 伊甸园日历游戏 飘飘乎居士拯救MM(tyvj 1968 1140)
  9. 【读书笔记】掌控习惯_詹姆斯克里尔
  10. 13-02-uniapp供热服务接口配置