GSAP (GreenSock Animation Platform) — это мощная библиотека для
анимации в JavaScript, предоставляющая гибкие возможности управления
временными шкалами и свойствами объектов. В современных
фронтенд-фреймворках, таких как Vue или React, часто используется
концепция реактивности и ссылок на DOM-элементы
(ref), что требует особого подхода при интеграции
с GSAP.
ref) и GSAPref — это объект, предоставляющий ссылку на DOM-элемент
или компонент. В Vue 3 это объект, у которого значение хранится в
ref.value. В React ref создается через
useRef и доступен через свойство .current.
Пример использования ref с GSAP в Vue
3:
import { ref, onMounted } from 'vue';
import { gsap } from 'gsap';
export default {
setup() {
const box = ref(null);
onMounted(() => {
gsap.to(box.value, { x: 200, duration: 2 });
});
return { box };
}
}
В этом примере box — это ссылка на DOM-элемент
<div>. GSAP работает напрямую с
box.value, так как это реальный DOM.
Особенности работы с ref:
onMounted или useEffect,
чтобы DOM-элемент уже существовал.ref не
автоматически обновляет GSAP-анимацию — требуется инициализация
анимации после изменения DOM.GSAP анимации часто зависят от состояния приложения. Использование реактивных данных позволяет синхронизировать визуальные эффекты с изменениями состояния.
Пример реактивной анимации в Vue 3:
import { ref, watch, onMounted } from 'vue';
import { gsap } from 'gsap';
export default {
setup() {
const isActive = ref(false);
const box = ref(null);
onMounted(() => {
watch(isActive, (newVal) => {
if (newVal) {
gsap.to(box.value, { scale: 1.5, duration: 0.5 });
} else {
gsap.to(box.value, { scale: 1, duration: 0.5 });
}
});
});
return { isActive, box };
}
}
Ключевые моменты:
gsap.timeline(), чтобы комбинировать
несколько эффектов.gsap.timeline с refgsap.timeline() позволяет создавать последовательности
анимаций, которые реагируют на события или изменения состояния.
import { ref, onMounted } from 'vue';
import { gsap } from 'gsap';
export default {
setup() {
const box = ref(null);
onMounted(() => {
const tl = gsap.timeline({ defaults: { duration: 1 } });
tl.to(box.value, { x: 100 })
.to(box.value, { y: 50 })
.to(box.value, { rotation: 45 });
});
return { box };
}
}
Преимущества использования
timeline:
При работе с реактивными компонентами важно учитывать, что DOM может меняться после перерендеринга, а GSAP хранит ссылки на старые узлы.
Рекомендации:
onMounted или
nextTick в Vue для доступа к DOM после
рендера.useLayoutEffect, чтобы гарантировать
наличие DOM перед анимацией.Для списка элементов, создаваемых через v-for или
map, важно правильно обращаться к каждому
ref:
import { ref, onMounted } from 'vue';
import { gsap } from 'gsap';
export default {
setup() {
const boxes = ref([]);
onMounted(() => {
boxes.value.forEach((el, i) => {
gsap.to(el, { y: i * 20, duration: 0.5 });
});
});
return { boxes };
}
}
Замечания:
boxes должен содержать массив
DOM-элементов.stagger для удобного
эффекта последовательного появления:gsap.to(boxes.value, { y: 50, duration: 1, stagger: 0.2 });
Для динамических интерфейсов часто возникает ситуация, когда
ref указывает на элемент, который
перерисовывается. GSAP не будет автоматически
отслеживать новый DOM. В таких случаях используют:
watch или watchEffect для обновления
анимации.key для принудительного пересоздания элемента в
Vue.useEffect с зависимостями в React.Пример Vue с повторным рендером:
watch(items, () => {
gsap.fromTo(
boxes.value,
{ opacity: 0 },
{ opacity: 1, duration: 0.5, stagger: 0.1 }
);
});
Эта практика обеспечивает синхронизацию состояния и анимаций без конфликтов.
ref и реактивностьюref предоставляет доступ к реальным DOM-узлам для
GSAP.onMounted, useLayoutEffect).watch,
watchEffect или useEffect.stagger или
циклы по ref-массива.GSAP и реактивные фреймворки отлично дополняют друг друга, если
соблюдаются правила работы с ref и реактивными данными.