ИМХО, есть два простых варианта, есть и другие, но поскольку следующие два опираются только на переходы css, без ключевого кадра или js-анимации, я рассматриваю их как простой подход к этой проблеме.
1. Задержка переходов:
Необходимо установить transition-delay
для каждого элемента. Предполагая, что items
является массивом Объектов, которые должны быть преобразованы в <li>
элементов .:
const TRANSITION_DURATION = 3; //in seconds, one needs to »know« this
//could be parsed from the css
items.map((item, idx) =>
<li
key="…"
className="fade-in-class"
style={transitionDelay: idx * TRANSITION_DURATION}>…</li>
);
Итак, идея такова: увеличить задержку для каждого перехода, чтобы переходы появлялись один за другим. Недостатком является то, что Javascript должен знать о некоторых значениях CSS, в этом случае продолжительность перехода.
2. События перехода:
Как описано здесь существует как минимум одно событие, которое запускается, когда завершается переход. Это немного сложнее для кода.
class FadeList extends React.Component {
constructor(props) {
super(props);
this.state = {
itemToFade: 0
}
}
render () {
const toFade = this.state.itemToFade;
return (<ul>
{this.props.items.map((item, idx) =>
<li
key="…"
className={idx == toFade ? 'fade-class' : '' }
onTransitionEnd={e => this.setState({itemToFade: toFade + 1})}
>…</li>)}
</ul>)
}
}
Идея здесь такова: сохранить индекс элемента для постепенного появления в пределах состояния компонента. При визуализации класс css, который запускает переход, добавляется только к этому элементу. Когда переход завершен, обратный вызов изменяет состояние, что, в свою очередь, повторно отображает компонент со следующим индексом. При этом Javascript не нужно знать какие-либо значения CSS, что облегчает их настройку во время итерации проекта. Обратите внимание, что приведенный выше код предназначен только для иллюстрации идеи, которую я не тестировал.
В зависимости от требований, но, если возможно, самое простое решение для этого может быть чисто решение CSS.
.transition {
/* all the needed stuff here */
transition-duration: 2s;
}
.transition:nth-child(2) {
transition-delay: 2s;
}
.transition:nth-child(3) {
transition-delay: 4s;
}
/* And so forth */
Если вы используете sass, вы можете сгенерировать определения для стольких элементов, сколько пожелаете.