This is a JavaScript implementation of a slider to select a numeric value or a range. The slider is horizontal and can be implemented with one handle or two. Following are some technical details for the omni-slider:
- Vanilla JS
- 9.34 KB minified
- 18.86 KB unminified
Three ways to try out the Priceline omni-slider:
- Use it to live search at priceline.com
- View the functionality on our demo page
- Download the demo with the omni-slider source file ZIP
- Two handle sliding to select a numeric range
- One handle sliding from left/minimum to right/maximum
- Touch and mouse capability
- Currency (
typeof Number
) or Date (typeof Date
) - Custom minimum and maximum values
- Pub/sub implementation for each state in the process
- Overlap and touching each other for final state
- Preset the initial location of the handles
- Push data into slider (setting the value)
- Can be disabled
- Can change design using css (see
fly.css
insidedemo
folder)
- IE9
- IE11
- Chrome
- Safari
- Mobile Safari
- Android Default Browser
<link rel="stylesheet" href="reset.css">
<link rel="stylesheet" href="omni-slider.css">
<script type="text/javascript" src="es5-shim.js"></script>
<script type="text/javascript" src="omni-slider.js"></script>
var element = document.getElementById('harryPotter');
var options = {
isDate: false,
min: 3,
max: 1980,
start: 7,
end: 31,
overlap: false
};
var mySlider = new Slider(element, options);
</script>
Defines the slider features:
- one handle (minimum/maximum) or two handle (range)
- currency or date
<elementContainer>
- expects a
div
DOM element or node that acts as a wrapper for the slider- all of the slider's DOM elements will be transcluded inside the
<elementContainer>
provided
<options>
- must be of type
object
- defines the following currently supported slider options
isOneWay
- Boolean, denotes if slider only has one handleisDate
- Boolean, denotes if returning a date objectoverlap
- Boolean, denotes if handles will overlap or just sit next to each othercallbackFunction
- Function, denotes if a generic callback function is provided to apply to the value of the Slidermin
- Lower bounds of the slider (if isDate true typeof String [yyyy-mm-ddThh:mm] else typeof Number)max
- Upper bounds of the slider (if isDate true typeof String [yyyy-mm-ddThh:mm] else typeof Number)start
- Initial starting position of the left hand slider (if isDate true typeof String [yyyy-mm-ddThh:mm] else typeof Number)end
- Initial starting position of the right hand slider (if isDate true typeof String [yyyy-mm-ddThh:mm] else typeof Number)
<elementContainer>
- is thediv
container element
<options>
- can be defined to customize the slider
var mySlider = new Slider(element, options);
var harry = mySlider.subscribe('start', function(data) {
console.log('harry ' + data.left);
});
var potter = mySlider.subscribe('moving', function(data) {
console.log('potter ' + data.right);
});
var data = mySlider.subscribe('start', function(data) {
console.log(data);
});
potter.remove();
var hermione = mySlider.subscribe('moving', function(data) {
console.log('hermione ' + data.right + data.left);
});
topic
(type String)
start
- triggers when the handle is selectedmoving
- triggers when the handle is being movedstop
- triggers when the handle is released
listener
(type Function)
- will receive the result of
Slider.prototype.getInfo()
as an argument- will be called with the argument (above) once the topic has been fired/published
returns
- an object with accessor method
remove()
which removes the listener from binding to the topic
This can be used to preset a handle at a specific value upon initially generating the page or it can move a slider handle based on value typed in a field. It also initially checks whether the handles are overlapping and for other built-in features.
// Two Way
var mySlider = new Slider(... , {isOneWay: false});
var data = {
left: 7,
right: 31
};
mySlider.move(data);
// One Way
var myOneWaySlider = new Slider(... , {isDate: true, isOneWay: true});
myOneWaySlider.move(new Date('1980-07-31'));
data
- type
object
for two way sliders ornumber
for one way sliders- if it is an object it should be constructed:
left
- value of the left handle of the slider
- can be a date object if slider
isDate === true
or a floating point number otherwise
right
- value of the right handle of the slider
- can be a date object if slider
isDate === true
or a floating point number otherwise
preventPublish
- type
boolean
- if true then it won't publish the
moving
topic otherwise it willReverse of
Slider.prototype.getInfo()
in terms of data provided. If you are setting a two way slider then you pass in an object otherwise if it is a one way slider you only pass in a value.
Example for a two handle slider
var mySlider = new Slider(...);
var data = mySlider.getInfo();
console.log(data.left); // left handle value
console.log(data.right); // right handle value
If it is a one handle slider, then it will return just the value rather than an object. In this case, the value is calculated from the left handle rather than the fill.
Essentially the data for the slider is always available since the
slider-fill
is made up of percentages.slider.getInfo()
merely extracts the said percentages and generates a human-readable value based on the context of the application (either date or currency).Slider.getInfo()
returns an object withleft
andright
properties.
left
- value of the left handle of the slider
- can be a date object if slider
isDate === true
or a floating point number otherwise
right
- value of the right handle of the slider
- can be a date object if slider
isDate === true
or a floating point number otherwise
var disabledSlider = new Slider(document.getElementById('disabledSlider'), {
overlap: true
});
disabledSlider.disable(true);
Makes the slider handle unmovable
To develop new features on top of this slider first download and build it with dependencies listed in package.json
.
npm install
npm start
- Chrome Device Emulator does not allow us to bind
touchmove
to thedocument
(i.e.document.addEventListener('touchmove', this.movingHandler, true);
).
Workaround: disable emulate touch screen under Emulation at the bottom tabs of dev tools
- Provided style sheet is a
.css
file not a.scss
file so if the build process does not import.css
it won't get taken.
Workaround: rename the .css
file into .scss
omni-slider is released under the MIT license.