В настоящее время я использую useTransition, чтобы моя мобильная навигация отображалась:
const MobileNav = ({show, toggle, styles}) => {
let transition = useTransition(show, null, {
from: {transform: 'translateY(-100%) scale(0.7)', ...styles},
enter: {transform: 'translateY(0) scale(1)'},
leave: {transform: 'translateY(100%) scale(0.7)'}
})
return (
<>
{transition.map(({item, props, key}) => {
return item ? (
<animated.div className="navbar__menu_mob" key={key} style={props}>
...someHtml
</animated.div>
) : null
})}
</>
)
}
С помощью этого кода масштаб и перевод анимируются одновременно. Моя конечная цель - связать их в цепочку, чтобы scale
был первым, а translateY
- после. Из примеров с помощью react-spring кажется, что лучший способ — это обернуть мой первый animated.div
в другой animated.div
и связать их с помощью useChain
.
Кажется, я изо всех сил пытаюсь понять, как лучше всего связать мои анимации. В идеале мне не нужно было бы оборачивать то, что у меня сейчас есть, в другой animated.div
. Я мог бы сделать с некоторым руководством.
1 ответ
Мне удалось понять это без использования useChain().
Я использовал многоступенчатые переходы:
let transition = useTransition(show, null, {
from: {translate: '-100%', scale: 0.7, ...styles},
enter: item => async(next) => {
await next({translate: '0%'})
await next({scale: 1})
},
leave: item => async(next) => {
await next({scale: 0.7})
await next({translate: '100%'})
}
})
Затем мне пришлось интерполировать стили следующим образом:
{transition.map(({item, props, key}) => {
return item ? (
<animated.div className="navbar__menu_mob" key={key} style={{
transform: interpolate([
props.translate.interpolate(v => `translateY(${v})`),
props.scale.interpolate(v => `scale(${v})`)
], (translate, scale) => `${translate} ${scale}`),
...props
}}></animated.div> )
: null })}
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.