@@ -10,6 +10,9 @@ import { ISliderEvent } from './models/ISliderEvent';
10
10
import { IOptions } from './models/IOptions' ;
11
11
import { BulletType } from './models/bullet-type.enum' ;
12
12
13
+ const isMobile = navigator . userAgent . match (
14
+ / ( i P h o n e | i P o d | i P a d | A n d r o i d | w e b O S | B l a c k B e r r y | I E M o b i l e | O p e r a M i n i ) / i) ;
15
+
13
16
@Component ( {
14
17
selector : 'lib-slider' ,
15
18
templateUrl : './slider.component.html' ,
@@ -18,19 +21,22 @@ import { BulletType } from './models/bullet-type.enum';
18
21
export class SliderComponent implements AfterViewInit , OnDestroy {
19
22
20
23
@Input ( ) slides : ISlide [ ] ;
21
- @Input ( ) squareBullets : boolean ;
22
24
@Input ( ) option : IOptions = { animationType : null , bulletType : BulletType . CIRCLE } ;
23
25
@Output ( ) clickButton : EventEmitter < ISlide > = new EventEmitter < ISlide > ( ) ;
24
26
25
27
@ViewChild ( 'sliderSection' ) sliderSection : ElementRef ;
26
28
27
29
sliderContainerElement : HTMLElement ;
28
- isDragging : boolean = false ;
29
30
posSlider : ISliderEvent = { } ;
30
- lastScrollLeft : number = 0 ;
31
- slidesNumber : number = 4 ;
31
+
32
+ slidesNumber : number ;
32
33
currentSlidePos : number = 1 ;
33
- blocked : boolean = false ;
34
+ isOnBullet : boolean = false ;
35
+ isOnAnimation : boolean = false ;
36
+ isDragEvent : boolean = true ;
37
+ isDragging : boolean = false ;
38
+
39
+ bulletType = BulletType ;
34
40
35
41
movementInterval : number ;
36
42
@@ -40,21 +46,43 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
40
46
this . slidesNumber = this . slides . length ;
41
47
this . sliderContainerElement = this . sliderSection . nativeElement as HTMLElement ;
42
48
this . movementInterval = window . setInterval ( ( ) => {
43
-
44
49
} , 500 ) ;
45
50
}
46
51
47
52
ngOnDestroy ( ) {
48
53
clearInterval ( this . movementInterval ) ;
49
54
}
50
55
51
- setSlide ( numberSlide : number ) {
52
- const width = this . sliderContainerElement . clientWidth ;
53
- this . sliderContainerElement . scrollLeft = width * ( numberSlide - 1 ) ;
54
- this . currentSlidePos = numberSlide ;
55
- setTimeout ( ( ) => {
56
- this . blocked = false ;
57
- } , 200 ) ;
56
+ bulletMouseEnter ( e : Event ) {
57
+ if ( ! isMobile ) {
58
+ e . stopPropagation ( ) ;
59
+ this . isOnBullet = true ;
60
+ }
61
+ }
62
+
63
+ bulletMouseLeave ( ) {
64
+ if ( ! isMobile ) {
65
+ this . isOnBullet = false ;
66
+ }
67
+ }
68
+
69
+ bulletTouchStart ( e : Event ) {
70
+ if ( isMobile ) {
71
+ e . stopPropagation ( ) ;
72
+ this . isOnBullet = true ;
73
+ }
74
+ }
75
+
76
+ bulletTouchEnd ( ) {
77
+ if ( isMobile ) {
78
+ this . isOnBullet = false ;
79
+ }
80
+ }
81
+
82
+ bulletSetSlide ( slideEnd : number ) {
83
+ if ( ! this . isOnAnimation ) {
84
+ this . setSlideWidthAnimation ( slideEnd ) ;
85
+ }
58
86
}
59
87
60
88
clickEvent ( slide : ISlide ) {
@@ -63,21 +91,20 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
63
91
64
92
@HostListener ( 'mousedown' , [ '$event' ] ) onMouseDown ( e : MouseEvent ) {
65
93
document . getSelection ( ) . empty ( ) ;
66
- if ( this . validateElementBullet ( e ) ) {
67
- e . preventDefault ( ) ;
68
- this . blocked = true ;
94
+
95
+ if ( ( this . isOnBullet ) || ( this . isOnAnimation ) || ( isMobile ) ) {
69
96
return ;
70
97
}
71
- this . blocked = false ;
98
+
99
+ this . isDragEvent = true ;
72
100
this . isDragging = true ;
73
101
this . posSlider . posInitX = e . clientX ;
74
102
}
75
103
76
104
@HostListener ( 'mousemove' , [ '$event' ] ) mouseMove ( e : MouseEvent ) {
77
- if ( ( ! this . isDragging ) || ( this . blocked ) ) {
105
+ if ( ( ! this . isDragging ) || ( this . isOnAnimation ) || ( isMobile ) ) {
78
106
return ;
79
107
}
80
-
81
108
const width = this . sliderContainerElement . scrollWidth - this . sliderContainerElement . clientWidth ;
82
109
const newScrollLeftPosition = this . sliderContainerElement . scrollLeft - e . movementX ;
83
110
@@ -87,7 +114,7 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
87
114
}
88
115
89
116
@HostListener ( 'window:mouseup' , [ '$event' ] ) onMouseUp ( e : MouseEvent ) {
90
- if ( this . blocked ) {
117
+ if ( ( this . isOnAnimation ) || ( isMobile ) ) {
91
118
return ;
92
119
}
93
120
this . isDragging = false ;
@@ -98,16 +125,18 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
98
125
99
126
@HostListener ( 'touchstart' , [ '$event' ] ) onTouchStart ( e ) {
100
127
document . getSelection ( ) . empty ( ) ;
101
- if ( this . blocked ) {
128
+ if ( ( this . isOnBullet ) || ( this . isOnAnimation ) ) {
102
129
return ;
103
130
}
131
+
132
+ this . isDragEvent = true ;
104
133
this . isDragging = true ;
105
134
this . posSlider . posInitX = e . touches [ 0 ] . clientX ;
106
135
this . posSlider . scrollInit = this . sliderContainerElement . scrollLeft ;
107
136
}
108
137
109
138
@HostListener ( 'touchmove' , [ '$event' ] ) onTouchMove ( e ) {
110
- if ( ( ! this . isDragging ) || ( this . blocked ) ) {
139
+ if ( ( ! this . isDragging ) || ( this . isOnAnimation ) ) {
111
140
return ;
112
141
}
113
142
@@ -121,15 +150,19 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
121
150
}
122
151
}
123
152
124
- @HostListener ( 'window: touchend' , [ '$event' ] ) onTouchEnd ( e ) {
125
- if ( ( this . blocked ) || ( this . validateElementBullet ( e ) ) ) {
153
+ @HostListener ( 'touchend' , [ '$event' ] ) onTouchEnd ( e ) {
154
+ if ( this . isOnAnimation ) {
126
155
return ;
127
156
}
128
157
this . isDragging = false ;
129
158
this . move ( ) ;
130
159
}
131
160
132
161
private move ( ) {
162
+ if ( ( ! this . isDragEvent ) || ( this . isOnAnimation ) ) {
163
+ return ;
164
+ }
165
+
133
166
const minMovement = this . sliderContainerElement . clientWidth * 0.18 ;
134
167
135
168
if ( Math . abs ( this . posSlider . posEndX - this . posSlider . posInitX ) < minMovement ) {
@@ -144,7 +177,10 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
144
177
}
145
178
}
146
179
180
+
181
+
147
182
setSlideWidthAnimation ( slideEnd ) {
183
+ this . isOnAnimation = true ;
148
184
let t = 0 ;
149
185
const posInit = this . sliderContainerElement . scrollLeft ;
150
186
const posEnd = this . sliderContainerElement . clientWidth * ( slideEnd - 1 ) ;
@@ -154,7 +190,8 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
154
190
if ( t > 380 ) {
155
191
this . sliderContainerElement . scrollLeft = posEnd ;
156
192
this . currentSlidePos = slideEnd ;
157
- this . blocked = false ;
193
+ this . isOnAnimation = false ;
194
+ this . isDragEvent = false ;
158
195
clearInterval ( interval ) ;
159
196
}
160
197
position = this . easeOutSine ( t , posInit , c , 380 ) ;
@@ -167,16 +204,4 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
167
204
return c * Math . sin ( t / d * ( Math . PI / 2 ) ) + b ;
168
205
}
169
206
170
- private validateElementBullet ( e : Event ) : boolean {
171
- if ( e . target ) {
172
- const element = e . target as HTMLElement ;
173
- if ( ( element . className === 'bullet' ) || ( element . className === 'bullet-container' )
174
- || ( element . className === 'bullet active' ) || ( element . className === 'bullet square' )
175
- || ( element . className === 'bullet square active' ) ) {
176
- return true ;
177
- }
178
- }
179
- return false ;
180
- }
181
-
182
207
}
0 commit comments