Descripción general del componente deslizante Angular
El control deslizante Ignite UI for Angular es un componente de formulario que permite la selección en un rango determinado moviendo un pulgar a lo largo de una pista. La pista se puede definir como continua o escalonada y el control deslizante se puede configurar para que los usuarios puedan elegir entre los tipos de control deslizante de valor único y rango (valor inferior y superior).
Ejemplo de control deslizante Angular
¿Te gusta esta muestra? Obtenga acceso a nuestro kit de herramientas de Ignite UI for Angular completo y comience a crear sus propias aplicaciones en minutos. Descárgalo gratis.
Primeros pasos con Ignite UI for Angular Slider
Para comenzar con el componente Ignite UI for Angular Slider, primero debe instalar Ignite UI for Angular. En una aplicación Angular existente, escriba el siguiente comando:
ng add igniteui-angular
cmd
Para obtener una introducción completa al Ignite UI for Angular, lea el tema de introducción.
El siguiente paso es importar IgxSliderModule
en su archivo app.module.ts.
Este componente puede utilizar el HammerModule
opcionalmente. Se puede importar en el módulo raíz de la aplicación para que las interacciones táctiles funcionen como se espera.
// app.module.ts
import { HammerModule } from '@angular/platform-browser';
import { IgxSliderModule } from 'igniteui-angular';
// import { IgxSliderModule } from '@infragistics/igniteui-angular'; for licensed package
@NgModule({
...
imports: [..., IgxSliderModule, HammerModule],
...
})
export class AppModule {}
typescript
Alternativamente, a partir de 16.0.0
, puede importar IgxSliderComponent
como una dependencia independiente o usar el token IGX_SLIDER_DIRECTIVES
para importar el componente y todos sus componentes y directivas de soporte.
// home.component.ts
import { FormsModule } from '@angular/forms';
import { IGX_SLIDER_DIRECTIVES } from 'igniteui-angular';
// import { IGX_SLIDER_DIRECTIVES } from '@infragistics/igniteui-angular'; for licensed package
@Component({
selector: 'app-home',
template: '<igx-slider [minValue]="0" [maxValue]="100" [step]="10" [(ngModel)]="task.completion"></igx-slider>',
styleUrls: ['home.component.scss'],
standalone: true,
imports: [IGX_SLIDER_DIRECTIVES, FormsModule]
/* or imports: [IgxSliderComponent, FormsModule] */
})
export class HomeComponent {
public task: Task;
}
typescript
Cuando se utilizan componentes independientes, HammerModule
deben importarse en el app.config
archivo.
//app.config.ts
import { ApplicationConfig, importProvidersFrom } from '@angular/core';
import { provideRouter } from '@angular/router';
import { appRoutes } from './app.routes';
import { HammerModule } from '@angular/platform-browser';
export const appConfig: ApplicationConfig = {
providers: [
importProvidersFrom(HammerModule),
provideRouter(appRoutes)
],
};
typescript
Ahora que tiene el módulo o las directivas Ignite UI for Angular Slider importados, puede comenzar a usar el igx-slider
componente.
Uso del control deslizante Angular
Control deslizante discreto
De forma predeterminada, el componente deslizante está configurado en tipo discreto. Un control deslizante discreto proporciona una visualización del valor actual con una etiqueta numérica (burbuja). La burbuja se puede mostrar al pasar el cursor sobre el control deslizante.
También puede utilizar el control deslizante con pasos predefinidos para realizar un seguimiento solo de valores significativos para el usuario.
En el siguiente ejemplo, definimos un control deslizante discreto que muestra valores del 0% al 100% y el step
se establece en 10% por incremento/decremento.
También vinculamos el value
del control deslizante a una propiedad en nuestro componente llamada "finalización", usando Angular ngModel
, para permitir el enlace bidireccional con un componente de entrada.
<!--sample.component.html-->
<igx-slider [minValue]="0" [maxValue]="100" [step]="10" [(ngModel)]="task.completion"></igx-slider>
<igx-input-group type="border">
<input igxInput id="percentInput" type="number" [(ngModel)]="task.completion" />
<label igxLabel for="percentInput">Task Completion</label>
<igx-suffix>%</igx-suffix>
</igx-input-group>
html
// sample.component.ts
import { Component, ViewChild } from '@angular/core';
import { IgxInputDirective, IgxSliderComponent } from 'igniteui-angular';
// import { IgxInputDirective, IgxSliderComponent } from '@infragistics/igniteui-angular'; for licensed package
@Component({
selector: 'app-sample',
styleUrls: ['./sample.component.scss'],
templateUrl: './sample.component.html'
})
export class SampleComponent {
public task = {
completion: 10
};
constructor() { }
}
typescript
Ahora deberíamos ver un enlace de datos bidireccional entre nuestros dos componentes.
Control deslizante continuo
Primero, especifique el tipo de control deslizante configurando la entrada continuous
en verdadero. A continuación, defina los valores mínimo y máximo utilizando minValue
y maxValue
.
El control deslizante continuo no tiene indicadores de pasos sobre la pista ni etiquetas visibles para los pulgares durante la interacción.
<!--sample.component.html-->
<igx-slider
id="slider"
[minValue]="0"
[maxValue]="100"
[continuous]=true
[(ngModel)]="volume">
</igx-slider>
<label igxLabel for="slider">Volume: {{volume}}</label>
html
Vinculemos también el value
del control deslizante a una propiedad en nuestro componente llamada "volumen".
// sample.component.ts
// Set an initial value
public volume = 20;
typescript
Si la muestra está configurada correctamente, arrastrar el control deslizante debería actualizar la etiqueta a continuación y el valor del control deslizante debería limitarse entre los valores mínimo y máximo especificados:
Deslizador de rango
Primero, establezca el type
control deslizante en RANGE
. A continuación, vinculamos el valor del control deslizante a un objeto con propiedades para los valores lower
e upper
.
<!--sample.component.html-->
<igx-slider
[type]="sliderType.RANGE"
[minValue]="0"
[maxValue]="1000"
[(lowerValue)]="priceRange.lower"
[(upperValue)]="priceRange.upper">
</igx-slider>
<igx-input-group type="border">
<label igxLabel for="lowerRange">From</label>
<igx-prefix>$</igx-prefix>
<input igxInput id="lowerRange" type="number" [(ngModel)]="priceRange.lower" />
</igx-input-group>
<igx-input-group type="border">
<label igxLabel for="upperRange">To</label>
<igx-prefix>$</igx-prefix>
<input igxInput id="upperRange" type="number" [(ngModel)]="priceRange.upper" />
</igx-input-group>
html
// sample.component.ts
import { Component } from '@angular/core';
import { IgxSliderType } from 'igniteui-angular';
// import { IgxSliderType } from '@infragistics/igniteui-angular'; for licensed package
@Component({
selector: 'app-sample',
styleUrls: ['./sample.component.scss'],
templateUrl: './sample.component.html'
})
export class SampleComponent {
public sliderType = IgxSliderType;
public priceRange = {
lower: 200,
upper: 800
};
constructor() { }
}
typescript
Cuando se utiliza un control deslizante de tipo RANGE, la vinculación a ngModel
funcionará solo en la dirección de actualizar el modelo desde el control deslizante. Para utilizar enlaces bidireccionales para ambos valores, puede aprovechar los enlaces lowerValue
y upperValue
.
En algunos casos, los valores cercanos al mínimo y al máximo no son apropiados. Además, puede proporcionar un rango útil para limitar la elección del usuario junto con la configuración minValue
y maxValue
. Esto se puede hacer configurando lowerBound
y upperBound
. Ahora, el usuario no podrá mover el pulgar en el rango de 0 a 100 y en el rango de 900 a 1000.
<!--sample.component.html-->
<igx-slider
[type]="sliderType.RANGE"
[minValue]="0"
[maxValue]="1000"
[(lowerValue)]="priceRange.lower"
[(upperValue)]="priceRange.upper"
[lowerBound]="100"
[upperBound]="900">
</igx-slider>
html
Modo de etiquetas
Hasta ahora solo hemos visto números en los pulgares, aunque hay otro enfoque que podrías usar para presentar información: usando una matriz de valores primitivos.
Su conjunto de valores primitivos debe contener al menos dos valores; de lo contrario, no se habilitará labelsView
.
Una vez que tenemos la definición que corresponde a la regla anterior, estamos listos para dársela al labels
aporte propiedad, que manejaría nuestros datos distribuyéndolos equitativamente en el track
. Ahora, los valores de las etiquetas representan cada valor primitivo que hemos definido en nuestra colección. Se puede acceder a ellos en cualquier momento a través de la API solicitando: etiqueta inferior o etiqueta superior.
Tenga en cuenta el hecho de que cuando labelsView
está habilitado, se tomará su control sobre las entradas maxValue
, minValue
y step
.
Otro factor importante es la forma en que slider
maneja el proceso de actualización cuando labelsView
está habilitado. Simplemente opera con el index(es)
de la colección, lo que significa respectivamente que el value
, lowerBound
y upperBound
propiedades controlar el track
siguiéndolos/configurándolos (index(es)
).
<!--sample.component.html-->
<igx-slider #slider3 [type]="sliderType" [labels]="labels" [lowerBound]="1" [upperBound]="5">
<ng-template igxSliderThumbFrom let-value let-labels="labels">
<span class="ellipsis">{{ labels[value.lower] }}</span>
</ng-template>
<ng-template igxSliderThumbTo let-value let-labels="labels">
<span class="ellipsis">{{ labels[value.upper] }}</span>
</ng-template>
</igx-slider>
html
// sample.component.ts
public sliderType: SliderType = SliderType.RANGE;
public labels = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
typescript
Como vemos en el ejemplo anterior, establecer boundaries
sigue siendo una operación válida. Al abordar lowerBound
y upperBound
, se limita el rango por el que puede deslizarse.
Plantillas de etiquetas
Durante la presentación anterior, mostramos intencionalmente cómo podemos ofrecer nuestra label
plantilla, utilizando ambos igxSliderThumbFrom y igxSliderThumbTo directivas. Intuitivamente podemos suponer que igxSliderThumbFrom corresponde a la etiqueta inferior y igxSliderThumbTo hacia etiqueta superior.
El contexto aquí nos da implícitamente una referencia a la value
aporte propiedad y explícitamente una referencia a la labels
aporte si labelsView
está habilitado.
<ng-template igxSliderThumbFrom let-value let-labels="labels">
<span class="ellipsis">{{ labels[value.lower] }}</span>
</ng-template>
<ng-template igxSliderThumbTo let-value let-labels="labels">
<span class="ellipsis">{{ labels[value.upper] }}</span>
</ng-template>
html
Marcas y etiquetas del control deslizante
Las marcas de graduación del control deslizante proporcionan una forma nueva y más atractiva de visualización de datos, como un período de tiempo particular, días de la semana y más. Con esta nueva funcionalidad, los usuarios no están obligados a interactuar con el control deslizante Angular para ver qué rango de datos se está representando. Es extremadamente flexible, con respecto al control sobre el posicionamiento y la orientación de las marcas de graduación y las etiquetas de graduación. Las marcas de graduación se pueden activar /desactivar, así como también se pueden alternar entre primarias, secundarias o ambas. Además, esta función proporciona una forma de activar /desactivar las etiquetas de graduación primarias, secundarias o ambas. Las etiquetas de graduación pueden cambiar su rotación de horizontal a vertical (de arriba a abajo (90) o de abajo a arriba (-90)).
Habilitar ticks
Podemos habilitar las marcas del control deslizante configurando showTicks
en verdadero.
Utilice primaryTicks
para establecer el número de ticks principales.
Utilice SecondaryTicks
para establecer el número de ticks secundarios.
<!--sample.component.html-->
<igx-slider
id="slider"
[maxValue]="100"
[step]="10"
[showTicks]="true"
[primaryTicks]="3"
[secondaryTicks]="4">
</igx-slider>
html
// sample.component.ts
// Change slider type initial value
public type = SliderType.RANGE;
typescript
Orientación y visibilidad de las etiquetas.
En el siguiente ejemplo, deshabilitamos todas las etiquetas secundarias configurando secondaryTickLabels
en false.
<igx-slider
[step]="10"
[type]="type"
[maxValue]="100"
[continuous]="true"
[showTicks]="true"
[primaryTicks]="3"
[secondaryTicks]="4"
[secondaryTickLabels]="false"
[tickLabelsOrientation]="labelsOrientation">
</igx-slider>
html
También rotamos todas las etiquetas viables configurando TickLabelsOrientation
en BottomToTop
```typescript
...
{
public type = SliderType.RANGE:
public labelsOrientation = TickLabelsOrientation.BottomToTop;
}
...
fortran
Posición de las garrapatas
Sigamos adelante y veamos cómo cambiar la posición de los ticks.
<div class="slider-container">
<igx-slider
[maxValue]="20"
[showTicks]="true"
[secondaryTicks]="21"
[primaryTickLabels]="false"
[ticksOrientation]="ticksOrientation">
</igx-slider>
</div>
html
El cambio de posición proviene de la entrada ticksOrientation
, que cambia de Bottom (predeterminado) a Mirror. Esto refleja la visualización de los ticks y los muestra encima y debajo del control deslizante.
// The available options are: Top, Bottom and Mirror
public ticksOrientation = TicksOrientation.Mirror;
typescript
Cuando ticksOrientaion
está configurado en Superior o Espejo y hay etiquetas de marca visibles, la etiqueta del pulgar se oculta intencionalmente. Esto evita una mala experiencia de usuario y la superposición entre las dos etiquetas.
Marcas deslizantes con vista de etiquetas
Este ejemplo muestra cómo funcionan juntas las etiquetas de marca y la etiqueta de pulgar.
<igx-slider
[labels]="labels"
[showTicks]="true"
[secondaryTicks]="3"
></igx-slider>
html
public type: SliderType = SliderType.RANGE;
public labels = ["04:00", "08:00", "12:00", "16:00", "20:00", "00:00"];
typescript
Aquí, la entrada primaryTicks
no se ha configurado porque no se reflejará de ninguna manera. La duración de la colección tiene prioridad sobre ella. Esto no significa que no se puedan configurar secondaryTicks
. Todas las marcas secundarias estarán vacías (sin etiquetas).
Etiquetas de plantilla
Por último, veremos cómo podemos proporcionar una plantilla personalizada para las etiquetas de marca y qué proporciona el template context
.
<igx-slider
[showTicks]="true"
[primaryTicks]="3"
[secondaryTicks]="3">
<ng-template igxSliderTickLabel let-value let-primary="isPrimary" let-idx="index">
{{ tickLabel(value, primary, idx) }}
</ng-template>
</igx-slider>
html
La aplicación de IgxTickLabelTemplateDirective
a ng-template
asigna la plantilla a todas las etiquetas de marca.
El context
se ejecuta por cada tick.
Lo que significa que proporciona una referencia a:
- cada valor de tick correspondiente
- Si esa marca es primaria.
- índice de garrapatas.
- Y la colección
labels
si la tenemos.
public tickLabel(value, primary, index) {
if (primary) {
return Math.round(value);
}
return value;
}
typescript
En la devolución de llamada de tickLabel anterior, redondeamos el valor de cada tick principal.
Estilo
Para personalizar el control deslizante, primero debe importar el index
archivo, donde se encuentran todas las funciones de estilo y mezclas.
@use "igniteui-angular/theming" as *;
// IMPORTANT: Prior to Ignite UI for Angular version 13 use:
// @import '~igniteui-angular/lib/core/styles/themes/index';
scss
A continuación, tenemos que crear un nuevo tema que extienda el slider-theme
y pasar los parámetros que nos gustaría cambiar:
$custom-slider-theme: slider-theme(
$track-color: #ff7400,
$track-hover-color: #ff7400,
$thumb-color: #ff7400,
$base-track-color: #ddd,
$base-track-hover-color: #ccc,
$tick-label-color: #b246c2,
$tick-label-color-tall: #ff7400,
$tick-color: #b246c2,
$tick-color-tall: #ff7400,
);
scss
El último paso es incluir el tema del componente recién creado en nuestra aplicación.
@include css-vars($custom-slider-theme);
scss
Manifestación
Este es el resultado final de la aplicación de nuestro nuevo tema.
Referencias de API
- Componente IgxSlider
- Estilos de componentes IgxSlider
- Tipo deslizante
- IRrangeSliderValue
- GarrapatasOrientación
- TickLabelsOrientación
Nuestra comunidad es activa y siempre da la bienvenida a nuevas ideas.