iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 28
1
Modern Web

被 React react 的後端工程師系列 第 28

[DAY28] React 動畫動得非常厲害

  • 分享至 

  • twitterImage
  •  

我想說的是:
動畫好酷炫耶,以前完全沒用過就跑來寫後端
react-transition-group 真的很厲害
看完之後...我還是不會想寫前端耶

用 transition 只能作一些最簡單的動畫,如果稍微複雜一點就做不出來了
這時候就可以用CSS3中的 keyframes

首現重寫 style.css

.show{ animation:show-item 2s ease-in forwards; }
.hide{ animation:hide-item 2s ease-in forwards; }

@keyframes hide-item{
    0% {
        opacity:1;
        color:yellow;
    }
    50%{
        opacity: 0.5 ;
        color:red;
    }
    100%{
        opacity:0;
        color: green;
    }
}
@keyframes show-item{
    0% {
        opacity:0;
        color:yellow;
    }
    50%{
        opacity: 0.5 ;
        color:red;
    }
    100%{
        opacity:1;
        color: green;
    }
}

使用動畫的關鍵詞是 animation,然後加上定義好的動畫名稱
forwards 代表不循環播放,在上面的設定中我們定義的是:持續時間2秒鐘,效果由慢到快

這是在原生的 CSS3 中支援的部分
至於動畫這種必不可少的東西, React 中當然也有人家寫好的套件
就叫做 react-transition-group
先來看看版本庫
安裝一樣非常簡單

npm install react-transition-group --save

安裝好後,先去來看一下官方文件
他是有著三個核心組件

  • Transition
  • CSSTransition
  • TransitionGroup

使用CSSTransition

第一步當然是 import 進剛剛的 Boss.js

import { CSSTransition } from 'react-transition-group'

引入後就可以直接使用了,使用的方法就和自訂的組件一樣
直接寫<CSSTransition>,而且不再需要管理className了
這部分由CSSTransition進行管理

修改上節課寫的Boss.js文件裡的render區域

render() {
    return (
        <>
            <CSSTransition
                in={this.state.isShow}   // 用於判斷是否出現的狀態
                timeout={2000}           // 動畫持續時間
                classNames="boss-text"   // 防止重複,可以理解成 namespace
            >
                <div>BOSS - 風魚</div>
            </CSSTransition>
            <div>
                <button onClick={this.toToggle}>召喚「風魚」 </button>
            </div>
        </>
    );
}

現在要來修改 style.css 套用新的內容
再看看官方文件說明可以知道,有幾個屬性是可以操作的

namespace-enter: 進入前的樣式或是稱作初始值
namespace-enter-active:進入動畫直到完成時之前的 CSS 樣式;
namespace-enter-done:進入完成時的 CSS 樣式;
namespace-exit:退出前的 CSS 樣式;
namespace-exit-active:退出動畫知道完成時之前的的 CSS 樣式。
namespace-exit-done:退出完成時的 CSS 樣式。

了結之後就來修改樣式

.boss-text-enter{
    opacity: 0;
}
.boss-text-enter-active{
    opacity: 1;
    transition: opacity 2000ms;

}
.boss-text-enter-done{
    opacity: 1;
}
.boss-text-exit{
    opacity: 1;
}
.boss-text-exit-active{
    opacity: 0;
    transition: opacity 2000ms;

}
.boss-text-exit-done{
    opacity: 0;
}

這時候你的動畫樣式就正常了
如果打開開發者工具,可以看到指定的區塊 class name 會隨著操作自己變化成對應的名稱
我們再也不用自己管理 className 了
而是完全交給了 react-transition-group 來操作

接著要講一個很厲害了,以前做不到的

unmountOnExit

<CSSTransition> 加上 unmountOnExit
加上這個的意思是在元素退出時,自動把 DOM 也刪除
這是以前用CSS動畫沒辦法做到的!整個 React 機器動得很厲害
一整個前端產業鍊都發大財了
更深入的內容可以在官方文件裡挖寶
像是下一篇就來玩玩看 TransitionGroup
剛剛只操作了一個 DOM 元素
藉由 TransitionGroup 可以一次控制多個 DOM 的動畫內容


上一篇
[DAY27] 如果你快樂就拍拍手之在 react 使用動畫效果之基於 CSS
下一篇
[DAY29] 多 DOM 的動畫之我等了這篇 29 天之我完全不介意
系列文
被 React react 的後端工程師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言