import Flicking, { EVENTS, Plugin } from "@egjs/flicking";
/**
* You can apply parallax effect while panel is moving.
* @ko 패널들을 움직이면서 parallax 효과를 부여할 수 있습니다.
* @memberof Flicking.Plugins
*/
class Parallax implements Plugin {
private _flicking: Flicking | null;
/* Options */
private _selector: string;
private _scale: number;
public get selector() { return this._selector; }
public get scale() { return this._scale; }
public set selector(val: string) { this._selector = val; }
public set scale(val: number) { this._scale = val; }
/**
* @param {string} selector Selector of the element to apply parallax effect Parallax 효과를 적용할 엘리먼트의 선택자
* @param {number} scale Effect amplication scale효과 증폭도
* @example
* ```ts
* flicking.addPlugins(new Parallax("img", 1));
* ```
*/
public constructor(selector = "", scale = 1) {
this._flicking = null;
this._selector = selector;
this._scale = scale;
}
public init(flicking: Flicking): void {
if (this._flicking) {
this.destroy();
}
this._flicking = flicking;
flicking.on(EVENTS.MOVE, this._onMove);
flicking.on(EVENTS.AFTER_RESIZE, this.update);
this._onMove();
}
public destroy(): void {
if (!this._flicking) return;
this._flicking.off(EVENTS.MOVE, this._onMove);
this._flicking.off(EVENTS.AFTER_RESIZE, this.update);
this._flicking = null;
}
public update = (): void => {
this._onMove();
};
private _onMove = (): void => {
const flicking = this._flicking;
if (!flicking) return;
const panels = flicking.visiblePanels;
panels.forEach(panel => {
const progress = panel.outsetProgress;
const el = panel.element;
const target = this._selector ? el.querySelector(this._selector)! : el;
const parentTarget = target.parentNode as Element;
const rect = target.getBoundingClientRect();
const parentRect = parentTarget.getBoundingClientRect();
const position = (parentRect.width - rect.width) / 2 * progress * this._scale;
const transform = `translate(-50%) translate(${position}px)`;
const style = target.style;
style.cssText += `transform: ${transform};-webkit-transform: ${transform};-ms-transform:${transform}`;
});
};
}
export default Parallax;