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-violet"><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-violet {
  color: #504d9b;
}
.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: #808080;
}
.multi-range input[type=range]:nth-child(2) {
  background: none;
}
.multi-range input[type=range]:nth-child(2)::-webkit-slider-thumb::before {
  background-color: #808080;
}
.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(#504d9b, #504d9b) 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:...

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();
});