HTML+CSS+JS实现简单的打字机

HTML+CSS+JS实现简单的打字机

js

/*** 动态打字效果函数* (select和element只能选择一个)* @param {Object} options - 配置选项* @param {string} options.select - 选择器,用于定位要显示文本的DOM元素("#id"或".class")* @param {Object} options.element - DOM元素(Element对象)* @param {string[]} options.strings - 要依次显示的字符串数组* @param {boolean} [options.lifeLike=true] - 是否模拟真实打字速度* @param {boolean} [options.loop=true] - 是否循环显示字符串* @param {number} [options.min_speed=200] - 最小打字速度(毫秒)* @param {number} [options.max_speed=500] - 最大打字速度(毫秒)* @param {Function} [options.callback_one_txt=null] - 每个字符打字结束后的回调函数* @param {Function} [options.callback=null] - 打字结束后的回调函数(不循环时有效)* */
function typeit({select=null,element=null, strings, lifeLike = true, loop = false, min_speed = 200, max_speed = 500,callback_one_txt=null,callback=null}) {// 获取要显示文本的DOM元素let text_dom;if (element) {text_dom = element;}else{text_dom = document.querySelector(select);}// 当前要显示的字符串的第几个字符let index = 0;// 文本数组的下标let xiaBiao = 0;// 判断是要实现打字还是删除字效果,初始为真(打字)let huan = true;// 记录已经完成一轮的次数let completedRounds = 0;/*** 获取一个随机速度值* @param {number} min - 最小速度* @param {number} max - 最大速度* @returns {number} - 随机速度值*/function getRandomSpeed(min, max) {return Math.floor(Math.random() * (max - min + 1)) + min;}/*** 执行下一步操作:打字或删除字符*/function nextStep() {if (huan) {// 给.text标签添加字符,用.slice方法text_dom.innerHTML = strings[xiaBiao].slice(0, ++index);// 如果当前字符串的所有字符都已显示,则开始删除字符if (index === strings[xiaBiao].length) {// 如果数组下标超过了最后一个字符串且不循环,则停止定时器if (!loop && xiaBiao >= strings.length-1) {clearInterval(intervalId);text_dom.classList.remove("typeit_text_css");callback && callback();return;}huan = false;}} else {// 给.text标签删除字符,用.slice方法text_dom.innerHTML = strings[xiaBiao].slice(0, index--);// 如果所有字符都已删除,则准备显示下一个字符串if (index < 0) {index = 0;huan = true;xiaBiao++;// 如果数组下标超过最后一个字符串,则重新从第一个字符串开始if (xiaBiao >= strings.length) {xiaBiao = 0;completedRounds++;}}}callback_one_txt && callback_one_txt();text_dom.innerHTML += '<span class="typeit_text_css"></span>';// 根据是否需要模拟真实打字速度来设置下次执行的时间间隔setTimeout(nextStep, lifeLike ? getRandomSpeed(min_speed, max_speed) : min_speed);}// 启动定时器,开始执行第一步操作let intervalId = setTimeout(nextStep, lifeLike ? getRandomSpeed(min_speed, max_speed) : min_speed);
}

css

