Skip to content
Oruga
Bulma
Bootstrap
Tailwind

Slider ​

The Slider input component let user select a value or range from a given range with a graphic slider.

The component implements the W3C ARIA APG Slider Pattern.

Use it with the Field component to access all the functionalities.

Examples ​

Base ​

html
<section>
    <o-field label="Simple">
        <o-slider :model-value="8" />
    </o-field>

    <o-field label="Disabled">
        <o-slider :model-value="30" disabled />
    </o-field>

    <o-field label="Tooltip type">
        <o-slider v-model="sliderValue" :tooltip-variant="sliderType" />
    </o-field>

    <o-field label="Hide tooltip">
        <o-slider :model-value="20" :tooltip="false" />
    </o-field>

    <o-field label="Custom tooltip label">
        <o-slider :model-value="30" :formatter="(val) => val + '%'" />
    </o-field>

    <o-field label="Rounded thumb">
        <o-slider :model-value="8" rounded />
    </o-field>
</section>
javascript
import { computed, ref } from "vue";

const sliderValue = ref(10);

const sliderType = computed(() => {
    if (sliderValue.value > 25 && sliderValue.value < 75) return "warning";
    else if (sliderValue.value >= 75) return "success";
    return "danger";
});

Sizes ​

The component can be displayed in different sizes using the size prop.

html
<section>
    <o-field label="Small">
        <o-slider v-model="value" size="small" />
    </o-field>

    <o-field label="Default">
        <o-slider v-model="value" />
    </o-field>

    <o-field label="Medium">
        <o-slider v-model="value" size="medium" />
    </o-field>

    <o-field label="Large">
        <o-slider v-model="value" size="large" />
    </o-field>
</section>
javascript
import { ref } from "vue";

const value = ref(15);

Variants ​

Different styles can be achieved with the variant prop.

html
<section>
    <o-field label="Default">
        <o-slider v-model="value" :rounded="true" :tooltip="true" />
    </o-field>

    <o-field label="Primary">
        <o-slider
            v-model="value"
            :rounded="true"
            :tooltip="true"
            variant="primary"
            tooltip-variant="primary" />
    </o-field>

    <o-field label="Secondary">
        <o-slider
            v-model="value"
            :rounded="true"
            :tooltip="true"
            variant="secondary"
            tooltip-variant="secondary" />
    </o-field>

    <o-field label="Success">
        <o-slider
            v-model="value"
            :rounded="true"
            :tooltip="true"
            variant="success"
            tooltip-variant="success" />
    </o-field>

    <o-field label="Info">
        <o-slider
            v-model="value"
            :rounded="true"
            :tooltip="true"
            variant="info"
            tooltip-variant="info" />
    </o-field>

    <o-field label="Warning">
        <o-slider
            v-model="value"
            :rounded="true"
            :tooltip="true"
            variant="warning"
            tooltip-variant="warning" />
    </o-field>

    <o-field label="Danger">
        <o-slider
            v-model="value"
            :rounded="true"
            :tooltip="true"
            variant="danger"
            tooltip-variant="danger" />
    </o-field>
</section>
javascript
import { ref } from "vue";

const value = ref(15);

Customise ​

html
<section>
    <o-field grouped>
        <o-field>
            <o-switch v-model="rounded" label="Rounded" />
        </o-field>
        <o-field>
            <o-switch v-model="tooltip" label="With Tooltip" />
        </o-field>
        <o-field label="Size">
            <o-select v-model="size">
                <option value="small">small</option>
                <option value="default">default</option>
                <option value="medium">medium</option>
                <option value="large">large</option>
            </o-select>
        </o-field>
        <o-field label="Variant">
            <o-select v-model="variant">
                <option value="default">default</option>
                <option value="primary">primary</option>
                <option value="secondary">secondary</option>
                <option value="success">success</option>
                <option value="info">info</option>
                <option value="warning">warning</option>
                <option value="danger">danger</option>
            </o-select>
        </o-field>
    </o-field>

    <o-field label="Tooltip type & Default Variant">
        <o-slider
            :rounded="rounded"
            :tooltip="tooltip"
            :variant="variant"
            :size="size" />
    </o-field>
</section>
javascript
import { ref } from "vue";

const rounded = ref(false);
const tooltip = ref(true);
const variant = ref("warning");
const size = ref("medium");

