vue 实现打字机效果

news2024/9/22 1:13:56

打字机效果组件,支持像打字机一样模仿键入文本。支持vue 插值语法和表格等打印

ps: 灵感来着于vue-type-writer 但是 这个组件过于简单 就自己整了一个

一、预览

在这里插入图片描述

二、代码

组件:

<template>
  <div :style="{ visibility: visibility }">
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: "vue-text-dot",
  props: {
    // 间隔时间
    interval: { type: Number, default: 75 },
    // 光标 建议有表格的时候不要使用光标 会导致渲染异常
    cursorStr: {
      type: String,
      default: "",
    },
  },
  data() {
    return {
      visibility: "hidden", // 
      timer: 0, // 定时器
      initialDom: null, // 记录初始dom
      progress: 0, // 当前文本书写进度
      // writeStatus: "NotStart",// 当前书写状态=> NotStart: 未开始;Processing:书写中;Completed 书写完毕
    };
  },
  mounted() {
    // 拷贝初始所有dom 便于重新开始
    this.initialDom = JSON.parse(JSON.stringify(this.$el.innerHTML));
  },
  methods: {
    // 开始 / 重新开始
    start() {
      this.visibility = "visible";
      this.progress = 0;
      this.$el.innerHTML = "";
      clearInterval(this.timer);
      this.write();
      this.$emit("writeStart");
    },
    // 暂停
    pause() {
      clearInterval(this.timer);
      this.$emit("writePause");
    },
    // 继续
    continueWrite() {
      if(!this.progress || this.progress >= this.initialDom.length){
        return
      }
      clearInterval(this.timer);
      this.write();
      this.$emit("writeContinue");
    },
    // 重置
    reset() {
      this.visibility = "hidden";
      this.progress = 0;
      this.$el.innerHTML = "";
      clearInterval(this.timer);
    },
    // 书写
    write() {
      this.timer = setInterval(() => {
        var current = this.initialDom.substr(this.progress, 1);
        // console.log(current);
        // 跳过 标签渲染
        if (current === "<") {
          this.progress = this.initialDom.indexOf(">", this.progress) + 1;
        } else {
          this.progress++;
        }
        // console.log(this.progress & 1, "this.progress");
        // 如果有光标配置 拼接到最新渲染的地方
        if (this.cursorStr) {
          this.$el.innerHTML =
            this.initialDom.substring(0, this.progress) +
            (this.progress < this.initialDom.length && this.progress & 1
              ? this.cursorStr
              : "");
        } else {
          this.$el.innerHTML = this.initialDom.substring(0, this.progress);
        }
        // 文本书写进度 大于需要书写的总长度 判断为渲染完成
        if (this.progress >= this.initialDom.length) {
          clearInterval(this.timer);
          this.$emit("writeEnd"); // 打字完成后的回调方法
        }
      }, this.interval);
    },
  },
  beforeDestroy() {
    clearInterval(this.timer);
  },
};
</script>

父级组件引用

<template>
  <div class="app-container home">
    <div class="body">
      <button type="primary" @click="start">开始 / 重新开始</button>
      <button type="primary" @click="pause">暂停</button>
      <button type="primary" @click="continueWrite">继续</button>
      <button type="primary" @click="reset">重置</button>
      <VueTypewriter
        class="tl"
        ref="typewriter"
        :interval="50"
        cursorStr=""
        @writeEnd="writeEnd"
      >
        <div class="comments">
          <p>const array = [1, 2, 2, 3, 4, 4, 5];</p>
          <p>const uniqueArray = Array.from(new Set(array));</p>
          <p>console.log(uniqueArray);</p>
          <p>{{ message }}</p>
        </div>
        <table>
          <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
            <td>4</td>
            <td>5</td>
            <td>6</td>
            <td>7</td>
            <td>8</td>
            <td>9</td>
            <td>0</td>
          </tr>
        </table>
      </VueTypewriter>
    </div>
  </div>
</template>

<script>
import VueTypewriter from "./vue-typewriter";
export default {
  name: "Demo",
  components: { VueTypewriter },
  data() {
    return {
      message: "测试插值表达式 是否能够正常渲染",
    };
  },
  methods: {
    // 开始
    start() {
      this.$refs.typewriter.start();
    },
    // 暂停
    pause() {
      this.$refs.typewriter.pause();
    },
    // 继续
    continueWrite() {
      this.$refs.typewriter.continueWrite();
    },
    // 重置
    reset() {
      this.$refs.typewriter.reset();
    },
    // 结束回调
    writeEnd() {
      console.log("end");
    },
  },
};
</script>

