React實(shí)現(xiàn)數(shù)字滾動(dòng)組件numbers-scroll的示例詳解
數(shù)字滾動(dòng)組件,也可以叫數(shù)字輪播組件,這個(gè)名字一聽(tīng)就是非常普通常見(jiàn)的組件,第一反應(yīng)就是想找找網(wǎng)上大佬的東西頂禮膜拜一下,這一搜,還真是沒(méi)找到趁手的╮(╯▽╰)╭。
最近接了大屏的需求,數(shù)字滾動(dòng)肯定是免不了的,所以開(kāi)始擼袖子,造輪子了( numbers-scroll )。
首先給大家看下輪子的效果吧:

一、設(shè)計(jì)原理
如果要做到數(shù)字滾動(dòng)效果,就一定要讓數(shù)字有從下往上移動(dòng)的感覺(jué)。如果只是純粹的數(shù)字變化,顯示出來(lái)的效果就會(huì)比較普通了,沒(méi)有什么視覺(jué)上的沖擊感,如圖所示:

所以,我們需要數(shù)字在變化過(guò)程中,有種紙帶往上抽的感覺(jué)。初始狀態(tài)中,數(shù)字都在顯示框下方等待。數(shù)字滾動(dòng)中,則根據(jù)數(shù)字的大小決定滾動(dòng)速度,數(shù)字越大,滾動(dòng)越快;數(shù)字越小,則滾動(dòng)越慢,這樣會(huì)有一種參差的感覺(jué),滾動(dòng)的效果也會(huì)讓人覺(jué)得更自然一些。

二、實(shí)現(xiàn)方式
初始狀態(tài)中,每個(gè)數(shù)字展示的窗口下邊都有0-9這10個(gè)數(shù)字在等待中,傳入具體數(shù)字后,每個(gè)窗口就可以開(kāi)始移動(dòng)數(shù)字的位置了。
移動(dòng)數(shù)字的位置可以有三種方式:1. 通過(guò)js改變樣式(雖然邏輯更容易實(shí)現(xiàn),但是執(zhí)行效率太低,直接放棄);2. 通過(guò)animation來(lái)控制margin-top的值。3. 通過(guò)animation來(lái)控制transform的值。
雖然個(gè)人覺(jué)得通過(guò)tranform來(lái)控制顯示位置會(huì)更好些,但是目前采用的是方式二,控制margin-top的值來(lái)展示數(shù)字的位置,效果還算可以了,有興趣的同學(xué)可以改造成transform。
React代碼片段如下:
<span className={scrollClass}>
<label style={numberStyle}>0</label>
<label style={numberStyle}>1</label>
<label style={numberStyle}>2</label>
<label style={numberStyle}>3</label>
<label style={numberStyle}>4</label>
<label style={numberStyle}>5</label>
<label style={numberStyle}>6</label>
<label style={numberStyle}>7</label>
<label style={numberStyle}>8</label>
<label style={numberStyle}>9</label>
<label style={numberStyle}>0</label>
</span>Css代碼片段如下:
.numbers-scroll00 {
margin-top: -10 * $marginTop;
animation: scrollNumber0 1s linear 1 normal;
-moz-animation: scrollNumber0 1s linear 1 normal;
-webkit-animation: scrollNumber0 1s linear 1 normal;
-o-animation: scrollNumber0 1s linear 1 normal;
}
@keyframes scrollNumber0 {
0% { margin-top: 0px; }
100% { margin-top: -1100;}
}三、使用方式
1. 安裝依賴:
npm install numbers-scroll --save
2. 引入數(shù)字滾動(dòng)組件的兩種示例:
// 示例1
import React, { useState } from 'react'
import NumbersScroll from 'numbers-scroll'
const MyNumberScroll = () => {
const [number, setNumber] = useState(896507);
return (
<div className="example-container">
<NumbersScroll
split={true}
value={number}
numberStyle={{
fontSize: 50,
background: "#51a4e9",
color: "#fff",
marginLeft: 2,
marginRight: 2
}}
/>
</div>
)
}
// 示例2
import React, { Component } from "react"
import NumbersScroll from 'numbers-scroll'
class MyNumberScroll extends Component {
constructor(props) {
super(props)
this.state = {
number: 896507
}
}
render() {
const { number } = this.state
return <div className="example-container">
<NumbersScroll
split={true}
value={number}
numberStyle={{
fontSize: 50,
background: "#51a4e9",
color: "#fff",
marginLeft: 2,
marginRight: 2
}}
/>
</div>
}
}四、參數(shù)說(shuō)明
為了能夠讓組件應(yīng)用在更多場(chǎng)景中,可以傳入4個(gè)參數(shù):split,value,numberStyle,containerStyle;其中numberStyle,containerStyle可以分別控制數(shù)字和容器的樣式,用戶可以隨時(shí)調(diào)整以適應(yīng)自己的場(chǎng)景。
| 參數(shù)名 | 是否必須 | 默認(rèn)值 | 描述 |
| split | 否 | fasle | 是否加上分隔符 |
| value | 是 | 0 | 顯示數(shù)字 |
| numberStyle | 否 | 數(shù)字的樣式 | |
| containerStyle | 否 | 容器的樣式 |
numbers-scroll這個(gè)組件目前僅支持react,可以用于多種場(chǎng)景。
到此這篇關(guān)于React實(shí)現(xiàn)數(shù)字滾動(dòng)組件numbers-scroll的示例詳解的文章就介紹到這了,更多相關(guān)React數(shù)字滾動(dòng)組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react axios配置代理(proxy),如何解決本地開(kāi)發(fā)時(shí)的跨域問(wèn)題
這篇文章主要介紹了react axios配置代理(proxy),如何解決本地開(kāi)發(fā)時(shí)的跨域問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
React文件名和目錄規(guī)范最佳實(shí)踐記錄(總結(jié)篇)
React在使用時(shí)非常靈活,如果沒(méi)有一個(gè)規(guī)范約束項(xiàng)目,在開(kāi)發(fā)過(guò)程中會(huì)非常混亂,本文將介紹幾個(gè)優(yōu)秀的規(guī)范,介紹文件名和目錄前,需要先簡(jiǎn)述一下幾種通用的類型,用來(lái)區(qū)分文件的功能,感興趣的朋友一起看看吧2022-05-05
React 無(wú)狀態(tài)組件(Stateless Component) 與高階組件
這篇文章主要介紹了React 無(wú)狀態(tài)組件(Stateless Component) 與高階組件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08

