首页 > 其他分享 >如何让文本模拟打字效果出现

如何让文本模拟打字效果出现

时间:2023-09-01 14:33:39浏览次数:67  
标签:index const 打字 timer content fn 文本 模拟 myInterval

最近在做一个chatGpt聊天页面,需要把后端返回的文本以打字的效果输出。

一开始想着是利用CSS的动画效果来实现。实现方式如下:

<html>
<head>
  <title>Typing</title>
</head>
<style>
  body {
    background: navajowhite;
    background-size: cover;
    font-family: 'Trebuchet MS', sans-serif;
  }

  .container {
    display: inline-block;
  }

  .content {
    overflow: hidden;
    border-right: .15em solid orange;
    white-space: nowrap;
    animation: typing 2s steps(20, end) forwards;
    font-size: 1.6rem;
    width: 0;
  }

  @keyframes typing {
    from {
      width: 0
    }
    to {
      width: 100%
    }
  }
</style>

<body>
  <div class="container">
    <div class="content">很明显,最初的打字机没有闪烁光标,但增加一个来模仿现代电脑/文字处理器闪烁光标的效果已经成为一种传统。闪烁的光标动画有助于使打印出来的文本从静态文本元素中脱颖而出</div>
  </div>
</body>

</html>

  上面的代码可以实现单行文本不允许换行的前提下的打字效果。但是多行文本是不支持的,一旦允许换行,看到的效果真的是“惨不忍睹”。于是寻找其他的办法,利用JS来实现。最终也是采用了这个方法。

利用JS来实现的原理就是用JS截取字符串的方式。利用定时器每隔一定的时间一个一个字符的截取,然后拼装输出。这里特别提一下,定时器我这边是用的setTimeout来模拟setInteval效果来实现的,为什么要这样做,可以自行百度一下setInterval的缺点。

setTimeout模拟setInterval的代码如下:

 let timer = null;
  function myInterval(fn, bool) {
    if (timer) {
      clearTimeout(timer);
    }

    if (bool) {
      return;
    }
    //
    timer = setTimeout(() => {
      const result = fn()
      myInterval(fn, result);  
    }, 100)
  }

以上方法中增加了bool条件用来结束定时器,该值来源于回调函数fn的返回值。这么做的目的是想在需要截取的文字全部截图完之后,自动停止定时器,提高性能,节约资源。

接下来就是截取文字和如何输出,代码如下:

const content= document.getElementById('content');
const text= content.innerText;
myInterval(() => {
    index++;
    content.innerText = text.substring(0, index++);
    if (index > text.length) {
      return true;
    }
})

至此,文字输出为打字效果就完成了。完整代码如下:

<html>
<head>
  <title>Typewriter effect</title>
</head>

<body>
  <div class="container">
    <div id="content">
      正文: 亲爱的们,你们还在为周末的早餐去哪里吃而发愁吗?让我来为你们揭晓答案!那就是——“阳光下的蛋饼” Brunch店! 

标签:index,const,打字,timer,content,fn,文本,模拟,myInterval
From: https://www.cnblogs.com/brucefq/p/17671822.html

相关文章

  • KMP算法--解决字符串匹配问题--模式串是否在文本串出现过
    KMP算法--解决字符串匹配问题--模式串是否在文本串出现过*利用之前判断过的信息,通过next数组保存最长公共子序列的长度*搜索词/模式串移动的位数=已匹配的字符数-对应的部分匹配值在韩的例子里ABCDABD初次匹配匹配了ABCDAB6位,对应2,所以移动6-2=4位e.g.文本串aabaabaaf......
  • js富文本处理函数
    constformatRichText=(html)=>{ letnewContent=html.replace(/<img[^>]*>/gi,function(match,capture){ match=match.replace(/style="[^"]+"/gi,'').replace(/style='[^']+'/gi,''); mat......
  • MindSponge分子动力学模拟——定义一个分子系统(2023.08)
    技术背景在前面两篇文章中,我们分别介绍了分子动力学模拟软件MindSponge的软件架构和安装与使用教程。这里我们进入到实用化阶段,假定大家都已经在本地部署好了基于MindSpore的MindSponge的编程环境,开始用MindSponge去做一些真正的分子模拟的工作。那么分子模拟的第一步,我们就需要......
  • vim evil 处理大于号小于号中间的文本
    //删除<>和<>中间的文本ca<或ca>参考链接:[[https://www.cnblogs.com/wkfvawl/p/9821411.html][键盘符号中英文对照表-王陸-博客园'0.0']][[https://github.com/tpope/vim-surround/issues/209][Surroundwithanglebrackets·Issue#209·tpope/vim-surround......
  • 20230802模拟赛
    20230802模拟赛T1数学题题意令\(A,B,C\)为三个质数(\(A\leqB\leqC\)),\(N=A\timesB\timesC\)。给出\(N(1\leqN\leq10^{14})\),求\(B\)。题解由\(A\leqB\leqC\)可证复杂度直接枚举\(1e7\)个质数,求\(B\)。T2子序列题意给定一个长度为\(n(\leq35)\)的序列:......
  • 文本标注技术方案(NLP标注工具)
    Doccanodoccano是一个面向人类的开源文本注释工具。它为文本分类、序列标记和序列到序列任务提供注释功能。您可以创建用于情感分析、命名实体识别、文本摘要等的标记数据。只需创建一个项目,上传数据,然后开始注释。您可以在数小时内构建数据集。支持命名实体识别,情感分类,机器......
  • 工作流添加语音转文本节点
    工作流开源版本没有语音转文本节点现添加语音转文本节点使用科大讯飞语音转写功能,科大讯飞语音输出文本参考:https://www.cnblogs.com/minseo/p/17656234.html......
  • 坐标文本转图片
    坐标文本格式类似101112341155#脚本文件importmatplotlib.pyplotaspltimportnumpyasnpx=[]y=[]withopen('message.txt','r')asf:datas=f.readlines()fordataindatas:arr=data.split('')x.app......
  • 模拟集成电路设计系列博客——1.3.2 增益提升
    1.3.2增益提升之前在电流镜章节提到过应用放大器来增加电流镜输出阻抗,同样的技术被用于增加Cascode增益级的输出阻抗,如下图所示:其增益由下式给出:\[A_v(s)=\frac{V_{out}(s)}{V_{in}(s)}=-g_{m2}(R_{out}(s)||\frac{1}{sC_L})\tag{1.3.20}\]其中\(R_{out}(s)\)由下式给出:\[......
  • 模拟实现一个简单的计算器
    voidmenu(){ printf("**********************\n"); printf("****1.Add2.Sub****\n"); printf("****3.Mlu4.Del****\n"); printf("*****0.exit****\n"); printf("**********************\n");}......