1
1
// Angular
2
2
import {
3
- Component , OnInit , Input , ElementRef , EventEmitter ,
4
- ViewChild , AfterViewInit , HostListener , Output
3
+ Component , Input , ElementRef , EventEmitter ,
4
+ ViewChild , AfterViewInit , HostListener , Output , OnDestroy
5
5
} from '@angular/core' ;
6
6
7
7
// Models
8
8
import { ISlide } from './models/ISlide' ;
9
9
import { ISliderEvent } from './models/ISliderEvent' ;
10
10
import { IOptions } from './models/IOptions' ;
11
+ import { BulletType } from './models/bullet-type.enum' ;
11
12
12
13
@Component ( {
13
14
selector : 'lib-slider' ,
14
15
templateUrl : './slider.component.html' ,
15
16
styleUrls : [ './slider.component.scss' ]
16
17
} )
17
- export class SliderComponent implements OnInit , AfterViewInit {
18
+ export class SliderComponent implements AfterViewInit , OnDestroy {
18
19
19
20
@Input ( ) slides : ISlide [ ] ;
20
21
@Input ( ) squareBullets : boolean ;
21
- @Input ( ) option : IOptions = { animation : null } ;
22
- @Output ( ) clickButton : EventEmitter < any > = new EventEmitter < any > ( ) ;
22
+ @Input ( ) option : IOptions = { animationType : null , bulletType : BulletType . CIRCLE } ;
23
+ @Output ( ) clickButton : EventEmitter < ISlide > = new EventEmitter < ISlide > ( ) ;
23
24
24
25
@ViewChild ( 'sliderSection' ) sliderSection : ElementRef ;
25
- sliderElement : HTMLElement ;
26
+
27
+ sliderContainerElement : HTMLElement ;
26
28
isDragging : boolean = false ;
27
29
posSlider : ISliderEvent = { } ;
28
30
lastScrollLeft : number = 0 ;
29
- slideNumber : number = 4 ;
31
+ slidesNumber : number = 4 ;
30
32
currentSlidePos : number = 1 ;
31
33
blocked : boolean = false ;
32
34
35
+ movementInterval : number ;
36
+
33
37
constructor ( ) { }
34
38
35
- ngOnInit ( ) {
39
+ ngAfterViewInit ( ) : void {
40
+ this . slidesNumber = this . slides . length ;
41
+ this . sliderContainerElement = this . sliderSection . nativeElement as HTMLElement ;
42
+ this . movementInterval = window . setInterval ( ( ) => {
43
+
44
+ } , 500 ) ;
36
45
}
37
46
38
- ngAfterViewInit ( ) : void {
39
- this . slideNumber = this . slides . length ;
40
- this . sliderElement = this . sliderSection . nativeElement as HTMLElement ;
47
+ ngOnDestroy ( ) {
48
+ clearInterval ( this . movementInterval ) ;
41
49
}
42
50
43
51
setSlide ( numberSlide : number ) {
44
- const width = this . sliderElement . clientWidth ;
45
- this . sliderElement . scrollLeft = width * ( numberSlide - 1 ) ;
52
+ const width = this . sliderContainerElement . clientWidth ;
53
+ this . sliderContainerElement . scrollLeft = width * ( numberSlide - 1 ) ;
46
54
this . currentSlidePos = numberSlide ;
47
55
setTimeout ( ( ) => {
48
56
this . blocked = false ;
@@ -70,25 +78,15 @@ export class SliderComponent implements OnInit, AfterViewInit {
70
78
return ;
71
79
}
72
80
73
- const width = this . sliderElement . scrollWidth - this . sliderElement . clientWidth ;
74
- const newScrollLeftPosition = this . sliderElement . scrollLeft - e . movementX ;
81
+ const width = this . sliderContainerElement . scrollWidth - this . sliderContainerElement . clientWidth ;
82
+ const newScrollLeftPosition = this . sliderContainerElement . scrollLeft - e . movementX ;
75
83
76
84
if ( ( newScrollLeftPosition >= 0 ) && ( newScrollLeftPosition <= width ) ) {
77
- this . sliderElement . scrollLeft = newScrollLeftPosition ;
85
+ this . sliderContainerElement . scrollLeft = newScrollLeftPosition ;
78
86
}
79
87
}
80
88
81
- @HostListener ( 'mouseout' , [ '$event' ] ) onMouseOut ( e : MouseEvent ) {
82
- if ( ( this . blocked ) || ( this . validateElementBullet ( e ) ) || ( e . relatedTarget == null )
83
- || ( ( e . relatedTarget as HTMLElement ) . className === 'bullet-container' )
84
- ) {
85
- return ;
86
- }
87
- this . isDragging = false ;
88
- this . setSlideWidthAnimation ( this . currentSlidePos ) ;
89
- }
90
-
91
- @HostListener ( 'mouseup' , [ '$event' ] ) onMouseUp ( e : MouseEvent ) {
89
+ @HostListener ( 'window:mouseup' , [ '$event' ] ) onMouseUp ( e : MouseEvent ) {
92
90
if ( this . blocked ) {
93
91
return ;
94
92
}
@@ -105,25 +103,25 @@ export class SliderComponent implements OnInit, AfterViewInit {
105
103
}
106
104
this . isDragging = true ;
107
105
this . posSlider . posInitX = e . touches [ 0 ] . clientX ;
108
- this . posSlider . scrollInit = this . sliderElement . scrollLeft ;
106
+ this . posSlider . scrollInit = this . sliderContainerElement . scrollLeft ;
109
107
}
110
108
111
109
@HostListener ( 'touchmove' , [ '$event' ] ) onTouchMove ( e ) {
112
110
if ( ( ! this . isDragging ) || ( this . blocked ) ) {
113
111
return ;
114
112
}
115
113
116
- const width = this . sliderElement . scrollWidth - this . sliderElement . clientWidth ;
114
+ const width = this . sliderContainerElement . scrollWidth - this . sliderContainerElement . clientWidth ;
117
115
const dif = e . touches [ 0 ] . clientX - this . posSlider . posInitX ;
118
116
this . posSlider . posEndX = e . touches [ 0 ] . clientX ;
119
117
const newScrollLeftPosition = this . posSlider . scrollInit - dif ;
120
118
121
119
if ( ( newScrollLeftPosition >= 0 ) && ( newScrollLeftPosition <= width ) ) {
122
- this . sliderElement . scrollLeft = newScrollLeftPosition ;
120
+ this . sliderContainerElement . scrollLeft = newScrollLeftPosition ;
123
121
}
124
122
}
125
123
126
- @HostListener ( 'touchend' , [ '$event' ] ) onTouchEnd ( e ) {
124
+ @HostListener ( 'window: touchend' , [ '$event' ] ) onTouchEnd ( e ) {
127
125
if ( ( this . blocked ) || ( this . validateElementBullet ( e ) ) ) {
128
126
return ;
129
127
}
@@ -132,14 +130,14 @@ export class SliderComponent implements OnInit, AfterViewInit {
132
130
}
133
131
134
132
private move ( ) {
135
- const minMovement = this . sliderElement . clientWidth * 0.18 ;
133
+ const minMovement = this . sliderContainerElement . clientWidth * 0.18 ;
136
134
137
135
if ( Math . abs ( this . posSlider . posEndX - this . posSlider . posInitX ) < minMovement ) {
138
136
this . setSlideWidthAnimation ( this . currentSlidePos ) ;
139
137
return ;
140
138
}
141
139
142
- if ( ( this . posSlider . posEndX < this . posSlider . posInitX ) && ( this . currentSlidePos < this . slideNumber ) ) {
140
+ if ( ( this . posSlider . posEndX < this . posSlider . posInitX ) && ( this . currentSlidePos < this . slidesNumber ) ) {
143
141
this . setSlideWidthAnimation ( this . currentSlidePos + 1 ) ;
144
142
} else if ( ( this . currentSlidePos > 1 ) && ( this . posSlider . posEndX > this . posSlider . posInitX ) ) {
145
143
this . setSlideWidthAnimation ( this . currentSlidePos - 1 ) ;
@@ -148,33 +146,33 @@ export class SliderComponent implements OnInit, AfterViewInit {
148
146
149
147
setSlideWidthAnimation ( slideEnd ) {
150
148
let t = 0 ;
151
- const posInit = this . sliderElement . scrollLeft ;
152
- const posEnd = this . sliderElement . clientWidth * ( slideEnd - 1 ) ;
149
+ const posInit = this . sliderContainerElement . scrollLeft ;
150
+ const posEnd = this . sliderContainerElement . clientWidth * ( slideEnd - 1 ) ;
153
151
const c = posEnd - posInit ;
154
152
let position = 0 ;
155
153
const interval = setInterval ( ( ) => {
156
154
if ( t > 380 ) {
157
- this . sliderElement . scrollLeft = posEnd ;
155
+ this . sliderContainerElement . scrollLeft = posEnd ;
158
156
this . currentSlidePos = slideEnd ;
159
157
this . blocked = false ;
160
158
clearInterval ( interval ) ;
161
159
}
162
160
position = this . easeOutSine ( t , posInit , c , 380 ) ;
163
- this . sliderElement . scrollLeft = position ;
161
+ this . sliderContainerElement . scrollLeft = position ;
164
162
t = t + 5 ;
165
163
} , 5 ) ;
166
164
}
167
165
168
- easeOutSine ( t , b , c , d ) {
166
+ easeOutSine ( t : number , b : number , c : number , d : number ) : number {
169
167
return c * Math . sin ( t / d * ( Math . PI / 2 ) ) + b ;
170
168
}
171
169
172
170
private validateElementBullet ( e : Event ) : boolean {
173
171
if ( e . target ) {
174
172
const element = e . target as HTMLElement ;
175
173
if ( ( element . className === 'bullet' ) || ( element . className === 'bullet-container' )
176
- || ( element . className === 'bullet active' ) || ( element . className === 'bullet square' )
177
- || ( element . className === 'bullet square active' ) ) {
174
+ || ( element . className === 'bullet active' ) || ( element . className === 'bullet square' )
175
+ || ( element . className === 'bullet square active' ) ) {
178
176
return true ;
179
177
}
180
178
}
0 commit comments