使用 CSS 关键帧和 React 切换幻灯片淡出、幻灯片淡入(返回)

Toggle slide fade out, slide fade (back) in with CSS Keyframes and React

我有一个框 (div),我想用滑出动画切换,然后在按下按钮时在动画中滑回(完全相反)。

我不希望在初始页面呈现时出现任何动画。我能够在按下按钮时成功滑动页面的框 left/fade-out,但是向后滑动没有任何过渡或动画。

如何在元素返回视图时添加此过渡,而不添加将在初始页面呈现时触发的 class?

SlideBoxApp.js

class SlideBoxApp extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
        slideIn: false
    }
  }
  
  toggleSlide() {
    const { slideIn } = this.state
    this.setState({slideIn: !slideIn})
  }
  
  render() {
    const { slideIn } = this.state
      return (
        <div>
         <button onClick={() => this.toggleSlide()}>slide in</button>
         <div className={`box ${slideIn? 'slideLeft' : ''}`}></div>
        </div>
      )
   }
}

ReactDOM.render(<SlideBoxApp />, document.querySelector("#app"))

SlideBoxApp.css

body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

button {
  margin-bottom: 10px;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

.box {
  width: 100px;
  height: 100px;
  background-color: pink;
}

.slideLeft {
  animation-duration: 500ms;
  animation-name: slideLeft;
  animation-fill-mode: forwards;
}

.slideRight {
  animation-duration: 500ms;
  animation-name: slideLeft;
  animation-fill-mode: forwards;
}

@keyframes slideLeft {
    0% {
        transform: translate(0, 0);
        opacity: 1;
    }

    100% {
        transform: translate(-100%, 0);
        opacity: 0;
    }
}

@keyframes slideRight {
    0% {
        transform: translate(0, 0);
        opacity: 0;
    }

    100% {
        transform: translate(100%, 0);
        opacity: 1;
    }
}

JS Fiddle Link Here

the slide back in does not have any transition or animation

我已经搜索了一种解决方案,可以在 keyframe 被移除后将元素动画恢复到其原始状态,但找不到。
拥有 keyframe 意味着 startend 状态之间的动画,因此如果要为这两个状态设置动画,初始页面动画是不可避免的 inout.

但是,您只需 transition 而不是 keyframes 就可以达到您想要的结果。
只需在 .slideLeft class:

中添加新状态
.slideLeft {
  transform: translate(-100%, 0);
  opacity: 0;
}

并给 .box 一些 transition 属性:

.box {
  transition-duration: .5s;
  transition-property: transform, opacity;
}

我更新了你的JS Fiddle