html、css、js、react、vue 文字一行一行显示出来

前端时间在做 年报,就不难涉及到 年报 具有的几大特性:
1、页面滑动特效
2、文字一行一行出现特效
3、页面内动画
等等

这片文章主要展示一下 文字一行一行出现特效 代码(react 为例)

先看效果图:
在这里插入图片描述

第一步:分析
想要使 文字一行一行显示出来 无非就三种方式
1、使用css控制:底层一个完整页面,上层一个只有背景图的完整页面,通过动画渐渐向下移动上层div,使底层div信息逐渐展示出来,以达到渐显的效果,但视觉效果较差。
2、使用js控制:使用js逐步增加dom节点,并给dom节点添加动画效果。(对于React,Vue这类框架层面应用,不建议直接使用JS控制 DOM 节点增删)
3、js + css控制:初次页面全部渲染出来,并给每一行增加 id 属性,但Css样式为 opacity: 0 透明,渲染完成后,通过js改变 css 动画 样式。(本文所采用方式)

第二部:布局
1、想要使文字一行一行展示出来,我们期望的是得到渲染数组,这样才能对顺序进行控制。不同段落之间我们也期望 从上往下的段落一行一行展示出来,所以我们期望得到一个二位数组,like this:

funfunction Text(props) {return <div>props?.text</div>
}
paragraphArrays : [[<Text text="第一段第一行" />,<Text text="第一段第二行" />,<Text text="第一段第三行" />,],[<Text text="第二段第一行" />,<Text text="第二段第二行" />,<Text text="第二段第三行" />,],
]

2、不同页面的文本承载container样式可能不同,所以我们期望使用者可自定义样式。
3、不同页面段落之间的样式可能不同,所以我们期望使用者可自定义样式。
4、使用者可自定义行 id

这样,动画组件的 props 我们就定义好了

第三部:实现
1、渲染函数:

js:

import React, { useEffect } from 'react'
import classnames from 'classnames'
import styles from './AnimationText.module.scss'/*** @description: 文字段落一行一行出现动画* @param props:*  paragraphArrays : [[<Text text="第一段第一行" />,<Text text="第一段第二行" />,<Text text="第一段第三行" />,],[<Text text="第二段第一行" />,<Text text="第二段第二行" />,<Text text="第二段第三行" />,],
]
* paragraphClassName: 段落className
* className: container className
* id: container id* @return {*}*/function AnimationText(props) {const { paragraphArrays, paragraphClassName, className, id } = props || {}return (<div className={classnames(styles.container, className)} id={id || 'animationText'} >{(paragraphArrays || []).map((item, index) => (<div className={classnames(styles.paragraph, paragraphClassName)}>{(item || []).map((component, idx) => (<div id={`${index}-${idx}-${id || 'animationText'}`} className={styles.nodeItem} >{component}</div>))}</div>))}</div>)
}export default AnimationText

css:

.paragraph {margin-bottom: 15px;
}.nodeItem {opacity: 0;
}

2、获取 container DOM 节点

// 用于存储 存放动画的 container
let element
// 等同于 componentDidMount
useEffect(() => {element = document.getElementById(id || 'animationText')}, [])

3、获取到DOM节点后, 开始执行动画

css 动画定义:

// 透明度从0 到 1,动画只执行一次
.nodeItemShow {visibility: visible;animation: scan 3s ease 0s 1;
}@keyframes scan {0% {opacity: 0;}100% {opacity: 1;}
}

js:

// 获取到 element 后,循环 paragraphArrays 数组,使用count 计数,每隔 600 * count 毫秒改变当前count 行的 css 样式
useEffect(() => {if (element) {let count = 0for (let i = 0; i < paragraphArrays.length; i += 1) {for (let j = 0; j < paragraphArrays[i].length; j += 1) {count += 1setTimeout(() => {const ele = document.getElementById(`${i}-${j}-${id || 'animationText'}`)ele.setAttribute('class', styles.nodeItemShow)}, 600 * count)}}}
}, [element])

完整代码:

js:

