React动态应用css类

时间:2017-04-22 20:07:50

标签: css reactjs sass css-animations

我有两个div:.div-one.div-two。最初.div-one是全宽div。在按钮上单击它会减小到50%宽度,.div-two从右到左打开,webkit动画占据其他50%宽度。这个动画很流畅。再次点击按钮,.div-one的宽度为100%,.div-two.的宽度为0%。到目前为止还有动画。

我的HTML:

<div className={`div-one ${!this.state.showRegistration && !this.state.showLogin ? 'full-width' : 'half-width'}`}>
</div>
<If condition={this.state.showRegistration}>
   <div className='div-two'>
   </div>
</If>

我的CSS:

.div-one {
  background: url("../../../assets/images/manhattan-min.png") no-repeat center center fixed;
  -webkit-background-size: cover;
  -moz-background-size: cover;
  -o-background-size: cover;
  background-size: cover;

  position: absolute;
  width: 100%;
  min-height: 500px;
  min-height: 100vh;


}

.div-one.half-width {
  -webkit-animation: right-to-left-div1 0.3s forwards;
  animation: right-to-left-div1 0.3s forwards;
}

.div-one.full-width{
  -webkit-animation: left-to-right-div1 0.3s forwards;
  animation: left-to-right-div1 0.3s forwards;
}

.div-two {
  position: relative;
  width: 50%;
  height: 100vh;
  background-color: #EEEEEE;
  -webkit-animation: right-to-left-div2 0.3s forwards;
  animation: right-to-left-div2 0.3s forwards;
}

@keyframes right-to-left-div1{
  to {
    width: 50%;
  }
}


@keyframes left-to-right-div1{
  to{
    width:100%
  }
}

@keyframes right-to-left-div2{
  from{left:100%}
  to{left:50%}
}
@keyframes left-to-right-div2{
  from{left:0%}
  to{left:50%}
}

示例ilustration:

enter image description here

如何实现第二个动画,即.div-two向右减少50%到0%,div-one从50%扩展到100%?

1 个答案:

答案 0 :(得分:1)

嗯,这是一个例子。简而言之,我会使用css过渡,而不是像这样简单的关键帧。

class App extends React.Component {
  constructor(props) {
    super(props)
    this.state = {show: false}
    
    this.show = this.show.bind(this)
  }
  
  show() {
    this.setState(prevState => ({show: !prevState.show}))
  }
  
  render() {
    return (
      <div className={'wrapper' + (this.state.show ? ' show' : '')}>
        <div>
          <button onClick={this.show}>{this.state.show ? 'hide' : 'show'}</button>
        </div>
        <div className="one">one</div>
        <div className="two">two</div>
      </div>
    )
  }
}

ReactDOM.render(
  <App />,
  document.getElementById('root')
);
body {
  margin: 0;
}

.wrapper {
  overflow: hidden;
  white-space: nowrap;
}

.one, .two {
  background: #333;
  border: 2px solid #787567;
  box-sizing: border-box;
  color: #fff;
  display: inline-block;
  font-family: arial;
  overflow: hidden;
  padding: 20px;
  text-align: center;
  transition: border 0.2s, padding 0.2s, width 0.2s;
}

.one {
  width: 100%;
}
.two {
  border-width: 2px 0;
  padding: 20px 0;
  width: 0;
}

.show .one, .show .two {
  border-width: 2px;
  padding: 20px;
  width: 50%;
}
<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>
<div id="root"></div>