Vue3 + TypeScript 实现自动打字、打字机动画、动画打字工具(TypeIt)

news2024/10/3 21:28:44

一、介绍 👵 👵

TypeIt是一个JavaScript库,用于创建简单而流畅的打字效果和动画效果。它可以用于网页开发中的很多场景,例如创建动态文字效果、制作页面过渡动画、增强用户体验等。

我们还可以利用它进行一些后端日志的回显,如果某个进程后端实时或者定时返回结果,前端进行一个动画打字的回显功能,一方面可以让我们的页面更丰富,另一方面可以给客户一个很好的体验。

配置项说明  👇 👇 👇

名称默认值参数类型描述
strings[]string | array要键入的文本字符串。
speed100number打字速度,每步之间以毫秒为单位测量
deleteSpeednullnumber | null删除速度。如果留空,将是类型速度的 1/3。
lifeLiketrueboolean使打字速度不规则,就好像真人在做一样。
cursortrueboolean | CursorOptions

在字符串末尾显示闪烁的光标,

或覆盖默认动画

cursorSpeed1000number光标的闪烁速度,以毫秒为单位。
cursorChar|string用于光标的字符。HTML 也可以!
breakLinestrueboolean控制是否将多个字符串打印在彼此之上
nextStringDelay750number | array键入多个字符串之间的时间量
waitUntilVisiblefalseboolean

确定实例是在 上自动开始键入.go()

还是仅当目标元素在视口中可见时

才开始键入

startDeletefalseboolean

是否通过删除元素内的字符串开始实例,

然后键入通过 JSON 或

伴随函数定义的字符串

startDelay250number插件初始化后开始输入之前的时间量。
loopfalseboolean您的字符串是否会在完成后继续循环。
loopDelaynullnumber | array

再次循环一个字符串或一

组字符串之间的时间量

htmltrueboolean控制字符串是被解析为 HTML

二、安装依赖 🏃 🏃

yarn add typeit

三、使用 👲 👲

1、官网示例 👇 👇 👇

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();

2、效果 👇 👇 👇

四、模拟异步请求 不断追加内容 🙇 🙇

1、API 👇 👇 👇

这里的话我用延迟器模拟数据在不断的更新,比如每次返回的数据都是最新的,我只需要追加在后面即可,那根据官方的demo,只需要使用type和flush。

2、完整代码 👇 👇 👇

<template>
    <div style="text-align: center;font-size: 30px;font-weight: bold;">不断叠加</div>
    <div id="element">
    </div>
</template>

<script lang="ts">
import TypeIt from "typeit";
export default defineComponent({
    setup() {

        const total = ref<number>(10)

        const instance: any = ref()

        const generatorContent = (i: number) => {
            const timer = setInterval(() => {

                if (i >= total.value) {
                    clearInterval(timer);
                    instance.value.type(`<br>11:23:56 [vite] hmr update /src/views/home.vue (X${i})`).flush();

                } else {
                    instance.value.type(`<br>11:23:56 [vite] hmr update /src/views/home.vue (X${i})`).flush();
                }
                i++;
            }, 500);

            instance.value.go()
        }

        onMounted(() => {
            instance.value = new (TypeIt as any)('#element', {
                speed: 10, //打字的速度,每步之间以毫秒为单位测量。
                lifeLike: false, // 使打字速度不规则,就好像真人在做一样。
                html: true
            })
            // instance.value.reset();
            generatorContent(0)
        })

        return {
        }
    }
})
</script>

<style>
#element {
    height: calc(100% - 40px);
    width: 100%;
    background: #1e1f22;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    color: #d5dadd;
}
</style>

五、模拟异步请求 不断更新内容 👴 👴

这里的话我用延迟器模拟数据在不断的更新,但是每次返回的数据都是追加过的内容,需要把新的数据内容提取出来追加在现有的数据上,我这里只是一个demo,自己根据自己的情况去提取,然后api的话和上面一样的。

<template>
    <div style="text-align: center;font-size: 30px;font-weight: bold;">不断追加更新</div>
    <div id="element">
    </div>
</template>