Tick and label ​

Customise the labels using slots.

html
<section>
    <o-field label="Show ticks">
        <o-slider :min="1" :max="10" ticks />
    </o-field>

    <o-field label="Custom tick and label">
        <o-slider size="medium" :min="0" :max="10">
            <template v-for="val in [3, 5, 8]" :key="val">
                <o-slider-tick :value="val" :label="val" />
            </template>
        </o-slider>
    </o-field>

    <o-field label="Fan">
        <o-slider
            :rounded="true"
            :min="0"
            :max="3"
            aria-label="Fan"
            :tooltip="false">
            <o-slider-tick :value="0">Off</o-slider-tick>
            <o-slider-tick :value="1">Low</o-slider-tick>
            <o-slider-tick :value="2">High</o-slider-tick>
            <o-slider-tick :value="3">Auto</o-slider-tick>
        </o-slider>
    </o-field>
    <br />
</section>

Range ​

When the range prop is set, the modelValue property will be an array of two values instead of a single value.

html
<section>
    <o-field label="Range with ticks">
        <o-slider
            v-model="numbers"
            ticks
            range
            :min="1"
            :max="15"
            :step="0.5" />
    </o-field>
    <p>{{ numbers }}</p>

    <o-field label="Range with variant">
        <o-slider
            v-model="numbers2"
            variant="danger"
            range
            :min="-2"
            :max="8"
            :step="2" />
    </o-field>
    <p>{{ numbers2 }}</p>
</section>
javascript
import { ref } from "vue";

const numbers = ref<[number, number]>([2, 5]);
const numbers2 = ref<[number, number]>([2, 6]);

Slider Component ​

A slider to select a value or range from a given range.

html
<o-slider></o-slider>

Props ​

Prop nameDescriptionTypeValuesDefault
ariaLabelAccessibility aria-label to to be passed to the slider thumb element.string-
From config:
slider: {
  ariaLabel: undefined
}
biggerSliderFocusIncreases slider size on focusboolean-false
disabledInteraction will be disabledboolean-false
formatDefine v-model format"percent" | "raw"row, percent
From config:
slider: {
  format: "raw"
}
formatterFunction to format the tooltip label for display((value: number) => string)-
indicatorShow indicatorsboolean-false
lazyUpdate v-model only when dragging is finishedboolean-false
localeDate format localestring | string[]-
From config:
{
  locale: undefined
}
maxMaximum valuenumber-100
minMinimum valuenumber-0
v-modelThe input value state, use v-model to make it two-way bindingValueType<IsRange>-
overrideOverride existing theme classes completelyboolean-
rangeEnable range sliderIsRange-
roundedRounded thumbboolean-
From config:
slider: {
  rounded: false
}
sizeVertical size of sliderstringsmall, medium, large
From config:
slider: {
  size: undefined
}
stepStep interval of ticksnumber-1
ticksShow tick marksboolean-false
tooltipShow tooltip when thumb is being draggedboolean-
From config:
slider: {
  tooltip: true
}
tooltipAlwaysTooltip displays alwaysboolean-false
tooltipVariantColor of the tooltipstringprimary, info, success, warning, danger, and any other custom color
From config:
slider: {
  tooltipVariant: undefined
}
variantColor of the sliderstringprimary, info, success, warning, danger, and any other custom color
From config:
slider: {
  variant: undefined
}

Events ​

Event namePropertiesDescription
update:model-valuevalue number | number[] - updated modelValue propmodelValue prop two-way binding
changevalue number | number[] - updated modelValue propon value change event
draggingvalue number | number[] - updated modelValue propon dragging event
dragstarton drag start event
dragendon drag end event

Slots ​

NameDescriptionBindings
defaultDefine additional slider ticks here

SliderTick Component ​

html
<o-slider-tick></o-slider-tick>

Props ​

Prop nameDescriptionTypeValuesDefault
labelTick labelnumber | string-
overrideOverride existing theme classes completelyboolean-
valueValue of single ticknumber-

Slots ​

NameDescriptionBindings
defaultOverride tick content, default is label prop

Class Inspector ​

Classes applied to the element:
➜ Want to know how does the Class Inspector work?
Class propDescriptionPropsSuffixes
rootClass
Class of the root element.
sizeClass
Class of the root element with size.
sizesmall
medium
large
disabledClass
Class of the root element when disabled.
disabled
trackClass
Class of the slider track element.
fillClass
Class of the filled part of the slider.
fillVariantClass
Class of the filled part of the slider with variant.
variantprimary
info
warning
danger
thumbWrapperClass
Class of the thumb wrapper element.
thumbWrapperDraggingClass
Class of the thumb wrapper element when the slider is dragged.
👉 Drag the thumb to see it in action!
thumbClass
Class of the thumb element.
thumbRoundedClass
Class of the thumb element when rounded.
rounded
thumbDraggingClass
Class of the thumb element when is dragged.
👉 Drag the thumb to see it in action!
▷ tickClass
Class of the slider tick element.
ticks
▷ tickHiddenClass
Class of the slider tick element when is hidden.
ticks
▷ tickBeforeClass
Class of the slider tick element when is before the value.
ticks
▷ tickAfterClass
Class of the slider tick element when is after the value.
ticks
▷ tickLabelClass
Class of the slider tick label element.
ticks

Sass Variables ​

Current theme ➜ Oruga

SASS VariableDefault
$slider-padding1em 0
$slider-disabled-opacityh.useVar("control-disabled-opacity")
$slider-font-sizeh.useVar("font-size")
$slider-track-to-thumb-ratio2
$slider-track-heightcalc( h.useVar("slider-thumb-size") / $slider-track-to-thumb-ratio)
$slider-track-box-shadowh.useVar("control-box-shadow")
$slider-track-border-width0px
$slider-track-border-stylesolid
$slider-track-border-colorh.useVar("grey")
$slider-track-border-radiush.useVar("border-radius")
$slider-track-background-colorh.useVar("grey-lighter")
$slider-fill-box-shadowh.useVar("control-box-shadow")
$slider-fill-background-colorh.useVar("primary")
$slider-thumb-sizeh.useVar("slider-font-size")
$slider-thumb-font-sizecalc(0.85 * h.useVar("slider-font-size"))
$slider-thumb-font-weighth.useVar("font-weight")
$slider-thumb-line-heighth.useVar("line-height")
$slider-thumb-box-shadownone
$slider-thumb-border-width1px
$slider-thumb-border-stylesolid
$slider-thumb-border-colorh.useVar("grey-light")
$slider-thumb-border-radiush.useVar("border-radius")
$slider-thumb-border-radius-roundedh.useVar("border-radius-rounded")
$slider-thumb-background-colorh.useVar("control-background-color")
$slider-thumb-transformscale(1.25)
$slider-tick-to-track-ratio0.5
$slider-tick-sizecalc( h.useVar("slider-track-height") * $slider-tick-to-track-ratio)
$slider-tick-colorh.useVar("font-color")
$slider-tick-font-size0.75em
$slider-tick-font-weighth.useVar("font-weight")
$slider-tick-line-heighth.useVar("line-height")
$slider-tick-background-colorh.useVar("primary")
$slider-tick-radiush.useVar("border-radius")

See ➜ 📄 SCSS file

Current theme ➜ Bulma

SASS VariableDefault
$slider-tick-label-size0.75rem
$slider-thumb-shadownone
$slider-thumb-to-track-ratio2
$slider-tick-to-track-ratio0.5
$slider-tick-width3px
$slider-colorsdv.$colors
$slider-radiuscss.getVar("radius")
$slider-backgroundcss.getVar("grey-lighter")
$slider-colorcss.getVar("primary")
$slider-track-border0px solid css.getVar("grey")
$slider-track-shadow0px 0px 0px css.getVar("grey")
$slider-thumb-backgroundcss.getVar("scheme-main")
$slider-thumb-radiuscss.getVar("radius")
$slider-thumb-border1px solid css.getVar("grey-light")
$slider-tick-radiuscss.getVar("radius")
$slider-tick-backgroundcss.getVar("grey-light")

See ➜ 📄 SCSS file

Current theme ➜ Bootstrap

SASS VariableDefault
$slider-tick-width0.25rem
$slider-tick-height0.25rem
$slider-tick-radius50%
$slider-tick-bgvar(--#{$prefix}gray)

See ➜ 📄 SCSS file

Current theme ➜ Tailwind

The theme does not have any custom variables for this component.

Released under the MIT License.