Можно ли использовать CSSTransitionGroup для анимации двумя различными способами в зависимости от состояния?

Сценарий таков: я хотел бы анимировать серию похожих на Google карт в разных направлениях в зависимости от того, нажимает ли пользователь "следующий" или "предыдущий".

Анимации в одном направлении легко с CSSTransitionGroup - у меня есть кнопка "Далее", которая вызывает текущую карту, чтобы скользить вверх и исчезать (и следующая карта, чтобы скользить вверх снизу).

Однако я также хочу, чтобы "предыдущая" кнопка анимировала противоположный переход, а именно, чтобы текущая карта скользила вниз (а предыдущая карта скользила вниз).

Суть проблемы заключается в том, что CSSTransitionGroup должен оставаться подключенным. Я мог бы легко иметь что-то вроде <CSSTransitionGroup transitionName={this.state.isForward ? 'animate-forward' : 'animate-back'} и есть следующий / предыдущий кнопки вызова setState({isForward: ...}), но это, похоже, не работает, скорее всего, потому что CSSTransitionGroup должен был бы повторно выполнить рендеринг.

Возможно ли то, что я описываю, с помощью CSSTransitionGroup?

1 ответ

Да, но не путем изменения имени перехода, а скорее, оборачивая все это другим классом для направления:

Если, скажем, карты подаются слева и представлены в центре, а справа отклонены.

JSX:

<div className={"wrapper" + animationDirection} >
    <ReactCSSTransitionGroup
        transitionName="card"
        transitionEnterTimeout={200}
        transitionLeaveTimeout={200}>
        {cards}
    </ReactCSSTransitionGroup>
</div>

SCSS:

.wrapper.adding-cards {
    .card {
        &.card-enter {
            // set to left position
        }

        &.card-enter.card-enter-active {
            // set to center position
        }

        &.card-leave-active {
            // set to right position
        }
    }
}

.wrapper.removing-cards {
    .card {
        &.card-enter {
            // set to right position
        }

        &.card-enter.card-enter-active {
            // set to center position
        }

        &.card-leave-active {
            // set to left position
        }
    }
}
Другие вопросы по тегам