<script lang="ts">
import TypeIt from "typeit";
export default defineComponent({
    setup() {

        const contentList = ref<string[]>([
            '11:23:56 [vite] hmr update /src/views/home.vue (X0)',

            '11:23:56 [vite] hmr update /src/views/home.vue (X0)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X1)',

            '11:23:56 [vite] hmr update /src/views/home.vue (X0)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X1)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X2)',

            '11:23:56 [vite] hmr update /src/views/home.vue (X0)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X1)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X2)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X3)',

            '11:23:56 [vite] hmr update /src/views/home.vue (X0)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X1)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X2)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X3)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X4)',

            '11:23:56 [vite] hmr update /src/views/home.vue (X0)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X1)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X2)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X3)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X4)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X5)',

            '11:23:56 [vite] hmr update /src/views/home.vue (X0)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X1)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X2)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X3)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X4)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X5)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X6)',

            '11:23:56 [vite] hmr update /src/views/home.vue (X0)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X1)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X2)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X3)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X4)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X5)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X6)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X7)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X8)',

            '11:23:56 [vite] hmr update /src/views/home.vue (X0)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X1)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X2)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X3)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X4)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X5)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X6)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X7)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X8)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X9)',

            '11:23:56 [vite] hmr update /src/views/home.vue (X0)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X1)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X2)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X3)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X4)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X5)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X6)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X7)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X8)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X9)',

            '11:23:56 [vite] hmr update /src/views/home.vue (X0)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X1)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X2)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X3)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X4)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X5)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X6)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X7)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X8)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X9)<br>' +
            '11:23:56 [vite] hmr update /src/views/home.vue (X10)'
        ])

        const total = ref<number>(10)

        const instance: any = ref()

        const generatorContent = (i: number) => {
            const timer = setInterval(() => {
                const content = i === 0 ? contentList.value[i] : contentList.value[i].split(contentList.value[i - 1])[1]
                if (i >= total.value) {
                    clearInterval(timer);
                    instance.value.type(content).flush();
                } else {
                    instance.value.type(content).flush();
                }
                i++;
            }, 500);

            instance.value.go()
        }

        onMounted(() => {
            instance.value = new (TypeIt as any)('#element', {
                speed: 10, //打字的速度,每步之间以毫秒为单位测量。
                lifeLike: false, // 使打字速度不规则,就好像真人在做一样。
                html: true
            })
            generatorContent(0)
        })

        return {
        }
    }
})
</script>

<style>
#element {
    height: calc(100% - 40px);
    width: 100%;
    background: #1e1f22;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    color: #d5dadd;
}
</style>

不管是哪一种方式,体现出来的动画都是一样的。 

我是Etc.End。如果文章对你有所帮助,能否帮我点个免费的赞和收藏😍。

👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇 👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

想让 ChatGPT 帮忙进行数据分析?你还需要做......

近年&#xff0c;火出圈的 ChatGPT 掀起了久违的人工智能的热潮&#xff0c;如何更好地让人工智能真正为企业所用&#xff0c;也成了近期的热门话题。大数据和人工智能两者相辅相成&#xff0c;人工智能的训练以大量数据作为基础&#xff0c;而数据的价值则需要人工智能的充分挖…

nacos和eureka的区别

nacos和eureka的区别 Eureka是什么 Eureka详解Nacos是什么 Nacos详解Nacos和Eureka的区别 CAP理论连接方式服务异常剔除操作实例方式自我保护机制 Eureka是什么 Eureka 是Spring Cloud 微服务框架默认的也是推荐的服务注册中心,由Netflix公司与2012将其开源出来,Eureka基于RE…

《剪花布条》:从花布条中尽可能剪出几块小饰条

目录 一、题目 二、思路 1、代码中要使用的String类中的方法 &#xff08;1&#xff09;判断 s 中是否有 t &#xff08;2&#xff09;将 s 分割 2、递归判断 三、代码 详细注释版本 简化注释版本 一、题目 题目&#xff1a;剪花布条 题目链接&#xf…

8、DRF实战总结:分页(Pagination)及DRF提供的分页类详解(附源码)

在前面的DRF系列教程中&#xff0c;以博客为例介绍了序列化器, 使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API接口&#xff0c;并详细对权限和认证(含jwt认证)进行了总结与演示。在本篇文章中将向演示如何在Django REST Framework中使用分页。…

【MySQL】进阶查询-聚合查询和联合查询

文章目录1. 前言2. 表的设计2.1 一对一2.2 一对多2.3 多对多3.将查询结果放到另一个表中4. 聚合查询4.1 聚合函数4.2 GROUP BY4.3 HAVING5. 联合查询(多表查询)5.1 内连接5.2 外连接5.3 自连接5.4 子查询5.5 合并查询6. 总结1. 前言 文章主要围绕着以下三个问题: group by的作…

zookeeper介绍和搭建

zookeeper介绍和搭建一、zookeeper简介二、zookeeper工作机制三、zookeeper集群部署3.1 实验准备3.2 修改配置文件3.3 创建目录以及拷贝文件3.4 配置Zookeeper启动脚本3.5 查看启动状态一、zookeeper简介 1、zookeeper概念 ZooKeeper是一种为分布式应用所设计的高可用、高性能…

尚融宝20-实现用户注册和用户认证

目录 一、需求 二、前端整合发送验证码 三、实现用户注册 1、创建VO对象 2、定义常量 3、引入MD5工具类 4、Controller 5、Service 6、前端整合 四、实现用户登录 1、后端整合JWT 2、前端整合 五、校验用户登录 1、后端 2、前端 一、需求 二、前端整合发送验证码…

数据结构———一万字手撕八大排序算法

常见的排序算法1.排序算法的作用1.1列如我们在购物时1.2玩游戏时英雄战力的排行&#xff0c;都得用到排序算法2.常见排序算法的实现2.1冒泡排序时间复杂度计算&#xff1a;2.2直接插入排序时间复杂度计算&#xff1a;2.3选择排序时间复杂度计算&#xff1a;2.4希尔排序⭐时间复…

