20行js就能实现逐字显示效果???-打字机效果

效果演示

横版

竖版

思路分析

  1. 可以看到文字是一段一段的并且独占一行,使用段落标签p表示一行
  2. 一段文字内,字是一个一个显示的,所以这里每一个字都用一个span标签装起来
  3. 每一个字都是从透明到不透明的过渡效果,使用css3的过渡属性transition让每个字都从透明过渡到不透明

基本结构

HTML基本结构

bash 复制代码
<div id="container"></div>

这里只需要一个容器,其他的结构通过js动态生成

CSS美化

css 复制代码
#container {
  /* 添加这行样式=>文字纵向从右往左显示 */
  /* 目前先不设置,后面可以取消注释 */
  /* writing-mode: vertical-rl; */
}
#container span {
  opacity: 1;
  transition: opacity 0.5s;
}

文本数据

ini 复制代码
const data = ['清明时节闹坤坤,', '路上行人梳中分;', '借问荔枝何处有,', '苏珊遥指蔡徐村。']

使用数组存放文本数据,一个元素代表一段文字

创建p标签

使用for/of循环遍历数组创建对应个数的p标签,添加到html页面中

js 复制代码
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标签

本节代码

js 复制代码
// 遍历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)
}

合并后代码

js 复制代码
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标签前也添加到新数组中

js 复制代码
const arr = []
// 将span也添加到新数组中
arr.push(span)

最后遍历arr数组,为每一个元素添加一个过渡延迟效果

js 复制代码
// 延时1毫秒等待上方循环渲染完成
setTimeout(() => {
  // 遍历arr数组的每一个元素
  arr.forEach((item, index) => {
    // 给每一个元素添加过渡延迟属性
    item.style.transitionDelay = `${index * 0.2}s`
    // 将透明度设置为不透明
    item.style.opacity = 1
  })
}, 1)

完整js代码

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 元素上设置)

scss 复制代码
horizontal-tb

对于左对齐(ltr)文本,内容从左到右水平流动。对于右对齐(rtl)文本,内容从右到左水平流动。下一水平行位于上一行下方。

复制代码
vertical-rl

对于左对齐(ltr)文本,内容从上到下垂直流动,下一垂直行位于上一行左侧。对于右对齐(rtl)文本,内容从下到上垂直流动,下一垂直行位于上一行右侧。

复制代码
vertical-lr

对于左对齐(ltr)文本,内容从上到下垂直流动,下一垂直行位于上一行右侧。对于右对齐(rtl)文本,内容从下到上垂直流动,下一垂直行位于上一行左侧。

相关推荐
Nan_Shu_6149 分钟前
学习:uniapp全栈微信小程序vue3后台(28)
前端·学习·微信小程序·小程序·uni-app
珍宝商店19 分钟前
原生 JavaScript 方法实战指南
开发语言·前端·javascript
蓝莓味的口香糖29 分钟前
【企业微信】VUE项目在企微中自定义转发内容
前端·vue.js·企业微信
IT_陈寒29 分钟前
告别低效!用这5个Python技巧让你的数据处理速度提升300% 🚀
前端·人工智能·后端
—Qeyser31 分钟前
Laravel + UniApp AES加密/解密
前端·uni-app·laravel
C++chaofan34 分钟前
游标查询在对话历史场景下的独特优势
java·前端·javascript·数据库·spring boot
cg.family36 分钟前
Vue3 v-slot 详解与示例
前端·javascript·vue.js
FreeBuf_1 小时前
新型域名前置攻击利用Google Meet、YouTube、Chrome及GCP构建流量隧道
前端·chrome
c0detrend1 小时前
技术架构设计:如何打造一个高性能的Chrome截图插件
前端·chrome
幽络源小助理1 小时前
8、幽络源微服务项目实战:前端登录跨域同源策略处理+axios封装+权限的递归查询增删改+鉴权测试
前端·微服务·架构