记录--20行js就能实现逐字显示效果???-打字机效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助
效果演示
横版
竖版
思路分析
- 可以看到文字是一段一段的并且独占一行,使用段落标签p表示一行
- 一段文字内,字是一个一个显示的,所以这里每一个字都用一个span标签装起来
- 每一个字都是从透明到不透明的过渡效果,使用css3的过渡属性transition让每个字都从透明过渡到不透明
基本结构
HTML基本结构
<div id="container"></div>
这里只需要一个容器,其他的结构通过js动态生成
CSS
#container {
/* 添加这行样式=>文字纵向从右往左显示 */
/* 目前先不设置,后面可以取消注释 */
/* writing-mode: vertical-rl; */
}
#container span {
/* 这里opacity先设置为1,让其不透明,可以看到每一步的效果 */
/* 写完js之后到回来改为0 */
opacity: 1;
transition: opacity 0.5s;
}
文本数据
const data = ['清明时节闹坤坤,', '路上行人梳中分;', '借问荔枝何处有,', '苏珊遥指蔡徐村。']
使用数组存放文本数据,一个元素代表一段文字
创建p标签
使用for/of循环遍历数组创建对应个数的p标签,添加到html页面中
const data = ['清明时节闹坤坤,', '路上行人梳中分;', '借问荔枝何处有,', '苏珊遥指蔡徐村。']
// 获取dom元素
const container = document.querySelector('#container')
// for/of循环遍历数组
for (const item of data) {
// 打印每一个item => 数组的每一个元素
console.log(item)
// 创建p标签
const p = document.createElement('p')
// 将p标签插入到container
container.append(p)
}
item代表数组的每一个元素,也就是每一段文字,所以会创建4个p标签
与数组元素数量对应的p标签就生成好了
接下来就是将每一个元素里面的文本添加到span标签中
创建span标签
为每一个字创建一个span标签,然后让span标签的内容等于对应的字,再将每一个生成的span插入到p标签
本节代码
// 遍历item的每一个字
for (let i = 0; i < item.length; i++) {
// 创建span
let span = document.createElement('span')
// span的内容等于item的每一个字
span.innerHTML = item[i]
// 将span插入到p标签中
p.append(span)
}
合并后代码
const data = ['清明时节闹坤坤,', '路上行人梳中分;', '借问荔枝何处有,', '苏珊遥指蔡徐村。']
// 获取dom元素
const container = document.querySelector('#container')
// for/of循环遍历数组
for (const item of data) {
// 打印每一个item => 数组的每一个元素
console.log(item)
// 创建p标签
const p = document.createElement('p')
// 遍历item的每一个字
for (let i = 0; i < item.length; i++) {
// 创建span
let span = document.createElement('span')
// span的内容等于item的每一个字
span.innerHTML = item[i]
// 将span插入到p标签中
p.append(span)
}
// 将p标签插入到container
container.append(p)
}
此时已经完成了渲染数组,并将数组的每一个元素的文字渲染到单独的span中
接下来就要让每一个文字做到从看不见到看的见的效果
添加透明度过渡效果
将css样式中的opacity由1改为0
因为每个字的出现时间不一样,所以不能直接在循环的时候直接添加过渡效果,添加以下代码,让span标签在添加到p标签前也添加到新数组中
const arr = []
// 将span也添加到新数组中
arr.push(span)
最后遍历arr数组,为每一个元素添加一个过渡延迟效果
// 延时1毫秒等待上方循环渲染完成
setTimeout(() => {
// 遍历arr数组的每一个元素
arr.forEach((item, index) => {
// 给每一个元素添加过渡延迟属性
item.style.transitionDelay = `${index * 0.2}s`
// 将透明度设置为不透明
item.style.opacity = 1
})
}, 1)
最后的最后将css样式中的opacity改为0,让所有的字透明
#container span {
opacity: 0;
transition: opacity 0.5s;
}
完整js代码
const data = ['清明时节闹坤坤,', '路上行人梳中分;', '借问荔枝何处有,', '苏珊遥指蔡徐村。']
const arr = []
// 获取dom元素
const container = document.querySelector('#container')
// for/of循环遍历数组
for (const item of data) {
// 打印每一个item => 数组的每一个元素
console.log(item)
// 创建p标签
const p = document.createElement('p')
// 遍历item的每一个字
for (let i = 0; i < item.length; i++) {
// 创建span
let span = document.createElement('span')
// span的内容等于item的每一个字
span.innerHTML = item[i]
// 将span插入到p标签中
p.append(span)
// 将span也添加到新数组中
arr.push(span)
}
// 将p标签插入到container
container.append(p)
}
// 延时1毫秒等待上方循环渲染完成
setTimeout(() => {
// 遍历arr数组的每一个元素
arr.forEach((item, index) => {
// 给每一个元素添加过渡延迟属性
// 让每一个字都比前一个字延时0.2秒的时间
item.style.transitionDelay = `${index * 0.2}s`
// 将透明度设置为不透明
item.style.opacity = 1
})
}, 1)
至此,已经完成了逐字显示的效果,最后介绍一个css属性
writing-mode
使用这个属性可以改变文字方向,实现纵向从左往右或从右往左显示
以下摘自mdn文档
writing-mode
属性定义了文本水平或垂直排布以及在块级元素中文本的行进方向。为整个文档设置该属性时,应在根元素上设置它(对于 HTML 文档,应该在 html
元素上设置)
horizontal-tb
对于左对齐(ltr
)文本,内容从左到右水平流动。对于右对齐(rtl
)文本,内容从右到左水平流动。下一水平行位于上一行下方。
vertical-rl
对于左对齐(ltr
)文本,内容从上到下垂直流动,下一垂直行位于上一行左侧。对于右对齐(rtl
)文本,内容从下到上垂直流动,下一垂直行位于上一行右侧。
vertical-lr
对于左对齐(ltr
)文本,内容从上到下垂直流动,下一垂直行位于上一行右侧。对于右对齐(rtl
)文本,内容从下到上垂直流动,下一垂直行位于上一行左侧。
本文转载于:
https://juejin.cn/post/7271165389692960828
如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
记录--20行js就能实现逐字显示效果???-打字机效果的更多相关文章
- 20行JS代码实现贪吃蛇
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 20行js代码制作网页刮刮乐
分享一段用canvas和JS制作刮刮乐的代码,JS部分去掉注释不到20行代码效果如下 盖伦.jpg 刮刮乐.gif HTML部分 <body>  &l ...
- 5行js代码搞定导航吸顶效果
一.HTML布局 首先写HTML布局 <body> <div id="wrap"></div> </body> 二.CSS样式 给点 ...
- 20行Python代码开发植物识别 app
这篇文章介绍如何用Python快速实现一个植物识别的app,家里养了几盆多肉还叫不上名字,正好拿来识别一下.实现这样一个app只需要20行左右的代码,先来看下效果: 另外,我也开发了微信小程序版本,大 ...
- JS模版引擎[20行代码实现模版引擎读后感]
曾经阅读过<只有20行JAVASCRIPT代码, 手把手教你写一个页面模版引擎>这篇文章, 对其中实现模版的想法实在膜拜, 于是有了这篇读后感, 谈谈自己对模版引擎的理解, 以及用自己的语 ...
- 100行JS实现HTML5的3D贪吃蛇游戏
js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...
- Python练手项目:20行爬取全王者全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. ...
- 20行Python代码爬取王者荣耀全英雄皮肤
引言王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. 准备工作 ...
- HTML5游戏实战(4): 20行代码实现FlappyBird
这个系列很久没有更新了.几个月前有位读者调侃说,能不能一行代码做一个游戏呢.呵呵,接下来一段时间,我天天都在想这个问题,怎么能让GameBuilder+CanTK进一步简化游戏的开发呢.经过几个月的努 ...
随机推荐
- [Java]《On Java》阅读记录之 -- 可变参数重载问题
<On Java>阅读记录之 -- 可变参数重载问题 有下面一段代码: public class OverloadingVarargs2 { static void f(float i , ...
- 老王电子的拆机 ESP32-SOLO-1 填坑报告
ESP32-SOLO-1 拆装 都是带板的, 长这个样子 需要用热风枪从背面吹, 因为中间有焊点, esp32朝下, 用280度大概2到3分钟, 四周需要均匀着风, 用镊子试探天线部分是否松动, 将外 ...
- IPNS和DNSLink的使用说明
IPNS和DNSLink的使用说明 IPNS说明 IPNS全称InterPlanetary Name System,就是IPFS下的一个名称解析系统,类似于互联网的DNS,但是与DNS不同的是,IPN ...
- 多线程系列(七) -ThreadLocal 用法及内存泄露分析
一.简介 在 Java web 项目中,想必很多的同学对ThreadLocal这个类并不陌生,它最常用的应用场景就是用来做对象的跨层传递,避免多次传递,打破层次之间的约束. 比如下面这个HttpSer ...
- queryset高级用法:select_related
在提取某个模型的数据的同时,也提前将相关联的数据提取出来.比如提取文章数据,可以使用select_related将author信息提取出来,以后再次使用article.author的时候就不需要再次去 ...
- 使用原生 cookieStore 方法,让 Cookie 操作更简单
前言 对于前端来讲,我们在操作cookie时往往都是基于document.cookie,但它有一个缺点就是操作复杂,它并没有像localStorage那样提供一些get或set等方法供我们使用.对与c ...
- 【Azure App Service for Linux】NodeJS镜像应用启动失败,遇见 RangeError: Incorrect locale information provided
问题描述 在App Service For Linux 中,部署NodeJS应用,应用启动失败. 报错信息为: 2023-08-29T11:21:36.329731566Z RangeError: I ...
- 【Azure 事件中心】Event Hub Client 连接超时(OperationTimeout)测试及解说
Azure Event Hub(Azure事件中心) 是大数据流式处理平台和事件引入服务. 它可以每秒接收和处理数百万个事件.在我们的使用中,需要代码编写的是两个部分:事件生产者和事件接收者 事件生成 ...
- linux系统信息命令笔记
1,时间和日期 2,磁盘信息 4,进程概念介绍 4.1,ps 基本命令使用 ps aux 显示内容太多了.一般用ps a 或 ps au 4.2, top命令的基本使用 top 可以动态的显示运行中的 ...
- 李宏毅2022机器学习HW4 Speaker Identification下
Task Sample Baseline模型介绍 class Classifier(nn.Module): def __init__(self, d_model=80, n_spks=600, dro ...