React styled-components淡入/淡出

16

我正尝试构建一个React组件来处理淡入和淡出。在下面的代码中,如果我将 out 作为组件的属性传递,它会在动画消失之前显示为隐藏。我希望它默认情况下淡入,然后在传递 out 属性时淡出。有人看到这个问题的解决方案了吗?

import React from 'react';
import styled, { keyframes } from 'styled-components';

const fadeIn = keyframes`
  from {
    transform: scale(.25);
    opacity: 0;
  }

  to {
    transform: scale(1);
    opacity: 1;
  }
`;

const fadeOut = keyframes`
  from {
    transform: scale(1);
    opacity: 0;
  }

  to {
    transform: scale(.25);
    opacity: 1;
  }
`;

const Fade = styled.div`
  ${props => props.out ?
    `display: none;`
   : `display: inline-block;`
   }
  animation: ${props => props.out ? fadeOut : fadeIn} 1s linear infinite;
`;

function App() {
  return (
    <div>
      <Fade>&lt;test&gt;</Fade>
    </div>
  );
}

export default App;

WebpackBin 运行示例


如果我是你,我会看一下ReactCSSTransitionGroup插件。它很容易使用,而且他们提供的示例可以实现你想要做的 https://facebook.github.io/react/docs/animation.html#high-level-api-reactcsstransitiongroup - denvaar
据我所知,ReactCSSTransitionGroup 很快就会被弃用,因此我正在尝试避免使用它。 - Elliot
1个回答

29
你的代码问题在于当props.out为true时,你将display属性设置为none。这就是为什么你看不到任何动画,因为在动画开始之前,你已经隐藏了组件!使用淡出动画的方法是改用visibility属性,并将其转换与动画持续时间相同的时间。(参见this old SO answer)。像这样做应该可以解决你的问题:
const Fade = styled.default.div`
  display: inline-block;
  visibility: ${props => props.out ? 'hidden' : 'visible'};
  animation: ${props => props.out ? fadeOut : fadeIn} 1s linear;
  transition: visibility 1s linear;
`;

const fadeIn = styled.keyframes`
  from {
    transform: scale(.25);
    opacity: 0;
  }

  to {
    transform: scale(1);
    opacity: 1;
  }
`;

const fadeOut = styled.keyframes`
  from {
    transform: scale(1);
    opacity: 1;
  }

  to {
    transform: scale(.25);
    opacity: 0;
  }
`;

const Fade = styled.default.div`
  display: inline-block;
  visibility: ${props => props.out ? 'hidden' : 'visible'};
  animation: ${props => props.out ? fadeOut : fadeIn} 1s linear;
  transition: visibility 1s linear;
`;

class App extends React.Component {
  constructor() {
    super()
    this.state = {
      visible: true,
    }
  }

  componentDidMount() {
    setTimeout(() => {
      this.setState({
        visible: false,
      })
    }, 1000)
  }

  render() {
    return (
      <div>
        <Fade out={!this.state.visible}>&lt;test&gt;</Fade>
      </div>
    );
  }
}

ReactDOM.render(
  <App />,
  document.getElementById('root')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<script src="https://unpkg.com/styled-components/dist/styled-components.min.js"></script>

<div id="root" />

注意:您的淡出动画也从0到1不透明度,而不是相反的。我也在片段中修复了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接