Source: src/Parallax.ts

  1. import Flicking, { FlickingEvent, Plugin } from "@egjs/flicking";
  2. /**
  3. * You can apply parallax effect while panel is moving.
  4. * @ko 패널들을 움직이면서 parallax 효과를 부여할 수 있습니다.
  5. * @memberof eg.Flicking.plugins
  6. */
  7. class Parallax implements Plugin {
  8. /**
  9. * @param - Selector of the element to apply parallax effect <ko> Parallax 효과를 적용할 엘리먼트의 선택자 </ko>
  10. * @param - Effect amplication scale <ko>효과 증폭도</ko>
  11. * @example
  12. * flicking.addPlugins(new eg.Flicking.plugins.Parallax("img", 1));
  13. */
  14. constructor(private selector: string = "", private scale: number = 1) {}
  15. public init(flicking: Flicking): void {
  16. flicking.on("move", this.onMove);
  17. this.move(flicking);
  18. }
  19. public update(flicking: Flicking): void {
  20. this.move(flicking);
  21. }
  22. public destroy(flicking: Flicking): void {
  23. flicking.off("move", this.onMove);
  24. }
  25. private onMove = (e: FlickingEvent): void => {
  26. this.move(e.currentTarget);
  27. }
  28. private move(flicking: Flicking): void {
  29. const panels = flicking.getVisiblePanels();
  30. panels.forEach(panel => {
  31. const progress = panel.getOutsetProgress();
  32. const el = panel.getElement();
  33. const target = el.querySelector<HTMLElement>(this.selector)!;
  34. const parentTarget = target.parentNode as Element;
  35. const rect = target.getBoundingClientRect();
  36. const parentRect = parentTarget.getBoundingClientRect();
  37. const position = (parentRect.width - rect.width) / 2 * progress * this.scale;
  38. const transform = `translate(-50%) translate(${position}px)`;
  39. const style = target.style;
  40. style.cssText += `transform: ${transform};-webkit-transform: ${transform};-ms-transform:${transform}`;
  41. });
  42. }
  43. }
  44. export default Parallax;
comments powered by Disqus