<input>
elements of type "range"
let the user specify a numeric value which must be no less than a given value, and no more than another given value. The precise value, however, is not considered important. This is typically represented using a slider or dial control rather than a text entry box like the "number" input type. Because this kind of widget is imprecise, it shouldn't typically be used unless the control's exact value isn't important.
<input type="range">
If the user's browser doesn't support type "range"
, it will fall back and treat it as a "text"
input.
Value | A DOMString containing the string representation of the selected numeric value; use valueAsNumber to get the value as a Number . |
Events |
change and input
|
Supported Common Attributes |
autocomplete , list , max , min , and step
|
IDL attributes |
list , value , and valueAsNumber
|
Methods |
stepDown() and stepUp()
|
The value
attribute contains a DOMString
which contains a string representation of the selected number. The value is never an empty string (""
). The default value is halfway between the specified minimum and maximum—unless the maximum is actually less than the minimum, in which case the default is set to the value of the min
attribute. The algorithm for determining the default value is:
defaultValue = (rangeElem.max < rangeElem.min) ? rangeElem.min : rangeElem.min + (rangeElem.max - rangeElem.min)/2;
If an attempt is made to set the value lower than the minimum, it is set to the minimum. Similarly, an attempt to set the value higher than the maximum results in it being set to the maximum.
While the "number"
type lets users enter a number with optional constraints forcing their value to be between a minimum and a maximum value, it does require that they enter a specific value. The "range"
input type lets you ask the user for a value in cases where the user may not even care—or know—what the specific numeric value selected is.
A few examples of situations in which range inputs are commonly used:
As a rule, if the user is more likely to be interested in the percentage of the distance between minimum and maximum values than the actual number itself, a range input is a great candidate. For example, in the case of a home stereo volume control, users typically think "set volume at halfway to maximum" instead of "set volume to 0.5".
By default, the minimum is 0 and the maximum is 100. If that's not what you want, you can easily specify different bounds by changing the values of the min
and/or max
attributes. These can be any floating-point value.
For example, to ask the user for a value between -10 and 10, you can use:
<input type="range" min="-10" max="10">
By default, the granularity, is 1, meaning that the value is always an integer. You can change the step
attribute to control the granularity. For example, If you need a value between 5 and 10, accurate to two decimal places, you should set the value of step
to 0.01:
<input type="range" min="5" max="10" step="0.01">
If you want to accept any value regardless of how many decimal places it extends to, you can specify a value of "any"
for the step
attribute:
<input type="range" min="0" max="3.14" step="any">
This example lets the user select any value between 0 and π without any restriction on the fractional part of the value selected.
The HTML specification gives browsers some flexibility on how to present the range control. Nowhere is this flexibility more apparent than in the area of hash marks and, to a lesser degree, labels. The specification describes how to add custom points to the range control using the list
attribute and a <datalist>
element, but does not have any requirements or even recommendations for standardized hash or tick marks along the length of the control.
Since browsers have this flexibility, and to date none support all of the features HTML defines for range controls, here are some mockups to show you what you might get on macOS in a browser which supports them.
This is what you get if you don't specify a list
attribute, or if the browser doesn't support it.
HTML | Screenshot |
---|---|
<input type="range"> |
This range control is using a list
attribute specifying the ID of a <datalist>
which defines a series of hash marks on the control. There are eleven of them, so that there's one at 0% as well as at each 10% mark. Each point is represented using an <option>
element with its value
set to the range's value at which a mark should be drawn.
HTML | Screenshot |
---|---|
<input type="range" list="tickmarks"> <datalist id="tickmarks"> <option value="0"> <option value="10"> <option value="20"> <option value="30"> <option value="40"> <option value="50"> <option value="60"> <option value="70"> <option value="80"> <option value="90"> <option value="100"> </datalist> |
You can add labels to your range control by adding the label
attribute to the <option>
elements corresponding to the tick marks you wish to have labels for.
HTML | Screenshot |
---|---|
<input type="range" list="tickmarks"> <datalist id="tickmarks"> <option value="0" label="0%"> <option value="10"> <option value="20"> <option value="30"> <option value="40"> <option value="50" label="50%"> <option value="60"> <option value="70"> <option value="80"> <option value="90"> <option value="100" label="100%"> </datalist> |
Note: Currently, no browser fully supports these features. Firefox doesn't support hash marks and labels at all, for example, while Chrome supports the hash marks but doesn't support labels.
The HTML specification recommends that browsers automatically switch to drawing range controls vertically if the specified width is less than the height. Unfortunately, no major browsers currently support vertical range controls directly. You can, however, create a vertical range control by drawing a horizontal range control on its side. The easiest way is to use CSS: by applying a transform
to rotate the element, you can make it vertical. Let's take a look.
The HTML needs to be updated to wrap the <input>
in a <div>
to let us correct the layout after the transform is performed (since transforms don't automatically affect the layout of the page):
<div class="slider-wrapper"> <input type="range" min="0" max="11" value="7" step="1"> </div>
Now we need some CSS. First is the CSS for the wrapper itself; this specifies the display mode and size we want so that the page lays out correctly; in essence, it's reserving an area of the page for the slider so that the rotated slider fits into the reserved space without making a mess of things.
.slider-wrapper { display: inline-block; width: 20px; height: 150px; padding: 0; }Then comes the style information for the
<input>
element within the reserved space: .slider-wrapper input { width: 150px; height: 20px; margin: 0; transform-origin: 75px 75px; transform: rotate(-90deg); }
The size of the control is set to be 150 pixels long by 20 pixels tall. The margins are set to 0 and the transform-origin
is shifted to the middle of the space the slider rotates through; since the slider is configured to be 150 pixels wide, it rotates through a box which is 150 pixels on each side. Offsetting the origin by 75px on each axis means we will rotate around the center of that space. Finally, we rotate counter-clockwise by 90°. The result: a range input which is rotated so the maximum value is at the top and the minimum value is at the bottom.
Screenshot | Live sample |
---|---|
There is no pattern validation available; however, the following forms of automatic validation are performed:
value
is set to something which can't be converted into a valid floating-point number, validation fails because the input is suffering from a bad input.min
. The default is 0.max
. The default is 100.step
. The default is 1.In addition to the assorted examples above, you'll find range inputs demonstrated in these articles:
Specification | Status | Comment |
---|---|---|
HTML Living Standard The definition of '<input type="range">' in that specification. | Living Standard | Initial definition |
HTML 5.1 The definition of '<input type="range">' in that specification. | Recommendation | Initial definition |
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | 4.0[2] | 12 | 23 (23)[1][4] | 10 | 10.1 | 3.1 |
Feature | Android | Chrome for Android | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support | 2.1[3] | 57[2] | (Yes) | 52.0 (52)[1] | 10 | (Yes) | 5.1 |
[1] While the specification says that the range input should be drawn vertically if the height is greater than the width, this behavior is not currently implemented. See these Firefox bugs for more information: bug 840820 and bug 981916.
[2] Chrome implements the slider-vertical
value for the non-standard -webkit-appearance
property. You shouldn't use this, since it's proprietary, unless you include appropriate fallbacks for users of other browsers.
[3] The Android browser recognizes the "range"
type starting with version 2.1, but doesn't fully implement it until version 4.3.
[4] Drawing of hash/tick marks is not yet implemented. See bug 841942 for more information.
<input>
and the HTMLInputElement
interface it's based upon<input type="number">
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/range