JSFiddle - React, Tailwind, and code Playground
HTML
<div id="container">
<output style="position:absolute; min-width:100px; text-align: center;" id="myValue"><div id="myValueInner">
</div></output>
<input type="range" id="myRange" min="0" max="200" step="5" value="150">
</div>
CSS
#container {
position: relative;
box-sizing: border-box;
margin: 0 auto;
width: 90%;
margin-top: 80px;
}
#myRange {
width: 100%;
margin: 0;
}
#myValue {
background: black;
}
#myValue #myValueInner {
width: 50%;
background: gold;
}
JavaScript
var myRange = document.querySelector('#myRange');
var myValue = document.querySelector('#myValue');
var myValueInner = document.querySelector('#myValueInner');
var buttonWidth = 15;
var range = parseInt(myRange.max) - parseInt(myRange.min)
var centerDotOffset = (myRange.valueAsNumber / range - 0.5) * buttonWidth
var off = myRange.clientWidth / range;
var px = ((myRange.valueAsNumber - parseInt(myRange.min)) * off) - (myValue.clientWidth / 2) - centerDotOffset;
myValue.style.left = px + 'px';
myValue.style.top = -myRange.offsetHeight - 5 + 'px';
myValueInner.innerHTML = myRange.value;
myRange.oninput = function() {
var centerDotOffset = (myRange.valueAsNumber / range - 0.5) * buttonWidth
let px = ((myRange.valueAsNumber - parseInt(myRange.min)) * off) - (myValue.clientWidth / 2) - centerDotOffset;
myValueInner.innerHTML = myRange.value;
myValue.style.left = px + 'px';
};