function Control(el, { value = 0, min = 0, max = 100, minAngle = 0, maxAngle = 360, wheelSpeed = 0.05, step = 0.1 } = {}) { const img = document.createElement('img') img.src = '1@3x.png' el.append(img) const ratio = (maxAngle - minAngle) / (max - min) const getAngle = () => (value - min) * ratio + minAngle this.setValue = newValue => { if (newValue > max) newValue = max if (newValue < min) newValue = min if (typeof this.onchange === 'function' && newValue !== value) this.onchange(newValue) value = newValue img.style.transform = `rotate(${getAngle()}deg)` } img.onmousewheel = (event) => { const { deltaY } = event this.setValue(value + deltaY * wheelSpeed) event.preventDefault() } img.onclick = (event) => { const { layerX } = event if (layerX < img.width / 2) this.setValue(value - step) else this.setValue(value + step) event.preventDefault() } const event2Deg = event => { const { layerX, layerY } = event const { width, height } = img const x = layerX - width / 2 const y = height / 2 - layerY return ((Math.atan2(y, x) / (2 * Math.PI)) * 360 + 360) % 360 } let prevAngle = null img.onmousedown = (event) => { prevAngle = event2Deg(event) } img.onmousemove = (event) => { if (prevAngle === null) return const currentAngle = event2Deg(event) const deltaValue = (prevAngle - currentAngle) / ratio this.setValue(value + deltaValue) prevAngle = currentAngle event.preventDefault() } img.onmouseup = (event) => { prevAngle = null } this.setValue(value) this.getValue = () => value } const audio = document.querySelector('audio'); const red = new Control(root, { min: 0, max: 255 }) const green = new Control(root, { min: 0, max: 255 }) const blue = new Control(root, { min: 0, max: 255 }) blue.onchange = setRGB; green.onchange = setRGB; red.onchange = setRGB; function setRGB() { document.body.style.backgroundColor = `rgb(${red.getValue()},${green.getValue()},${blue.getValue()})` } const volumeAdjust = new Control(volume, { min: 0, max: 1, wheelSpeed: 0.0005, step: 0.01 }) volumeAdjust.onchange = setVolume; console.log(audio.volume); function setVolume() { console.log(volumeAdjust.getValue(), audio.volume) audio.volume = `${volumeAdjust.getValue()}` }