上一篇React項目實戰(三)嘗試實現一個拉動刷新組件javascript
分析:咱們要實現一個數字滾動效果,保證每一個位上的數字都至少滾動一週,滾動效果是自下往上。讓咱們先思考一下幾個細節:
① 方案的選取:css?js?
② 滾動的內容是什麼?若是使用css動畫用什麼實現,若是使用js用什麼實現?
③ 怎麼實現每一個位上的數字依次中止?css
基於background-position-y
實現定位到具體數字,使用transition-duration
實現每一個位上的數字依次暫停,模仿掘金頁面的實現效果以下: java
說一下個人思路歷程吧,我一開始竟然沒想到用動畫來實現,而是用setTimeout
遞歸地插入每一個位上的數字,寫完以後才發現沒有實現滾動。而後又search了一下滾動效果,發現了一個HTML標籤<marquee>
,雖然我在瀏覽器上能夠用,可是MDN提示咱們這個標籤已廢棄惹。好吧,一開始就應該想到動畫的。 node
react提供了一個react-transition-group
庫,咱們能夠經過幾種方式實現react
//官方案例
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;
}
複製代碼
css的background屬性git
屬性 | 值 | 做用 |
---|---|---|
background-size | length|percentage|cover|contain | 規定背景圖像的尺寸,可用於自適應 |
background-repeat | repeat|repeat-x|repeat-y|no-repeat|inherit | 定義了圖像的平鋪模式 |
background-image | url | 元素設置背景圖像 |
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的一些基礎知識。 項目地址github