JSFiddle - React, Tailwind, and code Playground
by Keith Jeter
HTML
<!--<div class="center">-->
<!--<div class="header text-violet"><b>Price </b><span>Range</span></div>-->
<div class="price text-blu"><span id="from">$500</span><span> - </span><span id="to">$15,000</span></div>
<!-- <div class="average">
<div>Average price: $1 200</div>
</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>-->
<!-- <a class="inspiration" href="https://www.instagram.com/p/Bs-0fByhwy8/" target="_blank" rel="noopener"><img src="https://upload.wikimedia.org/wikipedia/commons/3/3e/Instagram_simple_icon.svg" alt="inspiration"/></a> -->
CSS
/* *,
*:before,
*:after {
box-sizing: border-box;
cursor: url("https://user-images.githubusercontent.com/9720597/32018236-8e466e82-b9c9-11e7-84a0-038d861bfcd4.png") 32 32, default;
} */
/*
body {
width: 100vw;
height: 100vh;
font-size: 24px;
line-height: 1.3;
font-family: Montserrat, sans-serif;
font-weight: 300;
letter-spacing: 0.7px;
background-color: #efeff6;
} */
/* .inspiration {
position: fixed;
bottom: 0;
right: 0;
padding: 10px;
text-align: center;
text-decoration: none;
font-family: 'Gill Sans', sans-serif;
font-size: 12px;
color: #969696;
} */
/* .inspiration img {
width: 30px;
opacity: 0.6;
} */
/* .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;
}
.header {
margin: 10px 0 20px;
font-size: 32px;
}
b {
font-weight: bold;
}
.average {
margin: 10px 0;
font-size: 18px;
}
.multi-range {
position: relative;
height: 40px;
margin: 30px 0;
}
.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...
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();
});