Одной из наиболее частых проблем при работе с ScrollMagic является некорректное позиционирование элементов на странице. ScrollMagic управляет триггерами анимации относительно позиции скролла и родительских контейнеров, поэтому понимание основ позиционирования в CSS становится критическим.
position: absolute и
relativeЭлементы с position: absolute позиционируются
относительно ближайшего предка с position: relative,
absolute или fixed. Если такой предок
отсутствует, координаты рассчитываются относительно всего документа. В
ScrollMagic это часто вызывает неожиданные смещения:
.scene-element {
position: absolute;
top: 100px;
}
Если .scene-element находится внутри контейнера без
position: relative, то ScrollMagic будет считать его
положение от верхнего края документа, а не от контейнера. Это ведет к
неверной синхронизации анимаций со скроллом.
Решение: всегда задавать родителю
position: relative, если элементы внутри сцены
позиционируются абсолютно.
.scene-container {
position: relative;
}
triggerElementПри создании сцены ScrollMagic сцена может срабатывать раньше или
позже ожидаемого момента, если triggerElement выбран
неправильно. Частые ошибки:
display: none. ScrollMagic не может корректно вычислить его
координаты.var scene = new ScrollMagic.Scene({
triggerElement: "#start-animation",
duration: 300
})
.setTween(tween)
.addTo(controller);
Если #start-animation имеет display: none
на момент инициализации, сцена будет неправильно вычислена.
Правило: элементы-триггеры должны быть видимыми и иметь стабильные размеры на момент инициализации ScrollMagic.
pin и position: fixedPinning позволяет “закрепить” элемент на экране на время сцены.
Основная ошибка — попытка закрепить элемент, который уже имеет
position: fixed.
var scene = new ScrollMagic.Scene({
triggerElement: "#pin-element",
duration: 500
})
.setPin("#pin-element")
.addTo(controller);
Элемент с position: fixed игнорирует скролл-контейнер и
ведет себя непредсказуемо. В результате можно наблюдать прыжки или
смещения контента.
Рекомендация: элементы для pinning должны иметь
position: relative или absolute, но не
fixed.
ScrollMagic рассчитывает координаты относительно
документа, а не относительно внутреннего скролла
контейнера (overflow: auto). Частая ошибка — попытка
привязать анимацию к элементу внутри скроллируемого блока.
.scroll-container {
overflow-y: auto;
height: 400px;
}
var scene = new ScrollMagic.Scene({
triggerElement: ".inner-element",
triggerHook: 0.5
})
.setTween(tween)
.addTo(controller);
В этом случае ScrollMagic будет считать позицию
.inner-element от всего документа, а не от
.scroll-container.
Решение: использовать container при
создании контроллера:
var controller = new ScrollMagic.Controller({
container: ".scroll-container"
});
offset и
triggerHookoffset и triggerHook определяют точку, где
сцена активируется. Неправильное их использование приводит к смещению
анимации:
offset — смещение относительно позиции триггера.triggerHook — точка на экране, где срабатывает сцена (0
— верх, 1 — низ, 0.5 — середина).Частая ошибка: задавать большой offset для элементов с
динамической высотой. Если высота родителя меняется после загрузки
контента, сцена срабатывает не в том месте.
ScrollMagic хорошо работает с top, left,
margin, но если элемент уже имеет CSS-трансформации
(transform: translate, scale,
rotate), расчет координат может сбиваться. Особенно это
актуально для pinning.
Рекомендация: перед использованием pin и анимаций убедиться, что трансформации не конфликтуют с позиционированием.
Изменение ширины и высоты окна или скрытие элементов через media queries часто ломает позицию триггеров.
refresh() контроллера после изменения DOM
помогает корректно пересчитать позиции:controller.update(true);
Ключевые моменты:
position родителей для абсолютных
элементов.position: fixed.container
в контроллере.offset, triggerHook
и CSS-трансформации.Эти принципы позволяют избежать большинства типичных ошибок позиционирования при работе с ScrollMagic и обеспечивают предсказуемое поведение анимаций.