Skip to content

Commit 90cc560

Browse files
committed
fix button hover movement
1 parent 9447323 commit 90cc560

7 files changed

+56
-47
lines changed
+5-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
import { BulletType } from './bullet-type.enum';
2+
import { AnimationType } from './animation-type.enum';
3+
14
export interface IOptions {
2-
animation?: string;
5+
animationType?: AnimationType;
6+
bulletType?: BulletType;
37
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export enum AnimationType {
2+
FIXED = 'fixed'
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export enum BulletType {
2+
CIRCLE = 'circle',
3+
SQUARE = 'square'
4+
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<div [class]="(slide.className) ? 'slide ' + slide.className : 'slide'"
33
*ngFor="let slide of slides"
44
[style.background-image]="'url('+slide.img+')'"
5-
[style.background-attachment]="option.animation"
5+
[style.background-attachment]="option.animationType"
66
>
77
<span *ngIf="slide.html" [innerHtml]="slide.html"></span>
88
<h2 *ngIf="slide.title" [innerHtml]="slide.title" [class.h2-no-button]="!slide.button && !slide.description"></h2>

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

+38-40
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,56 @@
11
// Angular
22
import {
3-
Component, OnInit, Input, ElementRef, EventEmitter,
4-
ViewChild, AfterViewInit, HostListener, Output
3+
Component, Input, ElementRef, EventEmitter,
4+
ViewChild, AfterViewInit, HostListener, Output, OnDestroy
55
} from '@angular/core';
66

77
// Models
88
import { ISlide } from './models/ISlide';
99
import { ISliderEvent } from './models/ISliderEvent';
1010
import { IOptions } from './models/IOptions';
11+
import { BulletType } from './models/bullet-type.enum';
1112

1213
@Component({
1314
selector: 'lib-slider',
1415
templateUrl: './slider.component.html',
1516
styleUrls: ['./slider.component.scss']
1617
})
17-
export class SliderComponent implements OnInit, AfterViewInit {
18+
export class SliderComponent implements AfterViewInit, OnDestroy {
1819

1920
@Input() slides: ISlide[];
2021
@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>();
2324

2425
@ViewChild('sliderSection') sliderSection: ElementRef;
25-
sliderElement: HTMLElement;
26+
27+
sliderContainerElement: HTMLElement;
2628
isDragging: boolean = false;
2729
posSlider: ISliderEvent = {};
2830
lastScrollLeft: number = 0;
29-
slideNumber: number = 4;
31+
slidesNumber: number = 4;
3032
currentSlidePos: number = 1;
3133
blocked: boolean = false;
3234

35+
movementInterval: number;
36+
3337
constructor() { }
3438

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);
3645
}
3746

38-
ngAfterViewInit(): void {
39-
this.slideNumber = this.slides.length;
40-
this.sliderElement = this.sliderSection.nativeElement as HTMLElement;
47+
ngOnDestroy() {
48+
clearInterval(this.movementInterval);
4149
}
4250

4351
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);
4654
this.currentSlidePos = numberSlide;
4755
setTimeout(() => {
4856
this.blocked = false;
@@ -70,25 +78,15 @@ export class SliderComponent implements OnInit, AfterViewInit {
7078
return;
7179
}
7280

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;
7583

7684
if ((newScrollLeftPosition >= 0) && (newScrollLeftPosition <= width)) {
77-
this.sliderElement.scrollLeft = newScrollLeftPosition;
85+
this.sliderContainerElement.scrollLeft = newScrollLeftPosition;
7886
}
7987
}
8088

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) {
9290
if (this.blocked) {
9391
return;
9492
}
@@ -105,25 +103,25 @@ export class SliderComponent implements OnInit, AfterViewInit {
105103
}
106104
this.isDragging = true;
107105
this.posSlider.posInitX = e.touches[0].clientX;
108-
this.posSlider.scrollInit = this.sliderElement.scrollLeft;
106+
this.posSlider.scrollInit = this.sliderContainerElement.scrollLeft;
109107
}
110108

111109
@HostListener('touchmove', ['$event']) onTouchMove(e) {
112110
if ((!this.isDragging) || (this.blocked)) {
113111
return;
114112
}
115113

116-
const width = this.sliderElement.scrollWidth - this.sliderElement.clientWidth;
114+
const width = this.sliderContainerElement.scrollWidth - this.sliderContainerElement.clientWidth;
117115
const dif = e.touches[0].clientX - this.posSlider.posInitX;
118116
this.posSlider.posEndX = e.touches[0].clientX;
119117
const newScrollLeftPosition = this.posSlider.scrollInit - dif;
120118

121119
if ((newScrollLeftPosition >= 0) && (newScrollLeftPosition <= width)) {
122-
this.sliderElement.scrollLeft = newScrollLeftPosition;
120+
this.sliderContainerElement.scrollLeft = newScrollLeftPosition;
123121
}
124122
}
125123

126-
@HostListener('touchend', ['$event']) onTouchEnd(e) {
124+
@HostListener('window:touchend', ['$event']) onTouchEnd(e) {
127125
if ((this.blocked) || (this.validateElementBullet(e))) {
128126
return;
129127
}
@@ -132,14 +130,14 @@ export class SliderComponent implements OnInit, AfterViewInit {
132130
}
133131

134132
private move() {
135-
const minMovement = this.sliderElement.clientWidth * 0.18;
133+
const minMovement = this.sliderContainerElement.clientWidth * 0.18;
136134

137135
if (Math.abs(this.posSlider.posEndX - this.posSlider.posInitX) < minMovement) {
138136
this.setSlideWidthAnimation(this.currentSlidePos);
139137
return;
140138
}
141139

142-
if ((this.posSlider.posEndX < this.posSlider.posInitX) && (this.currentSlidePos < this.slideNumber)) {
140+
if ((this.posSlider.posEndX < this.posSlider.posInitX) && (this.currentSlidePos < this.slidesNumber)) {
143141
this.setSlideWidthAnimation(this.currentSlidePos + 1);
144142
} else if ((this.currentSlidePos > 1) && (this.posSlider.posEndX > this.posSlider.posInitX)) {
145143
this.setSlideWidthAnimation(this.currentSlidePos - 1);
@@ -148,33 +146,33 @@ export class SliderComponent implements OnInit, AfterViewInit {
148146

149147
setSlideWidthAnimation(slideEnd) {
150148
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);
153151
const c = posEnd - posInit;
154152
let position = 0;
155153
const interval = setInterval(() => {
156154
if (t > 380) {
157-
this.sliderElement.scrollLeft = posEnd;
155+
this.sliderContainerElement.scrollLeft = posEnd;
158156
this.currentSlidePos = slideEnd;
159157
this.blocked = false;
160158
clearInterval(interval);
161159
}
162160
position = this.easeOutSine(t, posInit, c, 380);
163-
this.sliderElement.scrollLeft = position;
161+
this.sliderContainerElement.scrollLeft = position;
164162
t = t + 5;
165163
}, 5);
166164
}
167165

168-
easeOutSine(t, b, c, d) {
166+
easeOutSine(t: number, b: number, c: number, d: number): number {
169167
return c * Math.sin(t / d * (Math.PI / 2)) + b;
170168
}
171169

172170
private validateElementBullet(e: Event): boolean {
173171
if (e.target) {
174172
const element = e.target as HTMLElement;
175173
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')) {
178176
return true;
179177
}
180178
}

src/app/app.component.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<lib-slider [slides]="slides" [squareBullets]="true" [option]="option"></lib-slider>
2-
1+
<!-- <lib-slider [slides]="slides" [squareBullets]="true" [option]="option"></lib-slider> -->
2+
<lib-slider [slides]="slides"></lib-slider>
33

44
<h1>Slider Example</h1>

src/app/app.component.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ export class AppComponent {
3333
}
3434
];
3535

36-
option: IOptions = {
37-
animation: 'fixed'
38-
};
36+
// option: IOptions = {
37+
// animation: 'fixed'
38+
// };
3939

4040
}

0 commit comments

Comments
 (0)