数字滚动组件(react)

基于react实现一个数字滚动组件(vue也一样,逻辑相同)

直接上代码

1.number-roll.tsx
interface NumberRollProps {
  value: number;
}
const NUMBER_LIST = Array.from(new Array(10).keys());
const SCROLL_HEIGHT = -15; // 数字滚动高度(也就是数字字体大小),可根据字体大小修改
const NumberRoll = (props: NumberRollProps) => {
  const { value } = props;
  const style = {
    top: `${SCROLL_HEIGHT * value}px`,
  };
  return (
    <div className="number-animation-wrap">
      <div className="number-animation-wrap-hidden">0</div>
      <div className="number-animation" style={style}>
        {NUMBER_LIST.map((item, index) => (
          <div className="number" key={index}>
            {item}
          </div>
        ))}
      </div>
    </div>
  );
};
export default memo(NumberRoll);
2.number-roll.scss
.number-animation-wrap {
    position: relative;
    display: inline-block;
    overflow: hidden;

    .number-animation {
        position: absolute;
        left: 0;
        top: 0;
        height: auto;
        transform-origin: 0 0;
        transition: top 0.4s;  // 可调整滚动速度
    }

    .number, .number-animation-wrap-hidden {
        font-size: 15px;    // 数字滚动高度
        line-height: 15px;
        height: 15px;
        font-weight: 400;
        text-align: center;
    }

    .number-animation-wrap-hidden{
        visibility: hidden;
    }
}
3.使用组件的方式
import NumberRoll from './number-roll.tsx';
const [number,setNumber] = useState(0);
number?.toString()?.split('')?.map((numberItem, index) => (
	<NumberRoll key={index} value={Number(numberItem)} />
))
// 在number改变时调用setNumber更新state,就能看到数字滚动的动画了

完毕!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用useState和useEffect两个Hooks来实现滚动数字效果。 首先,我们需要定义一个state来保存当前数字的值,以及一个目标数字的值。然后,使用useEffect监听目标数字的变化,当目标数字变化时,启动一个计时器,每隔一定时间更新当前数字的值,直到当前数字等于目标数字。 下面是一个简单的实现示例: ```jsx import React, { useState, useEffect } from 'react'; const ScrollNumber = ({ number }) => { const [currentNumber, setCurrentNumber] = useState(0); const [targetNumber, setTargetNumber] = useState(number); useEffect(() => { setTargetNumber(number); }, [number]); useEffect(() => { let timer = null; if (currentNumber < targetNumber) { timer = setInterval(() => { setCurrentNumber(currentNumber + 1); }, 50); } return () => clearInterval(timer); }, [currentNumber, targetNumber]); return ( <span>{currentNumber.toLocaleString()}</span> ); } export default ScrollNumber; ``` 在上面的示例中,我们定义了一个ScrollNumber组件,接受一个number属性作为目标数字,当number变化时,使用useEffect更新targetNumber的值。然后,使用第二个useEffect监听currentNumber和targetNumber的变化,如果currentNumber小于targetNumber,启动一个计时器,每隔50ms更新一次currentNumber的值,直到currentNumber等于targetNumber。最后,返回一个包含当前数字的span元素。 使用方式如下: ```jsx import React from 'react'; import ScrollNumber from './ScrollNumber'; const App = () => { return ( <div> <h1>ScrollNumber Demo</h1> <ScrollNumber number={123456789} /> </div> ); } export default App; ``` 这样就可以在页面上看到一个滚动数字效果了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值