内容简介:分析:我们要实现一个数字滚动效果,保证每个位上的数字都至少滚动一周,滚动效果是自下往上。让我们先思考一下几个细节:① 方案的选取:css?js?② 滚动的内容是什么?如果使用css动画用什么实现,如果使用js用什么实现?
分析:我们要实现一个数字滚动效果,保证每个位上的数字都至少滚动一周,滚动效果是自下往上。让我们先思考一下几个细节:
① 方案的选取:css?js?
② 滚动的内容是什么?如果使用css动画用什么实现,如果使用js用什么实现?
③ 怎么实现每个位上的数字依次停止?
目前实现
基于 background-position-y
实现定位到具体数字,使用 transition-duration
实现每个位上的数字依次暂停,模仿掘金页面的实现效果如下:
可以跳过的一节
说一下我的思路历程吧,我一开始居然没想到用动画来实现,而是用 setTimeout
递归地插入每个位上的数字,写完之后才发现没有实现滚动。然后又search了一下滚动效果,发现了一个HTML标签 <marquee>
,虽然我在浏览器上可以用,但是MDN提示我们这个标签已废弃惹。好吧,一开始就应该想到动画的。
预备知识
-
react提供了一个
react-transition-group
库,我们可以通过几种方式实现- 定义className结合css样式
//官方案例 function App() { const [inProp, setInProp] = useState(false); return ( <div> <CSSTransition in={inProp} timeout={200} classNames="my-node"> <div> {"I'll receive my-node-* classes"} </div> </CSSTransition> <button type="button" onClick={() => setInProp(true)}> Click to Enter </button> </div> ); } 复制代码
.my-node-enter { opacity: 0; } .my-node-enter-active { opacity: 1; transition: opacity 200ms; } .my-node-exit { opacity: 1; } .my-node-exit-active { opacity: 0; transition: opacity 200ms; } 复制代码
- 使用钩子
- 进入状态:onEnter、onEntering、onEntered
- 退出状态:onExit、onExiting、onExited
- 定义className结合css样式
-
css的background属性
属性 值 作用 background-size length|percentage|cover|contain 规定背景图像的尺寸,可用于自适应 background-repeat repeat|repeat-x|repeat-y|no-repeat|inherit 定义了图像的平铺模式 background-image url 元素设置背景图像
具体实现
- 背景图片的设置
因为找不到掘金的图片,所以自己用ps做了一个24px ✖ 480px
的背景图片,在实际使用中,我们要记住这个长宽比是1:2
,方便后面做自适应调整,初始style设置如下:span { display: inline-block; background-image: url("number-bg-24-480.png"); background-repeat: repeat-y; background-position: center 0; background-size: 1.5rem 30rem; width: 1.5rem; height: 3rem; } 复制代码
- 切分字符串为数组
this.setState({ data: nextProps.str.split('') }) 复制代码
- 具体动画设置:回顾一下我们预先定义的每个位上数字大小为
1.5rem ✖ 3rem
,那么总长度为30rem
,我们要使得每个数字至少自下而上滚动一周,最后依次停止,具体设置如下:<TransitionGroup className="text-list"> {this.state.data.map((val, index) => { return ( <CSSTransition key={index} timeout={500} onEnter={e => { e.style.backgroundPositionY=`0` }} onEntering={ e => { e.style.backgroundPositionY=`${-3*val - 30}rem` e.style.transitionProperty="background-position-y" e.style.transitionDuration=`${(index+1)*this.state.delay}ms` e.style.transitionTimingFunction="ease-out" } } > <span key={index} /> </CSSTransition> ) })} </TransitionGroup> 复制代码
大功告成啦,虽然是一个很简单的小动画,看起来还是很炫酷的嘛,顺带回顾了一下css的一些基础知识。 项目地址
以上所述就是小编给大家介绍的《React项目实战(四)滚动的数字》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 实战生成对抗网络(二):生成手写数字
- 实战生成对抗网络[2]:生成手写数字
- 非对称加密 Rsa 数字签名 Go 实战
- 非对称加密Rsa数字签名Go实战
- .NET Core加解密实战系列之——消息摘要与数字签名算法
- 数字中台:企业数字营销的支点
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
MySQL入门很简单
黄缙华 / 清华大学出版社 / 2011-1 / 59.50元
《MySQL入门很简单》从初学者的角度出发,由浅入深,循序渐进地介绍了mysql数据库应用与开发的相关知识。书中提供了大量操作mysql数据库的示例,还提供了大量实例和上机实践内容,供读者演练。《MySQL入门很简单》附带1张dvd光盘,内容为与《MySQL入门很简单》内容完全配套的多媒体教学视频和《MySQL入门很简单》涉及的源代码。 《MySQL入门很简单》共分5篇。第1篇介绍数据库的基......一起来看看 《MySQL入门很简单》 这本书的介绍吧!