ion-range
Contents
The Range slider lets users select from a range of values by moving the slider knob. It can accept dual knobs, but by default one knob controls the value of the range.
#
Range LabelsLabels can be placed on either side of the range by adding the
slot="start"
or slot="end"
to the element. The element doesn't have to
be an ion-label
, it can be added to any element to place it to the
left or right of the range.
#
Custom Pin FormattersWhen using a pin, the default behavior is to round the value that gets displayed using Math.round()
. This behavior can be customized by passing in a formatter function to the pinFormatter
property. See the Usage section for an example.
#
Interfaces#
RangeChangeEventDetailinterface RangeChangeEventDetail { value: RangeValue;}
#
RangeCustomEventWhile not required, this interface can be used in place of the CustomEvent
interface for stronger typing with Ionic events emitted from this component.
interface RangeCustomEvent extends CustomEvent { detail: RangeChangeEventDetail; target: HTMLIonRangeElement;}
#
Types#
RangeValuetype RangeValue = number | { lower: number, upper: number };
#
Usage- Angular
- Javascript
- React
- Stencil
- Vue
<ion-list> <ion-item> <ion-range color="danger" [pin]="true"></ion-range> </ion-item>
<ion-item> <ion-range min="-200" max="200" color="secondary"> <ion-label slot="start">-200</ion-label> <ion-label slot="end">200</ion-label> </ion-range> </ion-item>
<ion-item> <ion-range min="20" max="80" step="2"> <ion-icon size="small" slot="start" name="sunny"></ion-icon> <ion-icon slot="end" name="sunny"></ion-icon> </ion-range> </ion-item>
<ion-item> <ion-range min="1000" max="2000" step="100" snaps="true" color="secondary"></ion-range> </ion-item>
<ion-item> <ion-range min="1000" max="2000" step="100" snaps="true" ticks="false" color="secondary"></ion-range> </ion-item>
<ion-item> <ion-range dualKnobs="true" min="21" max="72" step="3" snaps="true"></ion-range> </ion-item> <ion-item> <ion-range min="0" max="100" [pinFormatter]="customFormatter" [pin]="true"></ion-range> </ion-item></ion-list>
import { Component } from '@angular/core';
@Component({โฆ})export class MyComponent { constructor() {} public customFormatter(value: number) { return `${value}%` }}
<ion-list> <ion-item> <ion-range color="danger" pin="true"></ion-range> </ion-item>
<ion-item> <ion-range min="-200" max="200" color="secondary"> <ion-label slot="start">-200</ion-label> <ion-label slot="end">200</ion-label> </ion-range> </ion-item>
<ion-item> <ion-range min="20" max="80" step="2"> <ion-icon size="small" slot="start" name="sunny"></ion-icon> <ion-icon slot="end" name="sunny"></ion-icon> </ion-range> </ion-item>
<ion-item> <ion-range min="1000" max="2000" step="100" snaps="true" color="secondary"></ion-range> </ion-item>
<ion-item> <ion-range min="1000" max="2000" step="100" snaps="true" ticks="false" color="secondary"></ion-range> </ion-item>
<ion-item> <ion-range dual-knobs="true" min="21" max="72" step="3" snaps="true"></ion-range> </ion-item> <ion-item> <ion-range min="0" max="100" pin="true" id="custom-range"></ion-range> </ion-item></ion-list>
<script> const customRange = document.querySelector('#custom-range'); customRange.pinFormatter = (value) => `${value}%`; </script>
import React, { useState } from 'react';import { IonContent, IonHeader, IonPage, IonTitle, IonToolbar, IonList, IonItem, IonRange, IonLabel, IonIcon, IonItemDivider } from '@ionic/react';import { sunny } from 'ionicons/icons';import { RangeValue } from '@ionic/core';
export const RangeExamples: React.FC = () => {
const [value, setValue] = useState(0); const [rangeValue, setRangeValue] = useState<{ lower: number; upper: number; }>({ lower: 0, upper: 0 }); const customFormatter = (value: number) => `${value}%`;
return ( <IonPage> <IonHeader> <IonToolbar> <IonTitle>IonRange Examples</IonTitle> </IonToolbar> </IonHeader> <IonContent> <IonList> <IonItemDivider>Default</IonItemDivider> <IonItem> <IonRange pin={true} value={value} onIonChange={e => setValue(e.detail.value as number)} /> </IonItem> <IonItem> <IonLabel>Value: {value}</IonLabel> </IonItem>
<IonItemDivider>Min & Max</IonItemDivider> <IonItem> <IonRange min={-200} max={200} color="secondary"> <IonLabel slot="start">-200</IonLabel> <IonLabel slot="end">200</IonLabel> </IonRange> </IonItem>
<IonItemDivider>Icons</IonItemDivider> <IonItem> <IonRange min={20} max={80} step={2}> <IonIcon size="small" slot="start" icon={sunny} /> <IonIcon slot="end" icon={sunny} /> </IonRange> </IonItem>
<IonItemDivider>With Snaps & Ticks</IonItemDivider> <IonItem> <IonRange min={1000} max={2000} step={100} snaps={true} color="secondary" /> </IonItem>
<IonItemDivider>With Snaps & No Ticks</IonItemDivider> <IonItem> <IonRange min={1000} max={2000} step={100} snaps={true} ticks={false} color="secondary" /> </IonItem>
<IonItemDivider>Dual Knobs</IonItemDivider> <IonItem> <IonRange dualKnobs={true} min={0} max={60} step={3} snaps={true} onIonChange={e => setRangeValue(e.detail.value as any)} /> </IonItem> <IonItem> <IonLabel>Value: lower: {rangeValue.lower} upper: {rangeValue.upper}</IonLabel> </IonItem> <IonItem> <IonRange min={0} max={100} pinFormatter={customFormatter} pin={true}></IonRange> </IonItem> </IonList> </IonContent> </IonPage> );};
import { Component, h } from '@stencil/core';
@Component({ tag: 'range-example', styleUrl: 'range-example.css'})export class RangeExample { private customFormatter = (value: number) => `${value}%`; render() { return [ <ion-list> <ion-item> <ion-range color="danger" pin={true}></ion-range> </ion-item>
<ion-item> <ion-range min={-200} max={200} color="secondary"> <ion-label slot="start">-200</ion-label> <ion-label slot="end">200</ion-label> </ion-range> </ion-item>
<ion-item> <ion-range min={20} max={80} step={2}> <ion-icon size="small" slot="start" name="sunny"></ion-icon> <ion-icon slot="end" name="sunny"></ion-icon> </ion-range> </ion-item>
<ion-item> <ion-range min={1000} max={2000} step={100} snaps={true} color="secondary"></ion-range> </ion-item>
<ion-item> <ion-range min={1000} max={2000} step={100} snaps={true} ticks={false} color="secondary"></ion-range> </ion-item>
<ion-item> <ion-range dualKnobs={true} min={21} max={72} step={3} snaps={true}></ion-range> </ion-item> <ion-item> <ion-range min="0" max="100" pinFormatter={this.customFormatter} pin={true}></ion-range> </ion-item> </ion-list> ]; }}
<template> <ion-list> <ion-item> <ion-range color="danger" :pin="true"></ion-range> </ion-item>
<ion-item> <ion-range min="-200" max="200" color="secondary"> <ion-label slot="start">-200</ion-label> <ion-label slot="end">200</ion-label> </ion-range> </ion-item>
<ion-item> <ion-range min="20" max="80" step="2"> <ion-icon size="small" slot="start" name="sunny"></ion-icon> <ion-icon slot="end" name="sunny"></ion-icon> </ion-range> </ion-item>
<ion-item> <ion-range min="1000" max="2000" step="100" snaps="true" color="secondary"></ion-range> </ion-item>
<ion-item> <ion-range min="1000" max="2000" step="100" snaps="true" ticks="false" color="secondary"></ion-range> </ion-item>
<ion-item> <ion-range ref="rangeDualKnobs" dual-knobs="true" min="21" max="72" step="3" snaps="true"></ion-range> </ion-item> <ion-item> <ion-range min="0" max="100" :pin-formatter="customFormatter" :pin="true"></ion-range> </ion-item> </ion-list></template>
<script lang="ts">import { IonItem, IonLabel, IonList, IonRange } from '@ionic/vue';import { defineComponent } from 'vue';
export default defineComponent({ components: { IonItem, IonLabel, IonList, IonRange }, mounted() { // Sets initial value for dual-knob ion-range this.$refs.rangeDualKnobs.value = { lower: 24, upper: 42 }; }, setup() { const customFormatter = (value: number) => `${value}%`; return { customFormatter }; }});</script>
#
Properties#
colorDescription | The color to use from your application's color palette. Default options are: "primary" , "secondary" , "tertiary" , "success" , "warning" , "danger" , "light" , "medium" , and "dark" .For more information on colors, see theming. |
Attribute | color |
Type | string ๏ฝ undefined |
Default | undefined |
#
debounceDescription | How long, in milliseconds, to wait to trigger theionChange event after each change in the range value.This also impacts form bindings such as ngModel or v-model . |
Attribute | debounce |
Type | number |
Default | 0 |
#
disabledDescription | If true , the user cannot interact with the range. |
Attribute | disabled |
Type | boolean |
Default | false |
#
dualKnobsDescription | Show two knobs. |
Attribute | dual-knobs |
Type | boolean |
Default | false |
#
maxDescription | Maximum integer value of the range. |
Attribute | max |
Type | number |
Default | 100 |
#
minDescription | Minimum integer value of the range. |
Attribute | min |
Type | number |
Default | 0 |
#
modeDescription | The mode determines which platform styles to use. |
Attribute | mode |
Type | "ios" ๏ฝ "md" |
Default | undefined |
#
nameDescription | The name of the control, which is submitted with the form data. |
Attribute | name |
Type | string |
Default | '' |
#
pinDescription | If true , a pin with integer value is shown when the knobis pressed. |
Attribute | pin |
Type | boolean |
Default | false |
#
pinFormatterDescription | A callback used to format the pin text. By default the pin text is set to Math.round(value) . |
Attribute | undefined |
Type | (value: number) => string ๏ฝ number |
Default | (value: number): number => Math.round(value) |
#
snapsDescription | If true , the knob snaps to tick marks evenly spaced basedon the step property value. |
Attribute | snaps |
Type | boolean |
Default | false |
#
stepDescription | Specifies the value granularity. |
Attribute | step |
Type | number |
Default | 1 |
#
ticksDescription | If true , tick marks are displayed based on the step value.Only applies when snaps is true . |
Attribute | ticks |
Type | boolean |
Default | true |
#
valueDescription | the value of the range. |
Attribute | value |
Type | number ๏ฝ { lower: number; upper: number; } |
Default | 0 |
#
EventsName | Description |
---|---|
ionBlur | Emitted when the range loses focus. |
ionChange | Emitted when the value property has changed. |
ionFocus | Emitted when the range has focus. |
#
CSS Shadow PartsName | Description |
---|---|
bar | The inactive part of the bar. |
bar-active | The active part of the bar. |
knob | The handle that is used to drag the range. |
pin | The counter that appears above a knob. |
tick | An inactive tick mark. |
tick-active | An active tick mark. |
#
CSS Custom PropertiesName | Description |
---|---|
--bar-background | Background of the range bar |
--bar-background-active | Background of the active range bar |
--bar-border-radius | Border radius of the range bar |
--bar-height | Height of the range bar |
--height | Height of the range |
--knob-background | Background of the range knob |
--knob-border-radius | Border radius of the range knob |
--knob-box-shadow | Box shadow of the range knob |
--knob-size | Size of the range knob |
--pin-background | Background of the range pin |
--pin-color | Color of the range pin |
#
SlotsName | Description |
---|---|
end | Content is placed to the right of the range slider in LTR, and to the left in RTL. |
start | Content is placed to the left of the range slider in LTR, and to the right in RTL. |