Description

Sliders allow users to select a value from a predefined range.

Types

Type

Usage

Image

Single-value slider

Use to select a single value from a predefined range.

Range slider

Use to select a range of values, within minimum and maximum values. See Range Slider below.

Usage & Behavior

General guidelines

Structure

A slider consists of:

The slider may also include:

Default State

A slider must have a default value. Usually it is the most common or popular value.

Content

States

State

Image

Comment

Normal

Hover

Active

Disabled

Focused

Focused Hover

Focused Active

Focused Disabled

Warning

Interaction

  1. Dragging the handle to the desired position (see Drag and Drop). In this case:

    1. If ticks exist, the movement of the handle across the axis will be discrete, along the tick marks.

    2. If no ticks exist, the movement will be continuous.

    3. If a text field exists, the value will be updated automatically.

    4. a tooltip may appear, showing the value

  2. Clicking on the axis itself. In this case the handle will move to the selected position.

  3. Clicking the Increase or Decrease buttons. In this case:

    1. The handle will move to the the next / previous position respectively.

    2. If a text field exists, the value will be updated automatically.

  4. Entering a value in the text field, if one exists. In this case, the handle will automatically move to the relevant position on the axis after moving the focus away from the text field.

Validations and errors

Best practices

Use when:

Don’t use:

Range Slider

Basic range slider

Range slider with input fields

A range slider is a variant of the slider, allowing users to select a range of values within the total range.

Usage & Behavior

Accessibility compliance

In the Focus stated for a single-value slider:

Unless otherwise specified, see our general compliance information in Fundamentals - Accessibility.

Design

Zeplin link

Screen thumbnail

https://zpl.io/VqoY84b

Code

<link rel="stylesheet" href="https://ux.verint.com/bootstrap-4.0.0/dist/fonts/css/verint_lux.css">
<link rel="stylesheet" href="https://ux.verint.com/bootstrap-4.0.0/dist/css/bootstrap.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://ux.verint.com/bootstrap-4.0.0/dist/js/bootstrap.bundle.js"></script>
<script src="https://ux.verint.com/bootstrap-4.0.0/dist/other/bootstrap-tooltip-custom-class.js"></script>
<script src="https://ux.verint.com/bootstrap-4.0.0/dist/other/accessibility.js"></script>
<script src="https://ux.verint.com/bootstrap-4.0.0/dist/other/prism.min.js"></script>
<link rel="stylesheet" href="https://ux.verint.com/bootstrap-4.0.0/dist/other/prism-coy.min.css">
			
<script>
//
	    // Style multiple input ranges
	    // WARNING: each input range need to have an unique ID
	    //

	    "use strict";
	    const DEBUG = true;

	    var inlineStyle = document.createElement('style');
	    var rangeSelector = document.querySelectorAll('[type=range]');
	    var inlineStyleContent = new Array;

	    document.body.appendChild(inlineStyle);

	    var eventname = new Event('input')

	    for (let item of rangeSelector) {
	      item.addEventListener('input', function() {
	        let rangeInterval = Number(this.getAttribute('max') - this.getAttribute('min'));
	        let rangePercent = (Number(this.value) + Math.abs(this.getAttribute('min'))) / rangeInterval * 100;

	        //DEBUG ? console.log("#" + this.id + ": " + rangePercent + "%") : ''; // for debug

	        writeStyle({
	          id: this.id,
	          percent: rangePercent
	        });
	      }, false);

	      item.dispatchEvent(eventname); // update bars at startup
	    }

	    /**
	     * Write Style element
	     * 
	     * @param {object} obj id: HTML id, percent: value
	     */
	    function writeStyle(obj) {
	      var find = inlineStyleContent.map(x => x.id).indexOf(obj.id);
	      var styleText = "";

	      if (find === -1) {
	        inlineStyleContent.push(obj)
	      } else {
	        inlineStyleContent[find] = obj;
	      }

	      for (let item of inlineStyleContent) {
	        styleText += '#' + item.id + '::-webkit-slider-runnable-track{background-size:' + item.percent + '% 100%} ';
	      }

	      inlineStyle.textContent = styleText;
	    }

 
	     
	     
	    $(function () {
    	    $('.range-container').numericStepButtons();
    	});

    	//simple jQuery plugin
    	$.fn.numericStepButtons = function () {
    	    return this.each(function () {
    	        var $numeric = $('input[type="range"], input[type="number"]', this).eq(0);
    	        $('[type="button"][data-step]', this).on('click', function () {
    	            var step = $(this).data('step');
   	                $numeric[0].stepUp(step);
   	            	$numeric[0].dispatchEvent(new Event('input'));
    	            return false;
    	        });
    	    });
    	};
	     
