swiper-mouseover 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -44,7 +44,8 @@ or use CDN:
44
44
  const swiper = new Swiper('.mySwiper', {
45
45
  modules: [MouseoverPlugin],
46
46
  mouseover: {
47
- el: '.swiper-mouseover'
47
+ el: '.swiper-mouseover',
48
+ reset: true // reset to first slide on mouseout
48
49
  }
49
50
  });
50
51
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swiper-mouseover",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "Mouseover plugin for Swiper",
5
5
  "files": [
6
6
  "swiper-mouseover.js",
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Swiper-Mouseover v2.0.1 for Swiper (https://github.com/fibit/swiper-mouseover)
2
+ * Swiper-Mouseover v2.1.0 for Swiper (https://github.com/fibit/swiper-mouseover)
3
3
  * Author Pavel Romanov
4
4
  * Released under the MIT License
5
5
  */
@@ -1,63 +1,93 @@
1
1
  /**
2
- * Swiper-Mouseover v2.0.1 for Swiper (https://github.com/fibit/swiper-mouseover)
2
+ * Swiper-Mouseover v2.1.0 for Swiper (https://github.com/fibit/swiper-mouseover)
3
3
  * Author Pavel Romanov
4
4
  * Released under the MIT License
5
5
  */
6
6
  function MouseoverPlugin({ swiper, extendParams, on }) {
7
+ const CLASS_LAYER = 'swiper-mouseover-layer';
8
+
7
9
  extendParams({
8
10
  mouseover: {
9
- el: null
11
+ el: null,
12
+ reset: true
10
13
  }
11
14
  });
12
15
 
16
+ const resolveElement = (selector) => {
17
+ return typeof selector === 'string'
18
+ ? document.querySelector(selector)
19
+ : selector;
20
+ };
21
+
22
+ const isTouchDevice = () => 'ontouchstart' in window;
23
+
24
+ const createMouseHandler = (slideToIndex) => function(slideIndex) {
25
+ return function() {
26
+ swiper.slideTo(slideToIndex ?? slideIndex, swiper.params.speed);
27
+ };
28
+ };
29
+
30
+ const cleanupLayers = (container) => {
31
+ const layers = container.querySelectorAll(`.${CLASS_LAYER}`);
32
+ layers.forEach(layer => {
33
+ const mouseOverHandler = layer._mouseOverHandler;
34
+ const mouseOutHandler = layer._mouseOutHandler;
35
+
36
+ if (mouseOverHandler) {
37
+ layer.removeEventListener('mouseover', mouseOverHandler);
38
+ }
39
+ if (mouseOutHandler) {
40
+ layer.removeEventListener('mouseout', mouseOutHandler);
41
+ }
42
+
43
+ delete layer._mouseOverHandler;
44
+ delete layer._mouseOutHandler;
45
+ });
46
+ container.innerHTML = '';
47
+ };
48
+
49
+ const createLayers = (container) => {
50
+ swiper.snapGrid.forEach((_, index) => {
51
+ const layer = document.createElement('div');
52
+ layer.className = CLASS_LAYER;
53
+ container.appendChild(layer);
54
+
55
+ const mouseOverHandler = createMouseHandler()(index);
56
+ layer._mouseOverHandler = mouseOverHandler;
57
+ layer.addEventListener('mouseover', mouseOverHandler);
58
+
59
+ if (swiper.params.mouseover.reset) {
60
+ const mouseOutHandler = createMouseHandler(0)(index);
61
+ layer._mouseOutHandler = mouseOutHandler;
62
+ layer.addEventListener('mouseout', mouseOutHandler);
63
+ }
64
+ });
65
+ };
66
+
13
67
  const initMouseover = () => {
14
68
  const { el } = swiper.params.mouseover;
15
-
16
69
  if (!el) return;
17
70
 
18
- const mouseoverEl = typeof el === 'string'
19
- ? document.querySelector(el)
20
- : el;
21
-
71
+ const mouseoverEl = resolveElement(el);
22
72
  if (!mouseoverEl) return;
23
73
 
24
- if ('ontouchstart' in window) {
74
+ if (isTouchDevice()) {
25
75
  mouseoverEl.remove();
26
76
  return;
27
77
  }
28
78
 
29
- mouseoverEl.innerHTML = '';
30
-
31
- mouseoverEl.querySelectorAll('.swiper-mouseover-layer').forEach(el => {
32
- el.removeEventListener('mouseover', handleMouseOver);
33
- el.removeEventListener('mouseout', handleMouseOut);
34
- });
35
-
36
- for (let i = 0; i < swiper.snapGrid.length; i++) {
37
- const layer = document.createElement('div');
38
- layer.className = 'swiper-mouseover-layer';
39
- layer.setAttribute('data-swiper-slide-index', i);
40
- mouseoverEl.appendChild(layer);
41
- layer.addEventListener('mouseover', handleMouseOver);
42
- layer.addEventListener('mouseout', handleMouseOut);
43
- }
44
-
45
- function handleMouseOver() {
46
- const slideIndex = parseInt(this.getAttribute('data-swiper-slide-index'));
47
- swiper.slideTo(slideIndex, swiper.params.speed);
48
- }
49
-
50
- function handleMouseOut() {
51
- swiper.slideTo(0, swiper.params.speed);
52
- }
79
+ cleanupLayers(mouseoverEl);
80
+ createLayers(mouseoverEl);
53
81
  };
54
82
 
55
- on('afterInit', initMouseover);
56
- on('destroy', () => {
83
+ const cleanup = () => {
57
84
  const { el } = swiper.params.mouseover;
58
85
  if (el) {
59
- const mouseoverEl = typeof el === 'string' ? document.querySelector(el) : el;
86
+ const mouseoverEl = resolveElement(el);
60
87
  if (mouseoverEl) mouseoverEl.remove();
61
88
  }
62
- });
63
- };
89
+ };
90
+
91
+ on('afterInit', initMouseover);
92
+ on('destroy', cleanup);
93
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Swiper-Mouseover v2.0.1 for Swiper (https://github.com/fibit/swiper-mouseover)
2
+ * Swiper-Mouseover v2.1.0 for Swiper (https://github.com/fibit/swiper-mouseover)
3
3
  * Author Pavel Romanov
4
4
  * Released under the MIT License
5
5
  */
@@ -1,6 +1,6 @@
1
1
  /**
2
- * Swiper-Mouseover v2.0.1 for Swiper (https://github.com/fibit/swiper-mouseover)
2
+ * Swiper-Mouseover v2.1.0 for Swiper (https://github.com/fibit/swiper-mouseover)
3
3
  * Author Pavel Romanov
4
4
  * Released under the MIT License
5
5
  */
6
- function MouseoverPlugin({swiper:e,extendParams:t,on:o}){t({mouseover:{el:null}});o("afterInit",(()=>{const{el:t}=e.params.mouseover;if(!t)return;const o="string"==typeof t?document.querySelector(t):t;if(o)if("ontouchstart"in window)o.remove();else{o.innerHTML="",o.querySelectorAll(".swiper-mouseover-layer").forEach((e=>{e.removeEventListener("mouseover",r),e.removeEventListener("mouseout",s)}));for(let t=0;t<e.snapGrid.length;t++){const e=document.createElement("div");e.className="swiper-mouseover-layer",e.setAttribute("data-swiper-slide-index",t),o.appendChild(e),e.addEventListener("mouseover",r),e.addEventListener("mouseout",s)}}function r(){const t=parseInt(this.getAttribute("data-swiper-slide-index"));e.slideTo(t,e.params.speed)}function s(){e.slideTo(0,e.params.speed)}})),o("destroy",(()=>{const{el:t}=e.params.mouseover;if(t){const e="string"==typeof t?document.querySelector(t):t;e&&e.remove()}}))}
6
+ function MouseoverPlugin({swiper:e,extendParams:r,on:t}){let o="swiper-mouseover-layer";r({mouseover:{el:null,reset:!0}});let s=e=>"string"==typeof e?document.querySelector(e):e,n=()=>"ontouchstart"in window,l=r=>function(t){return function(){e.slideTo(r??t,e.params.speed)}},u=e=>{let r=e.querySelectorAll(`.${o}`);r.forEach(e=>{let r=e._mouseOverHandler,t=e._mouseOutHandler;r&&e.removeEventListener("mouseover",r),t&&e.removeEventListener("mouseout",t),delete e._mouseOverHandler,delete e._mouseOutHandler}),e.innerHTML=""},a=r=>{e.snapGrid.forEach((t,s)=>{let n=document.createElement("div");n.className=o,r.appendChild(n);let u=l()(s);if(n._mouseOverHandler=u,n.addEventListener("mouseover",u),e.params.mouseover.reset){let a=l(0)(s);n._mouseOutHandler=a,n.addEventListener("mouseout",a)}})},m=()=>{let{el:r}=e.params.mouseover;if(!r)return;let t=s(r);if(t){if(n()){t.remove();return}u(t),a(t)}},i=()=>{let{el:r}=e.params.mouseover;if(r){let t=s(r);t&&t.remove()}};t("afterInit",m),t("destroy",i)}