JSFiddle - React, Tailwind, and code Playground
by Keith Jeter
HTML
<div class="center">
<div class="price text-blu"><span id="from">$500</span><span> - </span><span id="to">$15 000</span></div>
<div class="multi-range">
<input id="min" type="range" min="0" max="100" value="0" step="0.0001"/>
<input id="max" type="range" min="0" max="100" value="100" step="0.0001"/>
</div>
</div>
CSS
.center {
position: absolute;
top: 50%;
left: 50%;
width: 400px;
height: 300px;
padding: 40px;
border-radius: 30px;
transition: transform 0.5s;
transform: translate(-50%, -50%);
background-color: #fff;
}
@media screen and (max-height: 500px) {
.center {
transform: translate(-50%, -50%) scale(0.7);
}
}
.text-blu {
color: #007cbd;
}
.multi-range input[type=range]:nth-child(1)::-webkit-slider-thumb::before {
background-color: #007cbd;
}
.multi-range input[type=range]:nth-child(2) {
background: none;
}
.multi-range input[type=range]:nth-child(2)::-webkit-slider-thumb::before {
background-color: #007cbd;
}
.multi-range input[type=range]::-moz-range-track {
background: none;
}
input[type=range] {
position: absolute;
width: 100%;
padding: 0;
margin: 0;
border: 0;
outline: none;
background: linear-gradient(#007cbd, #007cbd) no-repeat center;
background-size: 100% 2px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
pointer-events: none;
}
input[type=range]:active,
input[type=range]:focus,
input[type=range]::-moz-focus-outer {
border: none;
outline: none;
}
input[type=range]::-moz-range-thumb {
position: relative;
height: 28px;
width: 28px;
margin: 5px 0;
border-radius: 50%;
background-color: #fff;
box-shadow: 0 1px 4px 0.5px rgba(0, 0, 0, 0.3);
-moz-appearance: none;
appearance: none;
pointer-events: all;
}
input[type=range]::-moz-range-thumb:hover {
background-color: #007cbd;
}
input[type=range]::-moz-range-thumb:active {
background-color: #007cbd;
}
input[type=range]::-webkit-slider-thumb {
position: relative;
cursor: pointer;
height: 28px;
width: 28px;
margin: 5px 0;
border-radius: 50%;
background-color: #007cbd;
box-shadow: 0 1px 4px 0.5px rgba(0, 0, 0, 0.3);
-webkit-appearance: none;
appearance: none;
pointer-events: all;
}
input[type=range]::-webkit-slider-thumb:hover {
background-color:...
JavaScript
/*
Inspired by: "Price Range Control"
By: cubertodesign
Link: https://www.instagram.com/p/Bs-0fByhwy8/
*/
let minDollars = 500;
let maxDollars = 15000;
let minSlider = document.querySelector('#min');
let maxSlider = document.querySelector('#max');
function numberWithSpaces(number) {
return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
}
function updateDollars() {
let fromValue = (maxDollars - minDollars) * minSlider.value / 100 + minDollars;
let toValue = (maxDollars - minDollars) * maxSlider.value / 100 + minDollars;
document.querySelector('#from').textContent = `$${numberWithSpaces(Math.floor(fromValue))}`;
document.querySelector('#to').textContent = `$${numberWithSpaces(Math.floor(toValue))}`;
}
maxSlider.addEventListener('input', () => {
let minValue = parseInt(minSlider.value);
let maxValue = parseInt(maxSlider.value);
if (maxValue < minValue + 10) {
minSlider.value = maxValue - 10;
if (minValue === parseInt(minSlider.min)) {
maxSlider.value = 10;
}
}
updateDollars();
});
minSlider.addEventListener('input', () => {
let minValue = parseInt(minSlider.value);
let maxValue = parseInt(maxSlider.value);
if (minValue > maxValue - 10) {
maxSlider.value = minValue + 10;
if (maxValue === parseInt(maxSlider.max)) {
minSlider.value = parseInt(maxSlider.max) - 10;
}
}
updateDollars();
});