import React, { useEffect } from 'react'
import classnames from 'classnames'
import styles from './AnimationText.module.scss'/*** @description: 文字段落一行一行出现动画* @param props:*  paragraphArrays : [[<Text text="第一段第一行" />,<Text text="第一段第二行" />,<Text text="第一段第三行" />,],[<Text text="第二段第一行" />,<Text text="第二段第二行" />,<Text text="第二段第三行" />,],
]
* paragraphClassName: 段落className
* className: container className
* id: container id* @return {*}*/
function AnimationText(props) {const { paragraphArrays, paragraphClassName, className, id } = props || {}let elementuseEffect(() => {element = document.getElementById(id || 'animationText')}, [id])useEffect(() => {if (element) {let count = 0for (let i = 0; i < paragraphArrays.length; i += 1) {for (let j = 0; j < paragraphArrays[i].length; j += 1) {count += 1setTimeout(() => {const ele = document.getElementById(`${i}-${j}-${id || 'animationText'}`)ele.setAttribute('class', styles.nodeItemShow)}, 600 * count)}}}}, [element, id, paragraphArrays ])return (<div className={classnames(styles.container, className)} id={id || 'animationText'} >{(paragraphArrays || []).map((item, index) => (<div className={classnames(styles.paragraph, paragraphClassName)}>{(item || []).map((component, idx) => (<div key={`${index}-${idx}-${id || 'animationText'}`}  id={`${index}-${idx}-${id || 'animationText'}`} className={styles.nodeItem} >{component}</div>))}</div>))}</div>)
}export default AnimationText

css:

.container {width: auto;
}.paragraph {margin-bottom: 15px;
}.nodeItem {opacity: 0;
}.nodeItemShow {visibility: visible;animation: scan 3s ease 0s 1;
}@keyframes scan {0% {opacity: 0;}100% {opacity: 1;}
}

一个简单的 文字一行一行显示出来 动画组件就实现啦

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

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

相关文章

哪家互联网公司涨薪最厉害?居然不是阿里腾讯

最近脉脉职言区有一条讨论火了&#xff1a;哪家互联网公司涨薪最厉害&#xff1f;按照拼多多员工的说法&#xff0c;应届毕业生可以拿比腾讯阿里高30%的薪资&#xff0c;而有工作经验的员工普遍薪资水平也高出业内30%~50%以上。而且在去年由于疫情众多企业降薪、甚至裁员的状况…

MongoDB 安装与配置~linux

文章目录一、 安装建议二、 安装步骤2.1. 下载2.2. 解压缩2.3. 重命名2.4. 配置环境变量2.5. 使其生效2.6. 配置MongoDB2.7. 启动MongoDB2.8. 网络安全组一、 安装建议 MongoDB 可以在mac/win/linux上安装&#xff0c;我个人建议在linux上安装会更好&#xff0c;这样测试起来更…

节省服务器成本50%以上!独角兽完美日记电商系统容器化改造实践

完美日记创立于2017年&#xff0c;这家公司上线不到两年即成为天猫彩妆销冠&#xff0c;2019年成为11年来第一个登上天猫双十一彩妆榜首的国货品牌&#xff0c;包揽天猫2019全年彩妆销冠&#xff1b;2020年4月成为首个亮相天猫超级品牌日的国货彩妆品牌&#xff0c;同时勇破彩妆…

浏览器从输入URL到页面渲染过程 —— 浏览器的进程与线程

之前我有总结过一篇经典面试题&#xff1a;浏览器从输入URL到页面渲染过程&#xff0c;接下里我将对某些知识点进行更细致的解析。 浏览器从输入URL到页面渲染过程 系列文章&#xff1a; &#xff08;二&#xff09;&#xff1a;浏览器从输入URL到页面渲染过程 ——页面渲染流…

MongoDB 的可视化管理工具~连接腾讯云MongoDB服务

不论是mysql或者redis或者es&#xff0c;我们都会使用远程的客户端工具来连接数据库server&#xff0c;那么目前的linux上锁安装的MongoDB就是server端&#xff0c;我们需要有一个客户端来进行可视化的管理&#xff0c;常用的可以使用Navcat来操作&#xff0c;当然使用其他的GU…

云原生时代业务架构的变革:从单体迈向Serverless

如今&#xff0c;各行各业都在谈数字化转型&#xff0c;尤其是新零售、传媒、交通等行业。数字化的商业形态已经成为主流&#xff0c;逐渐替代了传统的商业形态。在另外一些行业里&#xff08;如工业制造&#xff09;&#xff0c;虽然企业的商业形态并非以数字化的形式表现&…

冯诺依曼架构的 IO 鸿沟,谁能来填补?

作者 | 宋慧头图 | 下载于视觉中国随着AI技术、数据分析等领域兴起&#xff0c;数据变得越来越重要了&#xff0c;数据处理往往需要用到大量的内存&#xff0c;数据量爆发式增长让各种内存密集型应用层出不穷&#xff0c;如Redis数据库、SAP HANA企业核心系统。在CSDN 2019、20…

使用Git后10件你可能需要“反悔”的事

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; Git是目前世界上最优秀最流行的分布式版本控制系统&#xff0c;也是程序员们日常使用最频繁的工具之一&#xff08;几乎每天都…

SpringBoot 整合MongoDB

