Algo muy común en páginas actuales es tener un slider, hay muchos frameworks y librerías que te facilitan esta tarea pero con angular aveces puede complicarse al usar typescript, si damos complejidad de que sea tactil y responsivo la primera opción es descargar una librería, aunque por la rapidez de las actualizaciones de angular estas quedan inservibles de manera rápida.
Por esta razón vamos a usar una libreria que esta casada con angular y más específicamente con material angular, asi que vamos a crear un slider táctil usando angular y hammerjs.
Creando slider en angular
lo primero que vamos a hacer es crear un slider sencillo, anteriormente ya tenemos un ejemplo de slider el cual se creaba a partir de los inputs, en esta ocasión vamos a hacer algo mas sencillo aun porque nos interesa la parte táctil.

Construyendo slider con css
Vamos a contruir este slider solamente con angular, asi que no usaremos ninguna libreria, para esto vamos a color estos estilos para que se ordene de derecha a izquierda.
.swipe {
width: 100%;
overflow-x: hidden;
padding-top: 16vh;
}
.superlarge {
width: max-content;
display: flex;
flex-direction: row;
flex-wrap: nowrap;
transition-duration: 0.4s;
transition-timing-function: cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.horizontal {
width: 100vw;
margin: 0;
padding-top: 3vh;
display: flex;
flex-direction: column;
flex-wrap: nowrap;
height: 80vh;
justify-content: center;
align-items: center;
}
.horizontal h3 {
font-size: 50px;
}
.entradav {
opacity: 0;
animation-fill-mode: forwards;
animation-name: aparecev;
animation-timing-function: cubic-bezier(0.25, 0.46, 0.45, 0.94);
animation-duration: 0.6s;
}
@keyframes aparecev {
to {
opacity: 1;
}
}
Ahora el html
<div class="swipe" >
<div class="superlarge" >
<div class="horizontal entradav" *ngFor="let card of cards" [style.backgroundColor]="card.color">
<h3>{{card.name}} </h3>
</div>
</div>
</div>
y por último el typescript
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-slider',
templateUrl: './slider.component.html',
styleUrls: ['./slider.component.css']
})
export class SliderComponent implements OnInit {
cards = [{
color: '#6657FF',
name: '1'
}, {
color: '#4A9BFF',
name: '2'
}, {
color: '#4361E8',
name: '3'
}, {
color: '#7E43E8',
name: '4'
}, {
color: '#BC4AFF',
name: '5'
}, {
color: '#FF42B6',
name: '6'
}];
constructor() { }
ngOnInit() {
}
}
Slider tactil con angular y hammer
Vamos a implementar hammer en nuestro proyecto hay dos formas, uno es usando material de angular, en automático de preguntara si quieres instalarlo, la otra forma es manual.
Instalando hammer
npm install --save hammerjs
y en nuestro main.ts colocamos el siguiente import
import 'hammerjs';
y listo
Implementar swipe en angular con hammer
Hammer tiene varios eventos, entre ellos estos:
- pan
- panstart
- panmove
- panend
- pancancel
- panleft
- panright
- panup
- pandown
- pinch
- pinchstart
- pinchmove
- pinchend
- pinchcancel
- pinchin
- pinchout
- press
- pressup
- rotate
- rotatestart
- rotatemove
- rotateend
- rotatecancel
- swipe
- swipeleft
- swiperight
- swipeup
- swipedown
- tap
si leemos un poco la documentación de hammer notaremos que pan y swipe son muy parecidos, la acción que hace la diferencia es que pan se activa desde el momento que comenzamos a mover el dedo y swipe cuando terminamos de moverlo.
Usando swipe para slider táctil en angular.
(swipeleft)="swipeleft($event)" (swiperight)="swiperight($event)"
de tal modo que nuestro html quedaría así
<div class="swipe" (swipeleft)="swipeleft($event)" (swiperight)="swiperight($event)">
<div class="superlarge" [style.marginLeft]="spacefn">
<div class="horizontal entradav" *ngFor="let card of cards" [style.backgroundColor]="card.color">
<h3>{{card.name}} </h3>
</div>
</div>
</div>
podemos ver que usamos [style.marginLeft]=»spacefn» para dar margenes a nuestros documentos y así desplazar el slider táctil, y con swipeleft y swiperight, cuando estas funciones se disparen vamos a entrar a una función nueva y capturaremos el evento en caso que queramos hacer algo con el valor del movimiento (te da una cifra numérica del movimiento del dedo)
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-slider',
templateUrl: './slider.component.html',
styleUrls: ['./slider.component.css']
})
export class SliderComponent implements OnInit {
cards = [{
color: '#6657FF',
name: '1'
}, {
color: '#4A9BFF',
name: '2'
}, {
color: '#4361E8',
name: '3'
}, {
color: '#7E43E8',
name: '4'
}, {
color: '#BC4AFF',
name: '5'
}, {
color: '#FF42B6',
name: '6'
}];
spacecrr = 0;
spacefn = '';
constructor() { }
ngOnInit() {
}
swipeleft(event) {
console.log('<--');
if (this.spacecrr < ((this.cards.length - 1) * 100)) {
this.spacecrr += 100;
this.spacefn = '-' + this.spacecrr + 'vw';
} else {
this.spacecrr = 0;
this.spacefn = '0vw';
}
}
swiperight(event) {
console.log('-->');
if (this.spacecrr >= 0 && this.spacecrr <= ((this.cards.length - 1) * 100)) {
this.spacecrr -= 100;
this.spacefn = '-' + this.spacecrr + 'vw';
}
}
}
como vemos las funciones lo que hace es validar en que posicion esta el slider y continuar o regresar.
si queremos captar los métodos arriba y abajo solo ponemos swipeup y swipedown y hacemos exactamente lo mismo
en caso de querer usar rotar les dejo un ejemplo
Configuración y eliminar error de scroll con hammer y angular
Existe configuraciones para hammer, en este caso la configuración para los gestos de arriba y abajo son los siguientes y se colocan en app.module.ts.
import * as Hammer from 'hammerjs';
export class HammerConfig extends HammerGestureConfig {
overrides = <any>{
'swipe': { direction: Hammer.DIRECTION_ALL }
};
}
providers: [
{
provide: HAMMER_GESTURE_CONFIG,
useClass: HammerConfig
}
]
Aclaro que al usar hammerjs este elimina el scroll, o tiene un comportamiento bastante extraño cuando ponemos uno de sus metodos.
Pero como vimos el ejemplo anterior es configurable, si usamos swipeleft y swiperight y scroll en el eje Y necesitamos esta configuración.
overrides = <any> {
'pinch': { enable: false },
'rotate': { enable: false }
}
Repositorio personal (shingrey)

