function Control(el, {value=0, min=0, max=100, minAngle=0, maxAngle=360, wheelSpeed=0.1, step=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 (newValue !== value && typeof this.onchange === "function") this.onchange(newValue); value = newValue; img.style.transform = `rotate(${getAngle()}deg)`; } this.setValue(value); this.getValue = () => value; img.onmousewheel = event => { const {deltaY} = event event.preventDefault() this.setValue(value + deltaY * wheelSpeed); } const rad2deg = rad => (rad * 360) / (2 * Math.PI) const event2Angle = event => { const {layerX,layerY} = event const rad2deg = rad => (rad * 360) / (2 * Math.PI) const x = layerX - img.width/2 const y = -(layerY - img.height/2) /* console.log(x,y, rad2deg(Math.atan2(y,x))); */ return rad2deg(Math.atan2(y,x)); } img.onclick = event => { const {layerX,layerY} = event /* console.log(event); */ if(layerX < img.width/2){ this.setValue(value - step) } else { this.setValue(value + step) } } let startAngle = null; img.onmousedown = event => { startAngle = event2Angle(event) event.preventDefault(); } img.onmousemove = event => { if(startAngle === null) return const newAngle = event2Angle(event) const angleDiff = newAngle - startAngle; const valueDiff = angleDiff/ratio; this.setValue(value-valueDiff); startAngle = newAngle event.preventDefault() } img.onmouseup = event => { startAngle = null; event.preventDefault(); } } /* let container1 = document.getElementById('container1'); */ const volumeControl = new Control(container1, {value:25,min:0,max:100,minAngle: -90, maxAngle:90}); //пришейте к нему тэг audio для громкости let audio = document.getElementById('audio1'); const volumeControl1 = new Control(container1,{min:0, max:1, wheelSpeed:0.001}); function setVolume(){ audio.volume = `${volumeControl1.getValue()}`; } volumeControl1.onchange = setVolume function setRGB(){ document.body.style.backgroundColor = `rgb(${red.getValue()},${green.getValue()},${blue.getValue()})`; //какой то блок, которому меняем цвет через rgba и цвета крутилок } const red = new Control(color, {min: 0, max: 255}) red.onchange = setRGB const blue = new Control(color, {min: 0, max: 255}) blue.onchange = setRGB const green = new Control(color, {min:0, max: 255}) green.onchange = setRGB //const red = new Control(container1, {min: 0, max: 255}) //volumeControl.onchange = setRGB //const green = new Control(container1, {min: 0, max: 255}) //volumeControl.onchange = setRGB //const blue = new Control(container1, {min: 0, max: 255}) //volumeControl.onchange = setRGB ////сделать три крутилки для RGB ////и обновлять цвет блока/фона блока при вращении любой из трех //setTimeout(() => volumeControl.setValue(80), 2000)