react應(yīng)用的路由切換動(dòng)畫

展示地址

應(yīng)用首次加載時(shí)候的動(dòng)畫。

首次加載.gif

切換路由時(shí)候的動(dòng)畫

切換.gif

做react路由動(dòng)畫比較復(fù)雜,最好了解三個(gè)前提知識(shí),

  1. react動(dòng)畫組件炊昆,react-transition-group 文檔

  2. react路由組件,react-router 文檔

  3. css動(dòng)畫語法威根, CSS動(dòng)畫簡介 文檔

直接上代碼

這里我直接用了官方的demo代碼凤巨,并且稍微改了一下動(dòng)畫樣式。附上我寫好的github項(xiàng)目地址

//index.js

import React from 'react';
import ReactDOM from 'react-dom';
import { TransitionGroup, CSSTransition } from "react-transition-group";
import './App.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';

ReactDOM.render(
  // 這個(gè)動(dòng)畫是頁面首次加載的動(dòng)畫洛搀,設(shè)置appear={true} 這個(gè)屬性敢茁,并且動(dòng)畫時(shí)間設(shè)置為500ms,和css中的需要一致留美。
  // 一定要用 TransitionGroup 包著 CSSTransition彰檬,動(dòng)畫才有效伸刃,
  // 原因是TransitionGroup 負(fù)責(zé)檢測并自動(dòng)給CSSTransition添加‘in’的prop,
  // 并且TransitionGroup 要一直存在逢倍,不能放在動(dòng)態(tài)生成的組件中.
  <TransitionGroup>
    <CSSTransition
      appear={true}
      classNames="appAppear"
      timeout={500}
    >
      <App/>
    </CSSTransition>
  </TransitionGroup>,
  document.getElementById('root')
);
registerServiceWorker();

// app.js

import React from "react";
import { TransitionGroup, CSSTransition } from "react-transition-group";
import { BrowserRouter , Switch, Route, Link, Redirect } from "react-router-dom";
import './App.css'

const AnimationRoute = () => (
  <BrowserRouter>
    <Route
      render={({ location }) => (
        <div style={styles.fill}>
          <Route
            exact
            path="/"
            render={() => <Redirect to="/hsl/10/90/50" />}
          />

          <ul style={styles.nav}>
            <NavLink to="/hsl/10/90/50">Red</NavLink>
            <NavLink to="/hsl/120/100/40">Green</NavLink>
            <NavLink to="/rgb/33/150/243">Blue</NavLink>
            <NavLink to="/rgb/240/98/146">Pink</NavLink>
          </ul>

          <div>{console.log(location)}</div>
          <div style={styles.content}>
            {/*和平時(shí)使用動(dòng)畫組件沒啥區(qū)別捧颅,*/}
            {/*在渲染的路由的地方加一個(gè)用動(dòng)畫組件包著,并添加css屬性即可较雕;*/}
            <TransitionGroup>
              <CSSTransition
                // 需要加一個(gè)key屬性碉哑,讓react認(rèn)識(shí)每個(gè)組件,并進(jìn)行正確的加載亮蒋。
                // 這里我改了官方demo的代碼扣典, 原來是設(shè)置成location.key, 這樣的話每次點(diǎn)擊同一個(gè)路由鏈接的時(shí)候都會(huì)渲染慎玖。
                key={location.pathname}
                // classNames 就是設(shè)置給css動(dòng)畫的標(biāo)示激捏,記得'classNames'帶's'的。
                classNames="fade"
                // 動(dòng)畫時(shí)間設(shè)置為800ms凄吏,和css中的需要一致。
                timeout={800}
              >
                <Switch location={location}>
                  <Route exact path="/hsl/:h/:s/:l" component={HSL} />
                  <Route exact path="/rgb/:r/:g/:b" component={RGB} />
                  <Route render={() => <div>Not Found</div>} />
                </Switch>
              </CSSTransition>
            </TransitionGroup>
          </div>
        </div>
      )}
    />
  </BrowserRouter>
);

const NavLink = props => (
  <li style={styles.navItem}>
    <Link {...props} style={{ color: "inherit" }} />
  </li>
);

const HSL = ({ match: { params } }) => (
  <div
    style={{
      ...styles.fill,
      ...styles.hsl,
      background: `hsl(${params.h}, ${params.s}%, ${params.l}%)`
    }}
  >
    hsl({params.h}, {params.s}%, {params.l}%)
  </div>
);