</script>

<div class="card">
			<div class="card-header">Slider <button id="toggleMarkup" type="button" class="btn btn-sm btn-outline-primary btn btn-fixed-width float-right m-0" onclick="$('pre' ).toggle()">Toggle Markup</button></div>
			<div class="card-body">
				<form>
					<div class="form-group row">
						<label for="inputKey" class="col-lg-2 col-form-label col-form-label-sm">Regular</label>
						<div class="col-lg-4">
							<div class="range-container">
								<button type="button" class="btn icon-btn icon-btn-light btn-sm" data-step="-1">
									<i class="icon-left"></i>
								</button>
								<div class="range-slider">
									<input id="range1" type="range" class="form-control form-control-sm" placeholder="Guiding Text" min="0" max="100" step="10" list="range-slider-ticks">
									<datalist class="range-slider-ticks">
									    <option>0</option>
									    <option>10</option>
									    <option>20</option>
									    <option>30</option>
									    <option>40</option>
									    <option>50</option>
									    <option>60</option>
									    <option>70</option>
									    <option>80</option>
									    <option>90</option>
									    <option>100</option>
									</datalist>
								</div>
								<button type="button" class="btn icon-btn icon-btn-light btn-sm" data-step="1">
									<i class="icon-right"></i>
								</button>
							</div>
						</div>
						<div class="col-lg-6">
							<pre class="language-html"><code><script type="prism-html-markup"><div class="range-container">
	<button type="button" class="btn icon-btn icon-btn-light btn-sm" data-step="-1">
		<i class="icon-left"></i>
	</button>
	<div class="range-slider">
		<input id="range1" type="range" class="form-control form-control-sm" placeholder="Guiding Text" min="0" max="100" step="10" list="range-slider-ticks">
		<datalist class="range-slider-ticks">
			<option>0</option>
			<option>10</option>
			<option>20</option>
			<option>30</option>
			<option>40</option>
			<option>50</option>
			<option>60</option>
			<option>70</option>
			<option>80</option>
			<option>90</option>
			<option>100</option>
		</datalist>
	</div>
	<button type="button" class="btn icon-btn icon-btn-light btn-sm" data-step="1">
		<i class="icon-right"></i>
	</button>
</div></script></code></pre>
						</div>
					</div>
					<div class="form-group row">
						<label for="inputKey" class="col-lg-2 col-form-label col-form-label-sm">Disabled</label>
						<div class="col-lg-4">
							<div class="range-container">
								<button type="button" class="btn icon-btn icon-btn-light btn-sm" data-step="-1" disabled>
									<i class="icon-left"></i>
								</button>
								<div class="range-slider">
									<input id="range2" type="range" class="form-control form-control-sm" placeholder="Guiding Text" min="0" max="100" step="10" list="range-slider-ticks" disabled>
									<datalist class="range-slider-ticks">
									    <option>0</option>
									    <option>10</option>
									    <option>20</option>
									    <option>30</option>
									    <option>40</option>
									    <option>50</option>
									    <option>60</option>
									    <option>70</option>
									    <option>80</option>
									    <option>90</option>
									    <option>100</option>
									</datalist>
								</div>
								<button type="button" class="btn icon-btn icon-btn-light btn-sm" data-step="1" disabled>
									<i class="icon-right"></i>
								</button>
							</div>
						</div>
						<div class="col-lg-6">
							<pre class="language-html"><code><script type="prism-html-markup"><div class="range-container">
	<button type="button" class="btn icon-btn icon-btn-light btn-sm" data-step="-1" disabled>
		<i class="icon-left"></i>
	</button>
	<div class="range-slider">
		<input id="range2" type="range" class="form-control form-control-sm" placeholder="Guiding Text" min="0" max="100" step="10" list="range-slider-ticks" disabled>
		<datalist class="range-slider-ticks">
			<option>0</option>
			<option>10</option>
			<option>20</option>
			<option>30</option>
			<option>40</option>
			<option>50</option>
			<option>60</option>
			<option>70</option>
			<option>80</option>
			<option>90</option>
			<option>100</option>
		</datalist>
	</div>
	<button type="button" class="btn icon-btn icon-btn-light btn-sm" data-step="1" disabled>
		<i class="icon-right"></i>
	</button>
</div></script></code></pre>
						</div>
					</div>
				</form>
			</div>
		</div>