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

一、介绍 👵 👵

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。如果文章对你有所帮助,能否帮我点个免费的赞和收藏😍。

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

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
Vue3 + TypeScript 是一种常用的前端开发技术组合,它结合了Vue框架的便捷性和TypeScript的类型检查能力,可以提高项目的可维护性和开发效率。下面是一些Vue3 + TypeScript项目经验的介绍: 1. 项目初始化:使用Vue CLI创建一个Vue3项目,并选择TypeScript作为项目的语言。这样可以自动生成一些基本的配置和文件结构,方便快速开始开发。 2. 类型定义:在Vue3 + TypeScript项目中,可以使用TypeScript的类型系统来定义组件的props、data、computed等属性的类型,以及事件的参数类型等。这样可以在编码过程中及早发现潜在的类型错误,提高代码的健壮性。 3. 组件开发:在Vue3 + TypeScript项目中,可以使用装饰器(decorators)来定义组件选项,例如使用@Prop来定义props属性的类型,使用@Emit来定义事件的参数类型。这样可以更清晰地描述组件的接口和行为。 4. 路由管理:在Vue3 + TypeScript项目中,可以使用Vue Router进行路由管理。通过定义路由的类型和参数类型,可以在编码过程中获得更好的类型提示和错误检查。 5. 状态管理:在Vue3 + TypeScript项目中,可以使用Vuex进行状态管理。通过定义状态的类型和操作的参数类型,可以提高代码的可读性和可维护性。 6. 第三方库的使用:在Vue3 + TypeScript项目中,可以使用第三方库,并为其编写类型声明文件,以获得更好的类型检查和代码提示。例如,可以使用axios发送HTTP请求,并为其编写类型声明文件,以确保请求参数和响应数据的类型正确。 7. 单元测试:在Vue3 + TypeScript项目中,可以使用Jest等测试框架进行单元测试。通过编写类型安全的测试用例,可以提高代码的质量和可靠性。 8. 构建和部署:在Vue3 + TypeScript项目中,可以使用Webpack等构建工具进行项目的打包和优化。通过配置合适的TypeScript编译选项和Webpack插件,可以生成高效的生产环境代码。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Etc.End

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值