<style scoped lang="scss">
.home {
  text-align: left;
  .body {
    width: 890px;
    height: 500px;
    padding: 20px;
    border: #b2c92a solid 10px;
    button {
      margin-right: 20px;
      padding: 8px 20px;
    }
    .comments {
      p {
        font-size: 18px;
        color: green;
      }
    }
    table {
      margin: 20px 0;
      border-collapse: collapse;
      td {
        padding: 10px 20px;
        border: 1px solid #ccc;
      }
    }
  }
}
</style>

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

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

相关文章

皇后游戏1

先把这个推导看完 现在我们来讲一下总结 首先&#xff0c;我们要观察到 c i c_i ci​递增&#xff0c;这样才能更简单&#xff0c;就不用像国王游戏那样在交换前后比较 i i i和 j j j的max了&#xff08;就是说&#xff0c;国王游戏需要比较 m a x ( c i , c j ) max(c_i,c_j)…

酒店管理系统(C语言)

系统分析 本系统分为以下6大模块&#xff1a;顾客登记模块、查询顾客信息模块、查询空房间模块、预订房间模块、退订房间模块、保存并退出模块&#xff0c;如下图所示。 1. 顾客结构体 2. 主菜单的设计及实现 3. 登记顾客模块的实现 4. 查询顾客信息功能的实现 5. 查询空房间功…

ubuntu系统vscode调试c/c++大中型项目

文章目录 1. 插件2. 项目工程3. vsode的配置setting.jsonc_cpp_properties.json 4. 启动调试 前置阅读 vscode调试第一篇 1. 插件 c/c, cmake, cmake tools 2. 项目工程 对于我的项目需要用到很多的三方库&#xff0c;三方库的版本又会有很多&#xff0c;一般都是用cmake编译…

建图,链式前向星,拓扑排序

建图&#xff0c;链式前向星&#xff0c;拓扑排序 建图的三种方式1.邻接矩阵2.邻接表3.链式前向星 拓扑排序练习题-课程表字典序最小的拓扑排序拓扑排序模板题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 例题1.火星字典2.戳印序列 建图的三种方式 1.邻接矩阵 …

485,Modbus,开关量,UART,I2C,4-20mA,0-5V,TTL接口区别

工业和电子通信中最常见的几种类型&#xff0c;它们在数据传输方式、信号类型、通信协议、应用领域和物理特性上有所不同。下面分别解释这些接口的区别&#xff1a; 1. RS-485 类型&#xff1a;半双工差分信号传输。用途&#xff1a;用于长距离、多点通信场合&#xff0c;如楼…

Redis--12--1--分布式锁---java

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis与分布式锁Jedis实现1.RedisConfig2.RedisDistLock3.应用4.加上看门狗逻辑 RedisDistLockWithDog redisson实现1.依赖2.代码 Redis与分布式锁 Jedis实现 1.Re…

spring security如何适配盐存在数据库中的密码

19.token认证过滤器代码实现_哔哩哔哩_bilibili19.token认证过滤器代码实现是SpringSecurity框架教程-Spring SecurityJWT实现项目级前端分离认证授权-挑战黑马&尚硅谷的第20集视频&#xff0c;该合集共计41集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信

目录 引言 5.4 直接C2通信 5.4.1 概述 5.4.2 A2X直接C2通信服务的授权策略 5.4.3 USS使用A2X直接C2通信服务的C2授权程序 5.4.4 直接C2通信建立程序 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别…

手动构建线性回归(PyTorch)

import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt import random #1.构建数据 #构建数据集 def create_dataset():x,y,coefmake_regression(n_samples100,n_features1,random_state0,noise10,coefTrue,bias14.5)#将构建数据转换为张…

AI大模型的风过去了?不,是离我们越来越近了

OpenAI摊牌了。不再掩藏锋芒&#xff0c;拿年初预测的2亿美元收入做挡箭牌&#xff0c;“我们的年营收达到了13亿美元。”10月中旬Sam Altman终于透露出来。13亿美元&#xff0c;同比增长4500%。 国内。资本和公众的视线越来越多地放在局势变幻、芯片和造车上。 △三季度融资行…