const RGB = ({ match: { params } }) => (
  <div
    style={{
      ...styles.fill,
      ...styles.rgb,
      background: `rgb(${params.r}, ${params.g}, ${params.b})`
    }}
  >
    rgb({params.r}, {params.g}, {params.b})
  </div>
);

const styles = {};

styles.fill = {
  position: "absolute",
  left: 0,
  right: 0,
  top: 0,
  bottom: 0
};

styles.content = {
  ...styles.fill,
  top: "40px",
  textAlign: "center"
};

styles.nav = {
  padding: 0,
  margin: 0,
  position: "absolute",
  top: 0,
  height: "40px",
  width: "100%",
  display: "flex"
};

styles.navItem = {
  textAlign: "center",
  flex: 1,
  listStyleType: "none",
  padding: "10px"
};

styles.hsl = {
  ...styles.fill,
  color: "white",
  paddingTop: "20px",
  fontSize: "30px"
};

styles.rgb = {
  ...styles.fill,
  color: "white",
  paddingTop: "20px",
  fontSize: "30px"
};

export default AnimationRoute;


//App.css


/*這里定義整個(gè)應(yīng)用加載時(shí)的動(dòng)畫闰蛔,進(jìn)場前這里設(shè)置了縮放為0痕钢,
進(jìn)場過程中縮放變?yōu)?,也就是100%序六,持續(xù)時(shí)間為500ms任连,
時(shí)間曲是ease-out瘟檩,一種先快后慢的變化曲線*/

.appAppear-appear{
  opacity: 0;
  transform: scale(0);
}

.appAppear-appear.appAppear-appear-active{
  opacity: 1;
  transform: scale(1);
  transition: 500ms ease-out;
}

/*設(shè)置進(jìn)場前透明度為0萎河,放縮為0*/

.fade-enter {
  opacity: 0;
  transform: scale(0);
}


/*設(shè)置進(jìn)場過程中 透明度為1,放縮為1荸型,放縮的位置為左上角繁涂,持續(xù)時(shí)間為500ms拱她,時(shí)間曲是ease-out */
.fade-enter.fade-enter-active {
  opacity: 1;
  transform: scale(1);
  transform-origin: top left;
  transition: 800ms ease-out;
}

/*設(shè)置退場前透明度為1,放縮為1*/
.fade-exit{
  opacity: 1;
  transform: scale(1);
}

/*設(shè)置退場過程中 透明度為0扔罪,放縮為0秉沼,放縮的位置默認(rèn)是中間,所以不設(shè)置也可以矿酵,
持續(xù)時(shí)間為500ms唬复,時(shí)間曲是ease-out */
.fade-exit.fade-exit-active{
  opacity:0;
  transform: scale(0);
  transition: 800ms ease-out;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市全肮,隨后出現(xiàn)的幾起案子敞咧,更是在濱河造成了極大的恐慌,老刑警劉巖辜腺,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件休建,死亡現(xiàn)場離奇詭異乍恐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丰包,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門禁熏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人邑彪,你說我怎么就攤上這事瞧毙。” “怎么了寄症?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵宙彪,是天一觀的道長。 經(jīng)常有香客問我有巧,道長释漆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任篮迎,我火速辦了婚禮男图,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甜橱。我一直安慰自己逊笆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布岂傲。 她就那樣靜靜地躺著难裆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪镊掖。 梳的紋絲不亂的頭發(fā)上乃戈,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音亩进,去河邊找鬼症虑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛归薛,可吹牛的內(nèi)容都是我干的侦讨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼苟翻,長吁一口氣:“原來是場噩夢啊……” “哼韵卤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崇猫,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沈条,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诅炉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜡歹,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屋厘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了月而。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汗洒。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖父款,靈堂內(nèi)的尸體忽然破棺而出溢谤,到底是詐尸還是另有隱情,我是刑警寧澤世杀,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站肝集,受9級特大地震影響瞻坝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杏瞻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一所刀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捞挥,春花似錦勉痴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瀑罗。三九已至胸嘴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間斩祭,已是汗流浹背劣像。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留摧玫,地道東北人耳奕。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像诬像,于是被迫代替她去往敵國和親屋群。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容