JSFiddle - React, Tailwind, and code Playground
by Keith Jeter
HTML
<p>Price Range</p>
<div class="range-slider">
<span class="rangeValues"></span>
<input value="1000" min="1000" max="50000" step="500" type="range">
<input value="50000" min="1000" max="50000" step="500" type="range">
</div>
CSS
.range-slider {
width: 300px;
text-align: center;
position: relative;
}
.range-slider .rangeValues {
display: block;
}
input[type=range] {
-webkit-appearance: none;
border: 1px solid white;
width: 300px;
position: absolute;
left: 0;
}
input[type=range]::-webkit-slider-runnable-track {
width: 300px;
height: 5px;
background: #ddd;
border: none;
border-radius: 3px;
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background: #007cbd;
margin-top: -5px;
cursor: pointer;
position: relative;
z-index: 1;
}
input[type=range]:focus {
outline: none;
}
input[type=range]:focus::-webkit-slider-runnable-track {
background: #ccc;
}
input[type=range]::-moz-range-track {
width: 300px;
height: 5px;
background: #ddd;
border: none;
border-radius: 3px;
}
input[type=range]::-moz-range-thumb {
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background: #21c1ff;
}
/*hide the outline behind the border*/
input[type=range]:-moz-focusring {
outline: 1px solid white;
outline-offset: -1px;
}
input[type=range]::-ms-track {
width: 300px;
height: 5px;
/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
background: transparent;
/*leave room for the larger thumb to overflow with a transparent border */
border-color: transparent;
border-width: 6px 0;
/*remove default tick marks*/
color: transparent;
z-index: -4;
}
input[type=range]::-ms-fill-lower {
background: #777;
border-radius: 10px;
}
input[type=range]::-ms-fill-upper {
background: #ddd;
border-radius: 10px;
}
input[type=range]::-ms-thumb {
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background: #007cbd;
}
input[type=range]:focus::-ms-fill-lower {
background: #888;
}
input[type=range]:focus::-ms-fill-upper {
background: #ccc;
}
JavaScript
function getVals(){
// Get slider values
let parent = this.parentNode;
let slides = parent.getElementsByTagName("input");
let slide1 = parseFloat( slides[0].value );
let slide2 = parseFloat( slides[1].value );
// Neither slider will clip the other, so make sure we determine which is larger
if( slide1 > slide2 ){ let tmp = slide2; slide2 = slide1; slide1 = tmp; }
let displayElement = parent.getElementsByClassName("rangeValues")[0];
displayElement.innerHTML = "$" + slide1 + " - $" + slide2;
}
window.onload = function(){
// Initialize Sliders
let sliderSections = document.getElementsByClassName("range-slider");
for( let x = 0; x < sliderSections.length; x++ ){
let sliders = sliderSections[x].getElementsByTagName("input");
for( let y = 0; y < sliders.length; y++ ){
if( sliders[y].type ==="range" ){
sliders[y].oninput = getVals;
// Manually trigger event first time to display values
sliders[y].oninput();
}
}
}
}