Reactjs - переходите один div поверх другого с помощью слайд-анимации

Вы понимаете концепцию кастинга? Кастинг - это процесс преобразования типов, который в Java очень распространен, потому что это статически типизированный язык. Некоторые примеры:

Вставить строку «1» в int -> no problem

Вставить строку «abc» в int -> вызывает ClassCastException

Или подумайте о диаграмме классов с Animal.class, Dog.class и Cat.class

Animal a = new Dog();
Dog d = (Dog) a; // No problem, the type animal can be casted to a dog, because its a dog.
Cat c = (Dog) a; // Raises class cast exception; you can't cast a dog to a cat.
3
задан Cody Gray 3 April 2019 в 06:22
поделиться

2 ответа

У вас есть пара проблем, сначала вы должны сохранить ваши классы для анимации в вашем состоянии и обновить свое состояние, когда вы нажимаете на синее поле. Кроме того, ваши анимации и идентификаторы ключевых кадров записаны не одинаково:

у вас установлена ​​анимация animation: slide-in, тогда как идентификатор ключевых кадров - «slideIn», один из которых обозначен верблюдом, а другой - тире. Я скопировал ваш код в jsfiddle и должен работать: https://jsfiddle.net/ahmadabdul3/y6xsveL5/22/

также я изменил анимацию с translatex на свойство left, для него установлено значение left: -100px, а для анимации - left: 0

Я обновил jsfiddle, чтобы страница 2 скользила, ждала 2 секунды, а затем выдвигалась. Я использовал функцию обратного вызова setState и установил тайм-аут на 2 секунды, затем установил класс из slideIn в slideOut: https://jsfiddle.net/ahmadabdul3/y6xsveL5/29/

, затем после около 600 миллисекунд, я возвращаю класс в исходное состояние без дополнительного скользящего класса. Таким образом, если вы нажмете еще раз, он снова будет скользить

Я не уверен, что обратные вызовы setState - правильное решение, я думаю, что есть способ настроить анимацию из css, чтобы она выполняла слайд, а затем слайд.

Если вы хотите, чтобы страница 2 выдвигалась при нажатии, вы можете повторить метод click handle для страницы 1 и просто изменить класс на выдвигающийся

На самом деле я снова обновил код, потому что есть проблема, если вы щелкаете по синей странице, когда происходит скольжение, анимация сбрасывается, потому что он обновляет класс до завершения анимации, вам нужно следить за тем, происходит ли скольжение, вы не позволяете щелчку ничего делать, пока все анимация завершена: https://jsfiddle.net/ahmadabdul3/y6xsveL5/35/

окончательный код:

class TodoApp extends React.Component {
  sliding = false;
  state = {
    page2Class: "",     
  };

  handleClick = () => {
    if (this.sliding) return;
    this.sliding = true;
    this.setState({ page2Class: 'slideIn' }, () => {
      setTimeout(() => {
        this.setState({ page2Class: 'in-view slideOut' }, () => {
          setTimeout(() => {
            this.setState({ page2Class: '' }, () => {
              this.sliding = false;
            });
          }, 600)
        });
      }, 2000)
    });
  };

  render() {
    const { page2Class } = this.state;
    return (
      <div>
        <div className='page1' onClick={this.handleClick}>Page 1</div>
        <div className={`page2 ${page2Class}`}>Page 2</div>
      </div>
    )
  }
}

css

.App {
  margin: 0;
  padding: 0;
}

.page1 {
  background-color: blue;
  margin:0;
  padding:0;
  z-index:8;
  top:0;
  left:0; 
  position:fixed;
  width:100%;
  height:100%;  
}

.page2 {
  background-color: red;
  margin:0;
  padding:0;
  z-index:8;
  top:0;
  left:-100%; 
  position:fixed;
  width:100%;
  height:100%;  
}

.in-view {
  left: 0;
}

.slideIn {
  animation: slideIn 0.5s forwards;
  -webkit-animation: slideIn 0.5s forwards;
}

.slideOut {
  animation: slideOut 0.5s forwards;
  -webkit-animation: slideOut 0.5s forwards;
}

@keyframes slideIn {
  100% { left: 0; }
}

@-webkit-keyframes slideIn {
  100% { left: 0; }
}

@keyframes slideOut {
  100% { left: 100%; }
}

@-webkit-keyframes slideOut {
  100% { left: 100%; }
}


.page2Visible {
  visibility: visible;
  opacity: 1;
}
0
ответ дан duxfox-- 3 April 2019 в 06:22
поделиться

Изначально вы должны поддерживать состояние для текущего активного div. Каждый элемент div при нажатии кнопки скрывает этот конкретный элемент div и делает его активным. В приведенном ниже примере кода я дал высоту div в 500px, но вы можете указать высоту, как вам нужно. Здесь я использую свойство перехода easy-in-out для выполнения анимации скольжения вверх и вниз. Вы можете проверить код в https://jsfiddle.net/krishnauppili/okn4vbe0/5/

Вот код React (App.js): [ 114]

class App extends Component {
constructor(props) {
    super(props);
    this.state = {
        activeDiv: "div1",
    }
}

toggleDiv = () => {
    this.setState({
        activeDiv: this.state.activeDiv === "div1" ? "div2" : "div1",
    });
};

render() {
    return (
        <div className="App">
            <div className={this.state.activeDiv === "div1" ? "div1 show" : "div1 hide"} id="div1">
                Div 1
                <button type="button" onClick={this.toggleDiv}> Hide div1</button>
            </div>
            <div className={this.state.activeDiv === "div2" ? "div2 show" : "div2 hide"} id="div2">
                Div 2
                <button type="button" onClick={this.toggleDiv}> Hide div2</button>
            </div>
        </div>
    );
}}

Вот код CSS (App.css):

.div1{
    background-color: black;
}
.div2{
    background-color: green;
}
.div1,.div2{
    color:white;
}
.div1.show,.div2.show{
    height:500px;
    transition:  all 0.2s ease-in-out;
    padding-top: 50px;
    text-align: center;
}
.div1.hide,.div2.hide{
    text-align: center;
    height: 0;
    overflow: hidden;
    transition: all 0.2s ease-in-out;
}
0
ответ дан Krishna Uppili 3 April 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: