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.cssinsidedemofolder)
- 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
divDOM 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 thedivcontainer 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
objectfor two way sliders ornumberfor 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 === trueor a floating point number otherwise
right
- value of the right handle of the slider
- can be a date object if slider
isDate === trueor a floating point number otherwise
preventPublish
- type
boolean- if true then it won't publish the
movingtopic 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 valueIf 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-fillis 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 withleftandrightproperties.
left
- value of the left handle of the slider
- can be a date object if slider
isDate === trueor a floating point number otherwise
right
- value of the right handle of the slider
- can be a date object if slider
isDate === trueor 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
touchmoveto 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
.cssfile not a.scssfile so if the build process does not import.cssit won't get taken.
Workaround: rename the .css file into .scss
omni-slider is released under the MIT license.