.typeit_text_css{display: inline-block;position: relative;
}/* 小光标 */
.typeit_text_css::after{content: '';position: absolute;right: -1px;height: 15px;width: 1px;top: 40%;transform: translateY(-50%);background-color: #ece3e3;animation: san 0.5s steps(1) infinite;
}
@keyframes san{0%,100%{background-color: #727272;}50%{background-color: transparent;}
}

使用方法

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="./typeit_cy.js"></script><link rel="stylesheet" href="./typeit_cy.css">
</head>
<body><h1 id="typeit_text_css"></h1><script>typeit({select: '#typeit_text_css',strings: ['你好', '欢迎'],lifeLike: true,loop: false});</script>
</body>
</html>

在这里插入图片描述

<!-- 引入 -->
<link rel="stylesheet" href="./typeit_cy/typeit_cy.css">
<script src="./typeit_cy/typeit_cy.js"></script>
/*** 动态打字效果函数* (select和element只能选择一个)* @param {Object} options - 配置选项* @param {string} options.select - 选择器,用于定位要显示文本的DOM元素("#id"或".class")* @param {Object} options.element - DOM元素(Element对象)* @param {string[]} options.strings - 要依次显示的字符串数组* @param {boolean} [options.lifeLike=true] - 是否模拟真实打字速度* @param {boolean} [options.loop=true] - 是否循环显示字符串* @param {number} [options.min_speed=200] - 最小打字速度(毫秒)* @param {number} [options.max_speed=500] - 最大打字速度(毫秒)* @param {Function} [options.callback_one_txt=null] - 每个字符打字结束后的回调函数* @param {Function} [options.callback=null] - 打字结束后的回调函数(不循环时有效)*/
typeit({select: '#title',strings: ['你好', '欢迎使用CYAI'],lifeLike: true,loop: false
});const messageSpan = document.createElement('span');
messageSpan.className = `message ${type}_message`;
typeit({element: messageSpan,strings: [text],lifeLike: true,loop: false,min_speed: 0,max_speed: 200,max_line_length: 1,callback_one_txt: () => {messageContainer.scrollTop = messageContainer.scrollHeight; // 滚动到底部},callback: () => {messageContainer.scrollTop = messageContainer.scrollHeight; // 滚动到底部}
});

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Collection与数据结构] 位图与布隆过滤器

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

探秘AES加密算法:多种Transformation全解析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

【Liunx篇】基础开发工具 - vim

文章目录 一.vim的基本概念1.正常/命令模式2.插入模式3.底行模式/末行模式4.视图模式5.替换模式 二.vim的基本操作1.进入vim&#xff1a;2.退出vim: 三.vim正常模式命令集1.光标定位&#xff1a;2.复制/粘贴3.撤销4.剪切/删除5. 更改 四.vim底行模式命令集1.保存/退出2.调出行号…

基于 Python、OpenCV 和 PyQt5 的人脸识别上课打卡系统

大家好&#xff0c;我是Java徐师兄&#xff0c;今天为大家带来的是基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。该系统采用 Python 语言开发&#xff0c;开发过程中采用了OpenCV框架&#xff0c;Sqlite db 作为数据库&#xff0c;系统功能完善 &#xff0c;实用性强…

在Linux(ubuntu22.04)搭建rust开发环境

1.安装rust 1.安装curl: sudo apt install curl 2.安装rust最新版 curl --proto ‘https’ --tlsv1.2 https://sh.rustup.rs -sSf | sh 安装完成后出现&#xff1a;Rust is installed now. Great! 重启当前shell即可 3.检验是否安装成功 rustc --version 结果出现&…

手机租赁系统全面解析与开发指南

内容概要 手机租赁系统已经成为现代商业中不可或缺的一部分&#xff0c;尤其是在智能手机普及的时代。随着消费者对新机型兴趣的不断增加&#xff0c;大家纷纷走上了“试一试再买”的道路&#xff0c;手机租赁这条路因此越走越宽。这部分的市场需求让创业者们看到了机会。不仅…

vue vxe-table 实现财务记账凭证

使用 vxe-table 实现财务记账凭证非常简单&#xff0c;实现在线实时编辑的记账凭证、自动合计金额等 官网&#xff1a;https://vxetable.cn/ <template><div><vxe-grid ref"gridRef" v-bind"gridOptions" v-on"gridEvents">&…

OpenNebula 开源虚拟平台,对标 VMware

Beeks Group 主要为金融服务提供商提供虚拟专用服务器和裸机服务器。该公司表示&#xff0c;转向 OpenNebula 不仅大幅降低了成本&#xff0c;还使其虚拟机效率提升了 200%&#xff0c;并将更多裸机服务器资源用于客户端负载&#xff0c;而非像以往使用 VMware 时那样用于虚拟机…

英文论文翻译成中文,怎样翻译更地道?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 最近学员群有同学问&#xff0c;英文论文翻译成中文的解决方案—“DeepL翻译出来的内容总是有点别扭&#xff0c;ChatGPT能翻译的地道一些吗&#xff1f;”。 正好有位刚加入的…

算法-字符串-165.比较版本号

一、题目 二、思路解析 1.思路&#xff1a; 比较的是两个版本号它们以“.”作为分割的部分的有效值&#xff08;即数值&#xff09;是否一致 2.常用方法&#xff1a; 1.s.split("\\规则")&#xff0c;将字符串按参数规则进行分割并存储在字符串数组中 String[] str …

嵌入式软件C语言面试常见问题及答案解析(一)

本文中题目列表 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)2. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。3. 预处理器标识#error的目的是什么?4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?5. …

