Pārlūkot izejas kodu

color tuner created
:wq

vladislavaSim 1 gadu atpakaļ
vecāks
revīzija
b710d96803
3 mainītis faili ar 107 papildinājumiem un 0 dzēšanām
  1. BIN
      tuner/13x.png
  2. 29 0
      tuner/index.html
  3. 78 0
      tuner/index.js

BIN
tuner/13x.png


+ 29 - 0
tuner/index.html

@@ -0,0 +1,29 @@
+<html>
+<head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width" />
+    <title>Tuner</title>
+    <style>
+        #container1 {
+            padding: 400px;
+        }
+        #container2 > img{
+            width: 100px;
+            height: 100px;
+            margin: 15px;
+        }
+        #colorBox {
+            width: 500px;
+            height: 100px;
+            border: 1px solid black;
+        }
+    </style>
+</head>
+<body>
+<div id='container1'></div>
+<div id='container2'></div>
+
+<div id="colorBox"></div>
+<script src='index.js'></script>
+</body>
+</html>

+ 78 - 0
tuner/index.js

@@ -0,0 +1,78 @@
+function Control(el, {value=50,
+    min=0,
+    max=100,
+    minAngle=-90,
+    maxAngle=90,
+    wheelSpeed=0.1,
+    step=1}={}){
+
+    const img = document.createElement('img')
+    img.src   = '13x.png'
+    el.append(img)
+
+    const ratio    = (maxAngle - minAngle) / (max - min) //цена единицы value в градусах
+    const getAngle = () => (value - min) * ratio + minAngle //подсчитали отступ в единицах, пересчитали в градусы и прибавили к стартовому углу
+
+
+    this.setValue = (newValue) => {
+        if (newValue < min){
+            newValue = min
+        }
+
+        if (newValue > max){
+            newValue = max
+        }
+
+        value = newValue
+
+        if (typeof this.onchange === 'function'){
+            this.onchange(value)
+        }
+
+        img.style.transform = `rotate(${getAngle()}deg)`
+    }
+
+    this.getValue = () => value
+
+    img.onmousewheel = (e) => {
+        const {deltaY} = e
+        //console.log(deltaY)
+        e.preventDefault()
+
+        this.setValue(value + deltaY*wheelSpeed)
+    }
+
+    img.onclick = (e) => {
+        const {layerX} = e
+        console.log(e, layerX)
+        if (layerX > img.width/2)
+            this.setValue(value +step)
+        else
+            this.setValue(value -step)
+    }
+
+    this.setValue(value)
+}
+
+
+
+const volumeControl  = new Control(container1, {value: 75, minAngle: -180})
+volumeControl.onchange = (value => console.log('ON CHANGE', value)) //на каждый setValue
+//console.log(volumeControl.getValue())
+//пришейте к нему тэг audio для громкости
+
+function setRGB(value, n){
+    let arr = ['rgb', '(', red.getValue(), ', ', green.getValue(), ', ', blue.getValue(), ')']
+            arr[n + n + 2] = value
+    colorBox.style.backgroundColor = arr.join('')
+}
+
+
+const red  = new Control(container2, {min: 0, max: 255})
+red.onchange = (value) => setRGB(value,0)
+const green  = new Control(container2, {min: 0, max: 255})
+green.onchange = (value) => setRGB(value,1)
+const blue  = new Control(container2, {min: 0, max: 255})
+blue.onchange = (value) => setRGB(value,2)
+
+//setTimeout(() => volumeControl.setValue(80), 2000)