日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

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

發布時間:2024/9/27 vue 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:

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')}, [])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])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:

.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;} }

一個簡單的 文字一行一行顯示出來 動畫組件就實現啦

總結

以上是生活随笔為你收集整理的html、css、js、react、vue 文字一行一行显示出来的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。