文章目录1. 引入依赖2. 在yml中添加配置3. 在启动类中开启mongodb在model中添加依赖&#xff0c;为什么在model中添加&#xff1f;因为会有映射的实体类MongoObject对应mongodb中的数据表对象&#xff1a;1. 引入依赖 <dependency><groupId>org.springframework.b…

浏览器从输入URL到页面渲染过程 ——页面渲染流程

之前我有总结过一篇经典面试题&#xff1a;浏览器从输入URL到页面渲染过程 &#xff0c;接下里我将对某些知识点进行更细致的解析。 浏览器从输入URL到页面渲染过程 系列文章&#xff1a; &#xff08;一&#xff09;&#xff1a;浏览器从输入URL到页面渲染过程 —— 浏览器的…

阿里发布2020农产品电商报告数字农业将成风口

完美日记创立于2017年&#xff0c;这家公司上线不到两年即成为天猫彩妆销冠&#xff0c;2019年成为11年来第一个登上天猫双十一彩妆榜首的国货品牌&#xff0c;包揽天猫2019全年彩妆销冠&#xff1b;2020年4月成为首个亮相天猫超级品牌日的国货彩妆品牌&#xff0c;同时勇破彩妆…

【干货】和你谈谈数据分析报告

前言&#xff1a; -更多关于数智化转型、数据中台内容请加入阿里云数据中台交流群—数智俱乐部 &#xff08;文末扫描二维码或点此加入&#xff09; -阿里云数据中台官网 https://dp.alibaba.com/index &#xff08;作者&#xff1a;数智从业者&#xff09; 在当今企业纷纷推动…

Vue3 安装axios使用报错:Uncaught TypeError: Cannot read property ‘use‘ of undefined

最近在学习Vue3&#xff0c;使用vue cli4搭建了一个demo项目&#xff0c;安装axios后&#xff0c;控制台报错&#xff1a; Uncaught TypeError: Cannot read property use of undefinedat eval (axios.js?be3b:59)at Module../src/plugins/axios.js (app.js:1229)at __webpac…

云原生五大趋势预测,K8s安卓化位列其一

作者 | 李响、张磊 Kubernetes 本身并不直接产生商业价值&#xff0c;你不会花钱去购买 Kubernetes 。这就跟安卓一样&#xff0c;你不会直接掏钱去买一个安卓系统。Kubernetes 真正产生价值的地方也在于它的上层应用生态。 “未来的软件一定是生长于云上的”&#xff0c;这是…

centos7 linux 安装 keeplived

文章目录一、简介部署总览1. 简介2. 部署总览二、安装实战2.1. 安装环境2.2. 下载软件包2.3. 同步软件包2.4. 解压、编译、安装三、系统服务3.1. 配置复制3.2. 脚本复制3.3. 服务开机启动四、配置修改4.1. 编辑配置4.2. 140 服务器配置4.3. 141 服务器配置4.4. 启动keepalived4…

阿里人脸识别安全技术获专利可防范3D人脸面具攻击

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 当人脸识别遇上3D技术&#xff0c;谁将是最后的胜利者?长期困扰人脸识别行业的安全问题有了最新的解法。日前&#xff0c;阿…

vue3中 使用 swiper 插件,自定义切换按钮, 将 前进后退 、左右切换 按钮放到容器外部

今天在使用 swiper 时&#xff0c;遇到一个 坑爹的 问题。 swiper 组件的本来样式长这样&#xff1a; 左右切换的按钮在滑动容器内部&#xff0c;但是我们想要它跑到容器外面去。 网上找了一堆方法都不好使 也不知道是不是因为 我使用的是 高版本原因 最终实验结果&#x…

一眼看尽5G江湖,Gartner发布5G网络基础设施魔力象限报告

作者 | 白告天来源 | 边缘计算社区头图 | 下载于视觉中国近日&#xff0c;国际权威分析机构Gartner发布了首份《通信运营商5G网络基础设施魔力象限》报告。以最直观的方式展示了这一领域内各家头部企业的力量对比情况。Gartner通信运营商5G网络基础设施魔力象限该魔力象限帮助通…

一篇小文带你走进RabbitMQ的世界

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 说到消息中间件&#xff0c;大部分人的第一印象可能是Kafka。毕竟Kafka自问世以来&#xff0c;就顶着高并发&#xff0c;大流…

nginx高可用方案:keepalived+nginx vip 动态位移

文章目录一、部署总览常用命令1. 部署总览2. 常用命令二、软件安装配置2.1. 安装keepalived2.2. 安装nginx2.3. 配置静态文件三、测试3.1. 启动nginx3.2. 验证四、vip动态位移测试4.1. 140验证4.2. 141验证4.3. 140停止kp服务4.4. 141 验证4.5. 140 重新启动kp服务一、部署总览…