Qt音视频开发28-ffmpeg解码本地摄像头(yuv422转yuv420)

一、前言 一开始用ffmpeg做的是视频流的解析,后面增加了本地视频文件的支持,到后面发现ffmpeg也是支持本地摄像头设备的,只要是原则上打通的比如win系统上相机程序、linux上茄子程序可以正常打开就表示打通,整个解码显示过程完全一样,就是打开的时候要传入设备信息,而且…

Prophet学习(五)季节性、假日效应和回归因子

​ 编辑目录 假期和特殊事件建模&#xff08;Modeling Holidays and Special Events&#xff09; 内置国家假日&#xff08;Built-in Country Holidays&#xff09; 季节性的傅里叶级数&#xff08;Fourier Order for Seasonalities&#xff09; 指定自定义季节&#xff08…

启动neo4j备忘录

做个备忘录 Neo4j下载、安装、环境配置 优秀教程&#xff1a;https://blog.csdn.net/zeroheitao/article/details/122925845 Neo4j环境变量配置 1、安装JDK 由于Neo4j是基于Java的图形数据库&#xff0c;运行Neo4j需要启动JVM进程&#xff0c;因此必须安装JAVA SE的JDK。配置…

【数据结构】反射

文章目录&#x1f337; 1 定义&#x1f337; 2 用途(了解)&#x1f337; 3 反射基本信息&#x1f337; 4 反射相关的类&#x1f333; 4.1 Class类(反射机制的起源)Class类中的相关方法&#x1f333; 4.2 反射示例4.2.1 获得Class对象的三种方式4.2.2 反射的使用⭐️反射使用1&a…

3个宝藏级软件,每一个都超级好用,少装一个跟你急

分区助手 下载地址&#xff1a;https://www.disktool.cn/ 很多新手小白使用电脑都不懂&#xff0c;把所有软件都安装到了C盘&#xff0c;时间久了储存的东西变多&#xff0c;C盘空间着实不够用&#xff0c;这个免费的工具可以帮你重新分区&#xff0c;无损数据地执行。除了无损…

腾讯云8核16G18M轻量服务器CPU带宽流量性能测评

腾讯云轻量应用服务器8核16G18M带宽&#xff0c;18M公网带宽下载速度峰值可达2304KB/秒&#xff0c;相当于2.25M/s&#xff0c;系统盘为270GB SSD盘&#xff0c;3500GB月流量&#xff0c;折合每天116GB流量。腾讯云百科分享腾讯云轻量服务器8核16G18M配置、CPU型号、公网带宽月…

ChatGPT资讯—2023.4.3

一、 最新资讯 1. UC伯克利开源大语言模型Vicuna又来了 Vicuna-13b只需要花费300美刀&#xff08;比Alpaca的600美元便宜一半&#xff09;就能搞出来接近ChatGPT的水平。如何用小资源大模型让个人普通者与中小微企业也能用上高科技一直是开源社区孜孜追求的目标 Vicuna开源代…

ERP与CRM、MRP、PLM、APS、MES、WMS、SRM的关系

数字化转型中少不了ERP系统的存在&#xff0c;CRM/MRP/PLM/APS/MES/WMS/SRM这些都需要一起上吗&#xff1f; 如下图所示&#xff0c;是某企业IT系统集成架构流图。 先了解一下ERP是做什么的&#xff0c;ERP就是企业资源管理系统&#xff0c;从企业的价值链分析&#xff0c;企业…

用机器学习sklearn+opencv-python过古诗文网4位数字+字母混合验证码

目录 获取验证码图片 用opencv-python处理图片 制作训练数据集 训练模型 识别验证码 编写古诗文网的登录爬虫代码 总结与提高 源码下载 在本节我们将使用sklearn和opencv-python这两个库过掉古诗文网的4位数字字母混合验证码&#xff0c;验证码风格如下所示。 验证码获…

分库分表介绍以及shardingjdbc实现分库分表

分库分表概念 一、什么是分库分表 分库分表是在海量数据下&#xff0c;由于单库、表数据量过大&#xff0c;导致数据库性能持续下降的问题&#xff0c;演变出的技术方案。 分库分表是由分库和分表这两个独立概念组成的&#xff0c;只不过通常分库与分表的操作会同时进行&…

还不懂怎么设计超时关单?一文告诉你!

背景介绍 ​ 提交订单&#xff0c;是交易领域避不开的一个话题。在提交订单设计时&#xff0c;会涉及到各种资源的预占&#xff1a;如商品库存、优惠券数量等等。但是&#xff0c;下单的流程并不能总是保证成功的&#xff0c;如商品库存异常的时候被拦截、优惠券数量不足的时候…

3月更新 | Visual Studio Code Python

我们很高兴地宣布&#xff0c;2023年3月版 Visual Studio Code Python 和 Jupyter 扩展现已推出&#xff01; 此版本包括以下改进&#xff1a; 后退按钮和取消功能添加到创建环境命令默认情况下&#xff0c;Python 扩展不再附带 isortJupyter 笔记本中内核选择的改进Python P…