学习系列一:YOLO系列目标检测框架之间介绍及对比

YOLO系列目标检测框架之间介绍及对比 华为HCIP AI高级工程师证书&#xff0c; 华为HCIA AI证书&#xff0c;目前从事视觉算法工作 文章目录 YOLO系列目标检测框架之间介绍及对比前言一、YOLOv1二、YOLOv2三、YOLOv3四、YOLOv4五、YOLOv5及后续算法 前言 YOLO系列算法 YOLO 创…

《0基础》学习Python——第十七讲__正则表达式(requests)

一、什么是正则表 正则表达式是一种用于匹配和操作字符串的强大工具。它可以用于检索、替换和验证字符串。正则表达式使用特定的语法来描述字符串的模式&#xff0c;然后用于查找符合该模式的字符串。 在Python中&#xff0c;可以使用re模块来使用正则表达式。re模块提供了一组…

启动流程和切换流程

启动流程 #mermaid-svg-iUWGw8xl1SyAmoo9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iUWGw8xl1SyAmoo9 .error-icon{fill:#552222;}#mermaid-svg-iUWGw8xl1SyAmoo9 .error-text{fill:#552222;stroke:#552222;}#…

3D培训大师创新培训体验,加速空调关键组件的高效精准安装

如今&#xff0c;空调系统的复杂性和精密性与日俱增&#xff0c;对专业技术人员的要求也日益提高。尤其是决定空调是否能平稳运行的空调关键组件的装配培训&#xff0c;不再局限于传统的理论讲解和实体模型演示&#xff0c;而是更注重数字化、沉浸式学习。 案例背景 某空调公…

代码随想录算法训练营Day26 | 491.递增子序列 | 46.全排列 | 47.全排列 II | 332.重新安排行程 | 51.N皇后 | 37.解数独

今日任务 491.递增子序列 题目链接&#xff1a; https://leetcode.cn/problems/non-decreasing-subsequences/description/题目描述&#xff1a; Code class Solution { public:vector<vector<int>> findSubsequences(vector<int>& nums) {vector&l…

[PM]数据分析

概览 数据的定义 运营数据 分析的目的 数据分析流程 1.明确目标 2.数据来源 3.采集数据 4.数据整理 5.数据分析 趋势分析 当数据出现异常&#xff0c;一般从3个角度去查找问题&#xff1a; 1.技术层面&#xff0c;是不统计出错&#xff0c;或者产品出现bug 工 2.产品层面&am…

haproxy服务介绍

haproxy 搭建使用开启HAProxy的界面UI配置负载均衡配置web代理 HAProxy&#xff08;High Availability Proxy&#xff09;是一个高性能的TCP/HTTP负载均衡器和代理服务器&#xff0c;广泛用于提升Web应用的可用性和性能。[官网说明](https://docs.haproxy.org/2.8/intro.html#3…

羊大师:户外狂欢羊奶滋养,年轻人的活力养生新潮流

在这个快节奏的时代&#xff0c;年轻人正以他们独有的方式&#xff0c;重新定义着健康与养生的概念。他们深知&#xff0c;气血不足不应是青春的代名词&#xff0c;而应是活力四射的前奏。于是&#xff0c;一群年轻人以“发癫式”打卡的创意方式&#xff0c;将户外活动的乐趣推…

[保姆级教程]uniapp安装使用uViewUI教程

文章目录 创建 UniApp 项目下载uView UI下载安装方式步骤 1: 安装 uView UI步骤 2: 查看uView UI是否下载成功步骤 3: 引入 uView 主 JS 库步骤 4: 引入 uView 的全局 SCSS 主题文件步骤 5: 引入 uView 基础样式步骤 6: 配置 easycom 组件模式注意事项 NPM方式步骤 1: 安装 uVi…

跟代码执行流程,读Megatron源码(二)训练入口pretrain_gpt.py

Megatron-LM默认支持GPT、T5、BERT等多个常见模型的预训练&#xff0c;当下大模型流行&#xff0c;故以pretrain_gpt.py为例做源码的走读。 一. 启动pretrain_gpt.py pretrain_gpt.py为GPT类模型的训练入口&#xff0c;它通过命令行形式被调用&#xff0c;其精确执行路径位于M…