kubesphere服务报错 页面无法登陆

kubesphere的页面无法访问 查看pod服务&#xff0c;发现ks-apiserver的pod一直在重启 在所在node节点&#xff0c;执行dmesg -T 发现内存溢出 修改deploy的memory的配置 原本的request memory的值为100M 调整为2G 修改之后&#xff0c;服务正常启动&#xff0c;页面访问正常…

基于MATLAB的信号处理工具:信号分析器

信号&#xff08;或时间序列&#xff09;是与特定时间相关的一系列数字或测量值&#xff0c;不同的行业和学科将这一与时间相关的数字序列称为信号或时间序列。生物医学或电气工程师会将其称为信号&#xff0c;而统计学家或金融定量分析师会使用时间序列这一术语。例如&#xf…

Milvus向量数据库01-基础概念

Milvus向量数据库01-基础概念 Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。您可以在 Zilliz Cloud 集群中创建 Collection&#xff0c;然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection 中的 Entity …

golang实现简单的redis服务

golang 手搓redis服务器仓库地址:实现思路: golang 手搓redis服务器 仓库地址: 仓库: https://github.com/dengjiayue/my-redis.git 实现思路: ● 协议: tcp通信 ● 数据包: 长度(4byte)方法(1byte)数据json ● 数据处理: 单线程map读写 ○ 依次处理待处理队列的请求(chan)…

从变更到通知:使用Python和MongoDB Change Streams实现即时事件监听

MongoDB提供了一种强大的功能&#xff0c;称为Change Streams&#xff0c;它允许应用程序监听数据库中的变更事件&#xff0c;并在数据发生变化时立即做出响应。这在mysql数据库是不具备没有这个功能的。又如&#xff1a;我们在支付环节想一直监听支付回调的状态&#xff0c;就…

【AWR软件】AWR 如何创建测量图

文章目录 前言流程 前言 微博虚拟 实验 流程 project -> graph -> 右键 new graph

ARMv8-A MacOS调试环境搭建

文章目录 简介安装qemu交叉编译工具链C语言插件 gdb调试测试代码添加调试配置 JLink 调试树莓派 简介 本节主要介绍基于Visual Studio Code在MacOS下调试环境的搭建&#xff0c;Linux发行版上的过程也类型&#xff0c;它主要使用到以下工具链&#xff1a; aarch64 架构的交叉…

qt基本部分控件用法(一)

前言: 以前 windows下做工具主要是MFC&#xff0c;趁有点空时间&#xff0c;研究了QT&#xff0c;感觉跟MFC 差不多&#xff0c;VS 比 QT CREATOR 还是强大&#xff0c;不过QT可以跨平台&#xff0c;功能更强大&#xff0c;MFC 只能在win平台下.&#xff1b; 1&#xff1a;环境…

【hacker送书第19期】自动化测试框架设计

文章目录 前言内容简介获取方式总结 前言 在当今这个高速发展的互联网时代&#xff0c;软件测试已成为保障软件质量的重要环节。而自动化测试更是测试领域中不可或缺的一环。这本书的出版&#xff0c;正是为了帮助我们更好地理解和应用自动化测试框架设计&#xff0c;提升软件…