#javascript #css #reactjs #css-animations #transition
#javascript #css — код #reactjs #css-анимация #переход
Вопрос:
Я только начинаю использовать анимацию / переход в своих React.js
проектах. В приведенном ниже GIF-файле, когда я закрываю Message
компонент, он исчезает. После того, как он исчезнет, я скрою используемый компонент onAnimationEnd
.
То, что я хочу, чтобы произошло, — это когда Message
исчезает, чтобы нижеприведенные компоненты скользили вверх. Я концептуально не уверен, как я мог бы добиться этого либо с помощью анимации / перехода CSS, либо с помощью специфического способа реагирования.
Message.js
import React, {PropTypes, Component} from 'react';
import MessageTypes from '../constants/MessageTypes';
export default class Message extends Component {
constructor(props, context) {
super(props, context);
this.handleClick = this.handleClick.bind(this);
this.onAnimationEnd = this.onAnimationEnd.bind(this);
this.state = {
animate: false,
hide: false
}
}
handleClick(e) {
e.preventDefault();
this.setState({animate: true});
}
onAnimationEnd() {
console.log('fdsfd');
this.setState({hide: true});
}
render() {
return (
<div ref="message" onAnimationEnd={this.onAnimationEnd} className={`card message ${this.state.hide ? 'hide open' : ''} ${this.state.animate ? 'message-transition-fade-out' : ''}`}>
<span className={`icon icon-${this.iconLevel()}`} style={{color: `#${this.iconColor()}`}}></span>
<p>
<strong>{this.props.title}</strong><br />
<span dangerouslySetInnerHTML={{ __html: this.props.message }} />
</p>
<a href="#" onClick={this.handleClick}>
<span className="icon icon-close"></span>
</a>
</div>
);
}
}
Message.scss
.message {
max-height: 150px;
transition: height 2s ease;
amp;.open {
height: 0; //define your height or use max-height
}
amp;-transition {
amp;-fade-out {
@include animation(0s, .3s, fadeout);
}
}
}
Ответ №1:
Я бы посоветовал вам использовать css transitions
.
Есть класс с именем open
, прикрепленный к корню Message
компонента. onAnimationEnd
удалите класс open
. Теперь используйте height
для анимации этого класса.
Псевдокод.
.message {
height: 0px;
transition: height 0.3s ease;
}
.message.open {
height: 100px; //define your height or use max-height
}
Комментарии:
1. похоже, не работает. Я добавил соответствующий код с вашими предложениями к моему вопросу.
2. Анимация не нужна. Просто следуйте псевдокоду.
3. Анимация предназначена для исчезновения предыдущего сообщения. В
onAnimationEnd
я добавляюopen
класс. Похоже, это не работает. Исправлен CSS.4. на самом деле вы предлагаете удалить открытый класс, и я добавляю его. Позвольте мне это исправить.
5. Всегда используйте класс
open
, удалите егоonAnimationEnd
и используйте css, который я привел в псевдокоде.