├── .gitignore ├── bundle.js ├── images └── react.png ├── index.html ├── jsx ├── appear_todo.jsx ├── child.jsx ├── demo.jsx ├── enter_leave_todo.jsx └── grandchild.jsx ├── package.json ├── style.css └── webpack.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /images/react.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huan-ji/react-transition-animation-demo/90592a8147722ee99a7168c4f682a08cb150a347/images/react.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | React Animation Demo 8 | 9 | 10 |
11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /jsx/appear_todo.jsx: -------------------------------------------------------------------------------- 1 | var ReactCSSTransitionGroup = require('react-addons-css-transition-group'); 2 | var React = require('react'); 3 | 4 | var AppearTodoList = React.createClass({ 5 | getInitialState: function() { 6 | return {items: ['these', 'words', 'transition', 'in', 'when', 'mounted']}; 7 | }, 8 | render: function() { 9 | var items = this.state.items.map(function(item, i) { 10 | return ( 11 |
12 | {item} 13 |
14 | ) 15 | }); 16 | 17 | return ( 18 |
19 | 21 | {items} 22 | 23 |
24 | ); 25 | } 26 | }); 27 | 28 | 29 | module.exports = AppearTodoList; 30 | -------------------------------------------------------------------------------- /jsx/child.jsx: -------------------------------------------------------------------------------- 1 | var React = require('react'); 2 | var ReactCSSTransitionGroup = require('react-addons-css-transition-group'); 3 | var Link = require('react-router').Link; 4 | var EnterLeaveTodoList = require('./enter_leave_todo'); 5 | 6 | var Child = React.createClass({ 7 | cloneChildren: function () { 8 | var path = this.props.location.pathname; 9 | if (this.props.children) { 10 | return React.cloneElement(this.props.children, { key: path }) 11 | } 12 | }, 13 | 14 | render: function () { 15 | return ( 16 |
17 |

18 | 19 | Child Page 20 |


21 | 22 | Grandchild

23 | 24 | 25 |
26 |

Enter and Leave Transition Todo List:

27 | 28 |
29 | 30 | 32 | {this.cloneChildren()} 33 | 34 |
35 | ) 36 | } 37 | }) 38 | 39 | module.exports = Child; 40 | -------------------------------------------------------------------------------- /jsx/demo.jsx: -------------------------------------------------------------------------------- 1 | var React = require('react'); 2 | var ReactDOM = require('react-dom'); 3 | var Router = require('react-router').Router; 4 | var Route = require('react-router').Route; 5 | var ReactCSSTransitionGroup = require('react-addons-css-transition-group'); 6 | var Link = require('react-router').Link; 7 | var IndexRoute = require('react-router').IndexRoute; 8 | var Child = require('./child'); 9 | var Grandchild = require('./grandchild'); 10 | 11 | var App = React.createClass({ 12 | render: function () { 13 | var path = this.props.location.pathname; 14 | var segment = path.split('/')[1] || 'root'; 15 | return ( 16 |
17 | 19 | 20 | 21 | 22 |
Child
23 | 24 | 26 | {React.cloneElement(this.props.children, { key: segment })} 27 | 28 |
29 | ) 30 | } 31 | }); 32 | 33 | var MockIndex = React.createClass({ 34 | render: function () { 35 | return
36 | } 37 | }) 38 | 39 | var routes = ( 40 | 41 | 42 | 43 | 44 | 45 | 46 | ); 47 | 48 | 49 | 50 | document.addEventListener("DOMContentLoaded", function () { 51 | ReactDOM.render({routes}, document.getElementById("content")); 52 | }); 53 | -------------------------------------------------------------------------------- /jsx/enter_leave_todo.jsx: -------------------------------------------------------------------------------- 1 | var ReactCSSTransitionGroup = require('react-addons-css-transition-group'); 2 | var React = require('react'); 3 | 4 | var EnterLeaveTodoList = React.createClass({ 5 | getInitialState: function() { 6 | return {items: ['hello', 'world', 'click', 'me']}; 7 | }, 8 | handleAdd: function() { 9 | var newItems = 10 | this.state.items.concat([prompt('Enter some text')]); 11 | this.setState({items: newItems}); 12 | }, 13 | handleRemove: function(i) { 14 | var newItems = this.state.items.slice(); 15 | newItems.splice(i, 1); 16 | this.setState({items: newItems}); 17 | }, 18 | render: function() { 19 | var items = this.state.items.map(function(item, i) { 20 | return ( 21 |
22 | {item} 23 |
24 | ); 25 | }.bind(this)); 26 | return ( 27 |
28 | 29 | 31 | {items} 32 | 33 |
34 | ); 35 | } 36 | }); 37 | 38 | 39 | module.exports = EnterLeaveTodoList; 40 | -------------------------------------------------------------------------------- /jsx/grandchild.jsx: -------------------------------------------------------------------------------- 1 | var React = require('react'); 2 | var Link = require('react-router').Link; 3 | var AppearTodoList = require('./appear_todo'); 4 | 5 | var Grandchild = React.createClass({ 6 | render: function () { 7 | return ( 8 |
9 |

10 | 11 | Grandchild Page 12 |


13 | 14 | Back

15 | 16 |
17 |

Appear Transtion Todo List

18 | 19 |
20 |
21 | ) 22 | } 23 | }) 24 | 25 | module.exports = Grandchild; 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react_animation_demo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "demo.jsx", 6 | "scripts": { 7 | "postinstall": "./node_modules/.bin/webpack" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "babel-core": "^6.3.21", 14 | "babel-loader": "^6.2.0", 15 | "babel-preset-react": "^6.3.13", 16 | "history": "^1.13.1", 17 | "react": "^0.14.3", 18 | "react-addons-css-transition-group": "^0.14.3", 19 | "react-dom": "^0.14.3", 20 | "react-router": "^1.0.2", 21 | "webpack": "^1.12.9" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | html, body, header, nav, h1, a, 2 | ul, li, strong, main, button, i, 3 | section, img, div, h2, p, form, 4 | fieldset, label, input, textarea, 5 | span, article, footer, time, small { 6 | margin: 0; 7 | padding: 10px; 8 | border: 0; 9 | outline: 0; 10 | color: inherit; 11 | text-decoration: inherit; 12 | } 13 | 14 | .pageSlider-leave { 15 | transform: translate3d(0, 0, 0); 16 | } 17 | 18 | .pageSlider-leave.pageSlider-leave-active { 19 | transform: translate3d(100%, 0, 0); 20 | transition: all 600ms; 21 | } 22 | 23 | .pageSlider-enter { 24 | transform: translate3d(100%, 0, 0); 25 | } 26 | 27 | .pageSlider-enter.pageSlider-enter-active { 28 | transform: translate3d(0, 0, 0); 29 | transition: all 600ms; 30 | } 31 | 32 | .page { 33 | position: absolute; 34 | top: 0; 35 | left: 0; 36 | width: 100%; 37 | height: 100%; 38 | z-index: 1000px; 39 | } 40 | 41 | h2 { 42 | text-align: center; 43 | background: white; 44 | color: black; 45 | } 46 | 47 | .example-enter { 48 | opacity: 0.01; 49 | } 50 | 51 | .example-enter.example-enter-active { 52 | opacity: 1; 53 | transition: opacity 500ms ease-in; 54 | } 55 | 56 | .example-leave { 57 | opacity: 1; 58 | } 59 | 60 | .example-leave.example-leave-active { 61 | opacity: 0.01; 62 | transition: opacity 300ms ease-in; 63 | } 64 | 65 | .example-appear { 66 | opacity: 0.01; 67 | } 68 | 69 | .example-appear.example-appear-active { 70 | opacity: 1; 71 | transition: opacity 1500ms ease-in; 72 | } 73 | 74 | a:hover { 75 | font-weight: bold; 76 | } 77 | 78 | img { 79 | display:block; 80 | margin-left: auto; 81 | margin-right: auto; 82 | } 83 | 84 | .home-image { 85 | position: absolute; 86 | width: 50px; 87 | height: 50px; 88 | top: 0px; 89 | cursor: pointer; 90 | } 91 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | context: __dirname, 3 | entry: "./jsx/demo.jsx", 4 | output: { 5 | path: "./", 6 | filename: "bundle.js" 7 | }, 8 | resolve: { 9 | extensions: ["", ".js", ".jsx"] 10 | }, 11 | module: { 12 | loaders: [ 13 | { 14 | test: /\.jsx?$/, 15 | exclude: /(node_modules|bower_components)/, 16 | loader: 'babel', 17 | query: { 18 | presets: ['react'] 19 | } 20 | }, 21 | { 22 | test: /\.node$/, 23 | loader: "node-loader" 24 | } 25 | ] 26 | } 27 | }; 28 | --------------------------------------------------------------------------------