Общим случаем при выполнении css-переходов является то, что вам сначала нужно установить некоторые начальные значения, а затем перейти к другим значениям. В моем случае мне нужно изменить поле на абсолютное положение, а затем я хочу перевести его в полноэкранный режим. Это то, что я пробовал:Добавьте css в два этапа с реакцией?
componentDidMount (props) {
this.flky = new Flickity('.carousel', flickityOptions)
this.flky.on('staticClick',() => {
this.setState({ zoom: 'transition' },() => {
this.setState({ zoom: 'full' })
})
})
}
setStyle() {
const container = this.refs.container
if (this.state.zoom === 'transition') {
return {
position: 'absolute',
top: container.offsetTop + 'px',
left: container.offsetLeft + 'px',
width: container.offsetWidth + 'px',
height: container.offsetHeight + 'px',
transition: 'all .5s'
}
} else if (this.state.zoom === 'full') {
return {
background: 'white',
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: '100%',
transition: 'all .5s'
}
}
}
<div ref='container' style={this.setStyle()} />
Проблема, кажется, что первоначальный CSS не применяется до того, как вторичный применяется, так ДИВ идет прямо в полноэкранном режиме. Я пытаюсь достичь этого, используя обратный вызов setState
, но он не работает.
Это связано с задержкой 0мс по какой-либо причине.
this.flky.on('staticClick',() => {
this.setState({ zoom: 'transition' },() => {
setTimeout(() => {
this.setState({ zoom: 'full' },() => {
this.flky.resize()
}, 0)
})
})
})
он работает, если по какой-то причине я добавляю задержку на 0 секунд, но это, как правило, не очень хорошая практика, есть ли какой-то обратный вызов, который я мог бы использовать или что-то делать? – Himmators
Исходный css ** применяется **. Ваша проблема в том, что вам нужна задержка 0,5 с между первым и вторым 'setState' (но они идут быстрее). Я думаю, что этот путь имеет недостаток вообще. Возможно, вы найдете более полезным использовать «ключевые кадры» в css - делать все переходы только через css. –
спасибо, однако, это не так, как работает css. переходы начинаются с момента применения нового css, поэтому его нельзя переписать в этом смысле. Я обновил вопрос с задержкой 0мс. – Himmators