react 不用插件實現(xiàn)數(shù)字滾動的效果示例
突然要實現(xiàn)個數(shù)字滾動效果,網(wǎng)上一搜,一大堆都是用組件的。我只是想實現(xiàn)個簡單的效果而已,決定還是自己搞搞吧。
先來看看效果吧

也不多說了,實現(xiàn)起來不難,但是有點細節(jié)問題需要自己好好琢磨一下
大概思路,
1.一開始為0,獲取第一次數(shù)據(jù),記錄下來
2.和前一次數(shù)據(jù)進行對比
3.然后transform
4.最后收工
好了,附上代碼、
export default class Number extends React.Component {
constructor(props) {
super(props);
this.state = {
prev: "000000",//初始化6位數(shù)
next: "000000",
inits: 0,
listAll: [[0],[0],[0],[0],[0],[0]],
contrlAnimationWay: false
}
this.key1 = 0
}
componentWillUnmount() {
}
componentDidMount() {
setTimeout(()=>{
this.run()
})
// this.setTimer()
}
// 獲取數(shù)據(jù)
getNumber() {
let { inits } = this.state
let random = Math.floor(Math.random() * (100000 - 1) + 1);
let prev = this.addZero(inits, 6)
let next = this.addZero(inits + 1235, 6)
this.setState({
inits: inits + 1235
})
console.log(99, prev);
console.log(99, next);
this.getData(prev, next)
}
// 數(shù)字補零
addZero(num, n) {
let len = num.toString().length;
while (len < n) {
num = "0" + num;
len++;
}
return num;
}
// 對比數(shù)據(jù)前后變化
getData(prev, next) {
let { listAll } = this.state
listAll = [];
let prevArray = prev.toString().split("");
let nextArray = next.toString().split("");
console.log(11, prevArray);
console.log(22, nextArray);
let listInit = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
for (let i = 0; i < prevArray.length; i++) {
let prevNumber = parseInt(prevArray[i]);
let nextNumber = parseInt(nextArray[i]);
let start = -1;
let end = -1;
for (let j = 0; j < listInit.length; j++) {
if (listInit[j] === prevNumber) {
start = j;
}
if (start !== -1 && listInit[j] === nextNumber) {
end = j;
break;
}
}
listAll.push(listInit.slice(start, end + 1));
console.log(listAll);
}
this.setState({
listAll
})
}
run() {
this.getNumber()
this.key1++
}
setTimer() {
setInterval(() => {
setTimeout(()=>{
this.run()
}, 0);
}, 1000 * 4)
}
render() {
let { listAll } = this.state;
return <div className="new-tmall911">
{/* 數(shù)字滾動 */}
<div className="box-number">
<div onClick={this.setTimer.bind(this)}>累計</div>
{
listAll.map((list, i) => {
return <div key={i} className="list-wrap">
<div className={`roll roll_${list.length - 1}`} key={this.key1++}>
{
list.map((item, index) => {
return <div key={index}>
{item}
</div>
})
}
</div>
</div>
})
}
<div>人已參與</div>
</div>
{/* 數(shù)字end */}
</div>
}
}
css
/* 數(shù)字滾動 */
.box-number {
/* background: green; */
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
color: rgb(36, 35, 35);
height: 100px
}
.list-wrap {
height: 3rem;
width: 3rem;
text-align: center;
overflow: hidden;
margin: 0.1rem;
border: 2px rgb(19, 19, 18) solid;
border-radius: 2px;
}
.roll div {
font-size: 2rem;
line-height: 3rem;
}
.roll_1 {
-webkit-animation: roll_1 2s forwards; /* Safari 與 Chrome */
}
.roll_2 {
-webkit-animation: roll_2 2s forwards; /* Safari 與 Chrome */
}
.roll_3 {
-webkit-animation: roll_3 2s forwards; /* Safari 與 Chrome */
}
.roll_4 {
-webkit-animation: roll_4 2s forwards; /* Safari 與 Chrome */
}
.roll_5 {
-webkit-animation: roll_5 2s forwards; /* Safari 與 Chrome */
}
.roll_6 {
-webkit-animation: roll_6 2s forwards; /* Safari 與 Chrome */
}
.roll_7 {
-webkit-animation: roll_7 2s forwards; /* Safari 與 Chrome */
}
.roll_8 {
-webkit-animation: roll_8 2s forwards; /* Safari 與 Chrome */
}
/*省略roll_2——roll_8*/
.roll_9 {
-webkit-animation: roll_9 2s forwards; /* Safari 與 Chrome */
}
@-webkit-keyframes roll_1 /* Safari 與 Chrome */
{
0% {
transform: translate3d(0, 0, 0);
}
100% {
transform: translate3d(0, -3rem, 0);
}
}
@-webkit-keyframes roll_2 /* Safari 與 Chrome */
{
0% {
transform: translate3d(0, 0px, 0);
}
100% {
transform: translate3d(0, -6rem, 0);
}
}
@-webkit-keyframes roll_3 /* Safari 與 Chrome */
{
0% {
transform: translate3d(0, 0px, 0);
}
100% {
transform: translate3d(0, -9rem, 0);
}
}
@-webkit-keyframes roll_4 /* Safari 與 Chrome */
{
0% {
transform: translate3d(0, 0px, 0);
}
100% {
transform: translate3d(0, -12rem, 0);
}
}
@-webkit-keyframes roll_5 /* Safari 與 Chrome */
{
0% {
transform: translate3d(0, 0px, 0);
}
100% {
transform: translate3d(0, -15rem, 0);
}
}
@-webkit-keyframes roll_6 /* Safari 與 Chrome */
{
0% {
transform: translate3d(0, 0px, 0);
}
100% {
transform: translate3d(0, -18rem, 0);
}
}
@-webkit-keyframes roll_7 /* Safari 與 Chrome */
{
0% {
transform: translate3d(0, 0px, 0);
}
100% {
transform: translate3d(0, -21rem, 0);
}
}
@-webkit-keyframes roll_8 /* Safari 與 Chrome */
{
0% {
transform: translate3d(0, 0px, 0);
}
100% {
transform: translate3d(0, -24rem, 0);
}
}
@-webkit-keyframes roll_9 /* Safari 與 Chrome */
{
0% {
transform: translate3d(0, 0px, 0);
}
100% {
transform: translate3d(0, -27rem, 0);
}
}
到此這篇關(guān)于react 不用插件實現(xiàn)數(shù)字滾動的效果示例的文章就介紹到這了,更多相關(guān)react 數(shù)字滾動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React系列useSyncExternalStore學習詳解
這篇文章主要為大家介紹了React系列useSyncExternalStore的學習及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
在React頁面重新加載時保留數(shù)據(jù)的實現(xiàn)方法總結(jié)
在React頁面重新加載時保留數(shù)據(jù),可以通過多種方法來實現(xiàn),常見的方法包括使用瀏覽器的本地存儲(Local Storage 或 Session Storage)、URL參數(shù)、以及服務器端存儲等,本文給大家總結(jié)了一些具體實現(xiàn)方法,需要的朋友可以參考下2024-06-06
React操作真實DOM實現(xiàn)動態(tài)吸底部的示例
本篇文章主要介紹了React操作真實DOM實現(xiàn)動態(tài)吸底部的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10

