ScrollMagic предоставляет мощный API для управления анимациями и взаимодействиями на основе прокрутки. Однако стандартного функционала часто оказывается недостаточно для сложных проектов. В таких случаях применяется создание кастомных методов — расширений, позволяющих адаптировать библиотеку под конкретные задачи.
ScrollMagic построен на прототипной модели JavaScript, что позволяет расширять его классы:
ScrollMagic.ControllerScrollMagic.SceneДобавление методов возможно через прототип:
ScrollMagic.Scene.prototype.myCustomMethod = function() {
// логика
return this;
};
Ключевой момент — сохранение цепочки вызовов
(return this), чтобы не нарушить fluent API.
ScrollMagic.Scene.prototype.logState = function() {
this.on("enter leave", function(event) {
console.log("Scene state:", event.type);
});
return this;
};
Использование:
new ScrollMagic.Scene({
triggerElement: "#trigger"
})
.logState()
.addTo(controller);
Особенности:
enter и leaveИногда требуется изменить поведение встроенных методов.
addIndicatorsconst originalAddIndicators = ScrollMagic.Scene.prototype.addIndicators;
ScrollMagic.Scene.prototype.addIndicators = function(options) {
console.log("Добавление индикаторов");
return originalAddIndicators.call(this, options);
};
Особенности:
call для передачи контекстаScrollMagic.Scene.prototype.fadeIn = function(duration = 0.5) {
this.on("enter", function() {
TweenMax.to(this.triggerElement(), duration, { opacity: 1 });
});
return this;
};
Преимущества:
Контроллер управляет сценами, и его расширение позволяет централизовать поведение.
ScrollMagic.Controller.prototype.removeAllScenes = function() {
this.info("scenes").forEach(scene => scene.destroy(true));
};
Использование:
controller.removeAllScenes();
ScrollMagic.Controller.prototype.syncScenes = function(scenes) {
scenes.forEach(scene => {
scene.on("progress", function(event) {
scenes.forEach(otherScene => {
if (otherScene !== scene) {
otherScene.progress(event.progress);
}
});
});
});
};
Особенности:
Кастомные методы могут быть оформлены как плагины.
(function() {
ScrollMagic.Scene.prototype.highlight = function(className = "active") {
this.on("enter", function() {
this.triggerElement().classList.add(className);
});
this.on("leave", function() {
this.triggerElement().classList.remove(className);
});
return this;
};
})();
Преимущества:
ScrollMagic активно использует chaining:
scene
.setPin("#element")
.setTween(tween)
.addIndicators();
Кастомные методы должны поддерживать эту концепцию:
ScrollMagic.Scene.prototype.custom = function() {
// логика
return this;
};
Если метод возвращает не this, цепочка разрывается.
ScrollMagic.Scene.prototype.setData = function(key, value) {
if (!this._customData) {
this._customData = {};
}
this._customData[key] = value;
return this;
};
ScrollMagic.Scene.prototype.getData = function(key) {
return this._customData ? this._customData[key] : undefined;
};
Использование:
scene.setData("visited", true);
console.log(scene.getData("visited"));
ScrollMagic использует событийную модель:
enterleaveprogressstartendScrollMagic.Scene.prototype.onProgress Log = function() {
this.on("progress", function(event) {
console.log("Progress:", event.progress);
});
return this;
};
Кастомные методы могут вызывать другие методы:
ScrollMagic.Scene.prototype.fadeInWithLog = function() {
return this
.fadeIn()
.logState();
};
Преимущества:
При создании кастомных методов важно учитывать:
destroy)ScrollMagic.Scene.prototype.cacheElement = function() {
this._el = this.triggerElement();
return this;
};
1. Потеря контекста
this.triggerElement // функция
this.triggerElement() // правильный вызов
2. Нарушение цепочки
return; // ошибка
return this; // правильно
3. Повторное навешивание событий
this.on("enter", handler); // при каждом вызове метода добавляется новый обработчик
Решение — проверка:
if (!this._hasHandler) {
this.on("enter", handler);
this._hasHandler = true;
}
Рекомендуется выносить кастомные методы в отдельные файлы:
/scrollmagic/
custom/
scene.extensions.js
controller.extensions.js
Подключение:
<script src="scrollmagic.min.js"></script>
<script src="scene.extensions.js"></script>
Проверяются:
Пример:
const scene = new ScrollMagic.Scene();
console.assert(scene.custom() === scene, "Метод должен возвращать this");
Кастомные методы особенно полезны в следующих сценариях:
При масштабировании проекта:
Пример:
ScrollMagic.Scene.prototype.ui = {};
ScrollMagic.Scene.prototype.ui.fadeIn = function() {
// ...
};
Альтернатива прототипам — создание оберток:
class CustomScene {
constructor(scene) {
this.scene = scene;
}
fadeIn() {
this.scene.on("enter", () => {
// ...
});
return this;
}
}
Преимущества:
Кастомные методы превращают ScrollMagic из библиотеки в полноценный инструмент разработки, позволяя: