網站首頁 編程語言 正文
一、是什么
在日常開發中,頁面切換時的轉場動畫是比較基礎的一個場景
當一個組件在顯示與消失過程中存在過渡動畫,可以很好的增加用戶的體驗
在react
中實現過渡動畫效果會有很多種選擇,如react-transition-group
,react-motion
,Animated
,以及原生的CSS
都能完成切換動畫
二、如何實現
在react
中,react-transition-group
是一種很好的解決方案,其為元素添加enter
,enter-active
,exit
,exit-active
這一系列勾子
可以幫助我們方便的實現組件的入場和離場動畫
其主要提供了三個主要的組件:
- CSSTransition:在前端開發中,結合 CSS 來完成過渡動畫效果
- SwitchTransition:兩個組件顯示和隱藏切換時,使用該組件
- TransitionGroup:將多個動畫組件包裹在其中,一般用于列表中元素的動畫
CSSTransition
其實現動畫的原理在于,當CSSTransition
的in
屬性置為true
時,CSSTransition
首先會給其子組件加上xxx-enter
、xxx-enter-active
的class
執行動畫
當動畫執行結束后,會移除兩個class
,并且添加-enter-done
的class
所以可以利用這一點,通過css
的transition
屬性,讓元素在兩個狀態之間平滑過渡,從而得到相應的動畫效果
當in
屬性置為false
時,CSSTransition
會給子組件加上xxx-exit
和xxx-exit-active
的class
,然后開始執行動畫,當動畫結束后,移除兩個class
,然后添加-enter-done
的class
如下例子:
export default class App2 extends React.PureComponent { state = {show: true}; onToggle = () => this.setState({show: !this.state.show}); render() { const {show} = this.state; return ( <div className={'container'}> <div className={'square-wrapper'}> <CSSTransition in={show} timeout={500} classNames={'fade'} unmountOnExit={true} > <div className={'square'} /> </CSSTransition> </div> <Button onClick={this.onToggle}>toggle</Button> </div> ); } }
對應css
樣式如下:
.fade-enter { opacity: 0; transform: translateX(100%); } .fade-enter-active { opacity: 1; transform: translateX(0); transition: all 500ms; } .fade-exit { opacity: 1; transform: translateX(0); } .fade-exit-active { opacity: 0; transform: translateX(-100%); transition: all 500ms; }
SwitchTransition
SwitchTransition
可以完成兩個組件之間切換的炫酷動畫
比如有一個按鈕需要在on
和off
之間切換,我們希望看到on
先從左側退出,off
再從右側進入
SwitchTransition
中主要有一個屬性mode
,對應兩個值:
- in-out:表示新組件先進入,舊組件再移除;
- out-in:表示就組件先移除,新組建再進入
SwitchTransition
組件里面要有CSSTransition
,不能直接包裹你想要切換的組件
里面的CSSTransition
組件不再像以前那樣接受in
屬性來判斷元素是何種狀態,取而代之的是key
屬性
下面給出一個按鈕入場和出場的示例,如下:
import { SwitchTransition, CSSTransition } from "react-transition-group"; export default class SwitchAnimation extends PureComponent { constructor(props) { super(props); this.state = { isOn: true } } render() { const {isOn} = this.state; return ( <SwitchTransition mode="out-in"> <CSSTransition classNames="btn" timeout={500} key={isOn ? "on" : "off"}> { <button onClick={this.btnClick.bind(this)}> {isOn ? "on": "off"} </button> } </CSSTransition> </SwitchTransition> ) } btnClick() { this.setState({isOn: !this.state.isOn}) } }
css
文件對應如下:
.btn-enter { transform: translate(100%, 0); opacity: 0; } .btn-enter-active { transform: translate(0, 0); opacity: 1; transition: all 500ms; } .btn-exit { transform: translate(0, 0); opacity: 1; } .btn-exit-active { transform: translate(-100%, 0); opacity: 0; transition: all 500ms; }
TransitionGroup
當有一組動畫的時候,就可將這些CSSTransition
放入到一個TransitionGroup
中來完成動畫
同樣CSSTransition
里面沒有in
屬性,用到了key
屬性
TransitionGroup
在感知children
發生變化的時候,先保存移除的節點,當動畫結束后才真正移除
其處理方式如下:
- 插入的節點,先渲染dom,然后再做動畫
- 刪除的節點,先做動畫,然后再刪除dom
如下:
import React, { PureComponent } from 'react' import { CSSTransition, TransitionGroup } from 'react-transition-group'; export default class GroupAnimation extends PureComponent { constructor(props) { super(props); this.state = { friends: [] } } render() { return ( <div> <TransitionGroup> { this.state.friends.map((item, index) => { return ( <CSSTransition classNames="friend" timeout={300} key={index}> <div>{item}</div> </CSSTransition> ) }) } </TransitionGroup> <button onClick={e => this.addFriend()}>+friend</button> </div> ) } addFriend() { this.setState({ friends: [...this.state.friends, "coderwhy"] }) } }
對應css
如下:
.friend-enter { transform: translate(100%, 0); opacity: 0; } .friend-enter-active { transform: translate(0, 0); opacity: 1; transition: all 500ms; } .friend-exit { transform: translate(0, 0); opacity: 1; } .friend-exit-active { transform: translate(-100%, 0); opacity: 0; transition: all 500ms; }
原文鏈接:https://juejin.cn/post/7140641440656261133
相關推薦
- 2022-06-01 Android實現簡單的照相功能_Android
- 2022-08-02 C#如何Task執行任務,等待任務完成_C#教程
- 2022-11-20 Python必知必會之os模塊實例詳解_python
- 2022-05-09 C#多線程之線程池ThreadPool用法_C#教程
- 2024-03-20 SpringBoot使用dynamic-datasource實現多數據源方案
- 2022-03-25 C++實現希爾排序算法實例_C 語言
- 2022-07-18 C++函數模板和類模板詳解
- 2022-05-17 Python的集合類型之set和frozenset詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支