JSFiddle - React, Tailwind, and code Playground
HTML
<div class="calc">
<div class="calc__head">
<h2 class="calc__title">How match can you earn?</h2>
<h3 class="calc__price">
<span class="calc__price-curr">$</span>
<span class="calc__price-total">1800</span>
<span class="calc__price-time">/ wk</span>
</h3>
</div>
<form action="#" class="calc__form" method="POST">
<div class="calc__item">
<div class="range">
<input type="range" class="range__control" name="range-1" min="1" max="50" value="15" aria-label="Amount per class">
<div class="range__content">
<div class="range__caption">Amount per class</div>
<div class="range__num range__num--curr"></div>
</div>
</div>
</div>
<div class="calc__item">
<div class="range">
<input type="range" class="range__control" name="range-2" min="1" max="30" value="20" aria-label="No. of attendees">
<div class="range__content">
<div class="range__caption">No. of attendees</div>
<div class="range__num range__num--simple"></div>
</div>
</div>
</div>
<div class="calc__item">
<div class="range">
<input type="range" class="range__control" name="range-3" min="1" max="16" value="6" aria-label="No. of classes per week">
<div class="range__content">
<div class="range__caption">No. of classes per week</div>
<div class="range__num range__num--simple"></div>
</div>
</div>
</div>
</form>
<div class="calc__foot">
<div class="calc__info">Lorem ipsum dolor sit, amet consectetur adipisicing elit. Officiis aperiam aut officia
voluptates. Id aliquam qui consequatur alias.</div>
</div>
</div>
CSS
@charset "UTF-8";
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}
*,
*:before,
*:after {
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
html {
font-family: sans-serif;
-ms-text-size-adjust: 100%;
...
JavaScript
(function () {
'use strict'
// range
const form = document.querySelector('.calc__form');
const controls = document.querySelectorAll('.range__control');
function updateRangeInputBg(el) {
el.style.background = 'linear-gradient(to right, #F7CC6B 0%, #F7CC6B ' + ((el.value * 100 / (el.max - 1)) - (100 / el.max)) + '%, #F9ECCD ' + ((el.value * 100 / (el.max - 1)) - (100 / el.max)) + '%, #F9ECCD 100%)'
}
function updateRangeNum(el) {
el.closest('.range').querySelector('.range__num').textContent = parseFloat(el.value, 10);
}
function updateTotalPrice(el) {
console.log(el.value)
el.closest('.calc').querySelector('.calc__price-total').textContent = parseFloat(el.value, 10);
}
controls.forEach(control => {
updateRangeNum(control);
updateRangeInputBg(control);
updateTotalPrice(control);
});
function onChange(e) {
updateRangeNum(e.target);
updateRangeInputBg(e.target);
updateTotalPrice(e.target);
}
form.addEventListener('input', (e) => {
e.preventDefault();
onChange(e);
});
})();