Skip to content

Commit e8b6ca8

Browse files
committed
refactor slider functions
1 parent 90cc560 commit e8b6ca8

File tree

2 files changed

+69
-39
lines changed

2 files changed

+69
-39
lines changed

projects/slider/src/lib/slider.component.html

+7-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@ <h2 *ngIf="slide.title" [innerHtml]="slide.title" [class.h2-no-button]="!slide.b
1919

2020
<section class="bullet-container">
2121
<span class="bullet" *ngFor="let x of slides; index as i;"
22-
[class.square]="squareBullets"
23-
[class.active]="i+1==currentSlidePos" (click)="setSlideWidthAnimation(i+1)"></span>
22+
[class.square]="option.bulletType===bulletType.SQUARE"
23+
[class.active]="i+1==currentSlidePos"
24+
(click)="bulletSetSlide(i+1)"
25+
(mouseenter)="bulletMouseEnter($event)"
26+
(mouseleave)="bulletMouseLeave()"
27+
(touchstart)="bulletTouchStart($event)"
28+
(touchend)="bulletTouchEnd()"></span>
2429
</section>

projects/slider/src/lib/slider.component.ts

+62-37
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import { ISliderEvent } from './models/ISliderEvent';
1010
import { IOptions } from './models/IOptions';
1111
import { BulletType } from './models/bullet-type.enum';
1212

13+
const isMobile = navigator.userAgent.match(
14+
/(iPhone|iPod|iPad|Android|webOS|BlackBerry|IEMobile|Opera Mini)/i);
15+
1316
@Component({
1417
selector: 'lib-slider',
1518
templateUrl: './slider.component.html',
@@ -18,19 +21,22 @@ import { BulletType } from './models/bullet-type.enum';
1821
export class SliderComponent implements AfterViewInit, OnDestroy {
1922

2023
@Input() slides: ISlide[];
21-
@Input() squareBullets: boolean;
2224
@Input() option: IOptions = { animationType: null, bulletType: BulletType.CIRCLE };
2325
@Output() clickButton: EventEmitter<ISlide> = new EventEmitter<ISlide>();
2426

2527
@ViewChild('sliderSection') sliderSection: ElementRef;
2628

2729
sliderContainerElement: HTMLElement;
28-
isDragging: boolean = false;
2930
posSlider: ISliderEvent = {};
30-
lastScrollLeft: number = 0;
31-
slidesNumber: number = 4;
31+
32+
slidesNumber: number;
3233
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;
3440

3541
movementInterval: number;
3642

@@ -40,21 +46,43 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
4046
this.slidesNumber = this.slides.length;
4147
this.sliderContainerElement = this.sliderSection.nativeElement as HTMLElement;
4248
this.movementInterval = window.setInterval(() => {
43-
4449
}, 500);
4550
}
4651

4752
ngOnDestroy() {
4853
clearInterval(this.movementInterval);
4954
}
5055

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+
}
5886
}
5987

6088
clickEvent(slide: ISlide) {
@@ -63,21 +91,20 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
6391

6492
@HostListener('mousedown', ['$event']) onMouseDown(e: MouseEvent) {
6593
document.getSelection().empty();
66-
if (this.validateElementBullet(e)) {
67-
e.preventDefault();
68-
this.blocked = true;
94+
95+
if ((this.isOnBullet) || (this.isOnAnimation) || (isMobile)) {
6996
return;
7097
}
71-
this.blocked = false;
98+
99+
this.isDragEvent = true;
72100
this.isDragging = true;
73101
this.posSlider.posInitX = e.clientX;
74102
}
75103

76104
@HostListener('mousemove', ['$event']) mouseMove(e: MouseEvent) {
77-
if ((!this.isDragging) || (this.blocked)) {
105+
if ((!this.isDragging) || (this.isOnAnimation) || (isMobile)) {
78106
return;
79107
}
80-
81108
const width = this.sliderContainerElement.scrollWidth - this.sliderContainerElement.clientWidth;
82109
const newScrollLeftPosition = this.sliderContainerElement.scrollLeft - e.movementX;
83110

@@ -87,7 +114,7 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
87114
}
88115

89116
@HostListener('window:mouseup', ['$event']) onMouseUp(e: MouseEvent) {
90-
if (this.blocked) {
117+
if ((this.isOnAnimation) || (isMobile)) {
91118
return;
92119
}
93120
this.isDragging = false;
@@ -98,16 +125,18 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
98125

99126
@HostListener('touchstart', ['$event']) onTouchStart(e) {
100127
document.getSelection().empty();
101-
if (this.blocked) {
128+
if ((this.isOnBullet) || (this.isOnAnimation)) {
102129
return;
103130
}
131+
132+
this.isDragEvent = true;
104133
this.isDragging = true;
105134
this.posSlider.posInitX = e.touches[0].clientX;
106135
this.posSlider.scrollInit = this.sliderContainerElement.scrollLeft;
107136
}
108137

109138
@HostListener('touchmove', ['$event']) onTouchMove(e) {
110-
if ((!this.isDragging) || (this.blocked)) {
139+
if ((!this.isDragging) || (this.isOnAnimation)) {
111140
return;
112141
}
113142

@@ -121,15 +150,19 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
121150
}
122151
}
123152

124-
@HostListener('window:touchend', ['$event']) onTouchEnd(e) {
125-
if ((this.blocked) || (this.validateElementBullet(e))) {
153+
@HostListener('touchend', ['$event']) onTouchEnd(e) {
154+
if (this.isOnAnimation) {
126155
return;
127156
}
128157
this.isDragging = false;
129158
this.move();
130159
}
131160

132161
private move() {
162+
if ((!this.isDragEvent) || (this.isOnAnimation)) {
163+
return;
164+
}
165+
133166
const minMovement = this.sliderContainerElement.clientWidth * 0.18;
134167

135168
if (Math.abs(this.posSlider.posEndX - this.posSlider.posInitX) < minMovement) {
@@ -144,7 +177,10 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
144177
}
145178
}
146179

180+
181+
147182
setSlideWidthAnimation(slideEnd) {
183+
this.isOnAnimation = true;
148184
let t = 0;
149185
const posInit = this.sliderContainerElement.scrollLeft;
150186
const posEnd = this.sliderContainerElement.clientWidth * (slideEnd - 1);
@@ -154,7 +190,8 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
154190
if (t > 380) {
155191
this.sliderContainerElement.scrollLeft = posEnd;
156192
this.currentSlidePos = slideEnd;
157-
this.blocked = false;
193+
this.isOnAnimation = false;
194+
this.isDragEvent = false;
158195
clearInterval(interval);
159196
}
160197
position = this.easeOutSine(t, posInit, c, 380);
@@ -167,16 +204,4 @@ export class SliderComponent implements AfterViewInit, OnDestroy {
167204
return c * Math.sin(t / d * (Math.PI / 2)) + b;
168205
}
169206

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-
182207
}

0 commit comments

Comments
 (0)