<!DOCTYPE html> <html> <head> <title>Linear Sliders</title> <style> .slider-container { width: 300px; margin: 20px auto; text-align: center; } .slider { width: 100%; height: 30px; position: relative; background: linear-gradient(to right, darkblue, white, darkred); margin-bottom: 20px; } .center-line { position: absolute; width: 2px; height: 100%; background-color: #000; left: 50%; top: 0; } .handle { width: 10px; height: 30px; background-color: #000; position: absolute; cursor: pointer; margin-left: -5px; } .value-input { width: 60px; font-size: 20px; text-align: center; } </style> </head> <body> <div id="slider1-container" class="slider-container"> <div id="slider1" class="slider"> <div class="center-line"></div> <div id="handle1" class="handle"></div> </div> <input type="number" id="value1-input" class="value-input" step="0.1" value="0.0"> </div> <div id="slider2-container" class="slider-container"> <div id="slider2" class="slider"> <div class="center-line"></div> <div id="handle2" class="handle"></div> </div> <input type="number" id="value2-input" class="value-input" step="0.1" value="0.0"> </div> <script> function initializeSlider(sliderId, handleId, inputId) { var slider = document.getElementById(sliderId); var handle = document.getElementById(handleId); var valueInput = document.getElementById(inputId); function setHandlePosition(value) { var sliderRect = slider.getBoundingClientRect(); var newLeft = ((value + 60) / 120) * sliderRect.width; handle.style.left = newLeft + 'px'; } // Initial handle position setHandlePosition(0); handle.onmousedown = function(event) { event.preventDefault(); document.onmousemove = function(event) { var sliderRect = slider.getBoundingClientRect(); var newLeft = event.clientX - sliderRect.left; if (newLeft < 0) newLeft = 0; if (newLeft > sliderRect.width) newLeft = sliderRect.width; handle.style.left = newLeft + 'px'; var value = ((newLeft / sliderRect.width) * 120 - 60).toFixed(1); valueInput.value = value; }; document.onmouseup = function() { document.onmousemove = null; document.onmouseup = null; }; }; valueInput.onchange = function() { var value = parseFloat(valueInput.value); if (isNaN(value)) { value = 0; } if (value < -60) value = -60; if (value > 60) value = 60; setHandlePosition(value); }; } initializeSlider('slider1', 'handle1', 'value1-input'); initializeSlider('slider2', 'handle2', 'value2-input'); </script> </body> </html>