scripts.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. function Control(el, { value = 0,
  2. min = 0,
  3. max = 100,
  4. minAngle = 0,
  5. maxAngle = 360,
  6. wheelSpeed = 0.1,
  7. step = 1 } = {}) {
  8. const img = document.createElement('img')
  9. img.src = '1@3x.png'
  10. img.style.width = '100%'
  11. img.style.height = 'auto'
  12. el.append(img)
  13. let forceChange = new Event('change')
  14. this.currentValue = document.createElement('input')
  15. this.currentValue.type = 'number'
  16. this.currentValue.value = value
  17. const ratio = (maxAngle - minAngle) / (max - min)
  18. const getAngle = () => (value - min) * ratio + minAngle
  19. this.getValue = () => {
  20. return value
  21. }
  22. this.setValue = newValue => {
  23. if (newValue > max) {
  24. newValue = max
  25. }
  26. if (newValue < min) {
  27. newValue = min
  28. }
  29. value = newValue
  30. this.currentValue.value = value
  31. this.currentValue.dispatchEvent(forceChange)
  32. img.style.transform = `rotate(${getAngle()}deg)`
  33. }
  34. img.onmousewheel = e => {
  35. const { deltaY } = e
  36. const newValue = value + deltaY * wheelSpeed
  37. this.setValue(newValue)
  38. e.preventDefault()
  39. }
  40. img.onclick = e => {
  41. console.log(e, img.width)
  42. const { layerX } = e
  43. const { width } = img
  44. layerX > width / 2? this.setValue(value + step) : this.setValue(value - step)
  45. console.log(value)
  46. }
  47. const toDeg = rad => ((rad * 180) / Math.PI + 360 + 90) % 360
  48. let prevMouseAngle = null
  49. img.onmousedown = e => {
  50. const y = e.layerY - img.height / 2
  51. const x = e.layerX - img.width / 2
  52. prevMouseAngle = toDeg(Math.atan2(y, x))
  53. e.preventDefault()
  54. }
  55. img.onmousemove = e => {
  56. if (prevMouseAngle === null) return
  57. console.log(value)
  58. const y = e.layerY - img.height / 2
  59. const x = e.layerX - img.width / 2
  60. let currentAngle = toDeg(Math.atan2(y, x))
  61. let moveAngleDiff = (currentAngle - prevMouseAngle)
  62. this.setValue(value + moveAngleDiff / ratio)
  63. prevMouseAngle = currentAngle
  64. }
  65. img.onmouseout = img.onmouseup = () => {
  66. prevMouseAngle = null
  67. }
  68. this.setValue(value)
  69. }
  70. let track = document.getElementById('track')
  71. let audioSpin = document.getElementById('audio-spin')
  72. const volumeControl = new Control(audioSpin, { value: 50, min: 0, max: 100, minAngle: 0, maxAngle: 360 })
  73. track.volume = volumeControl.getValue() / 100
  74. volumeControl.currentValue.onchange = () => track.volume = volumeControl.getValue() / 100
  75. // RGB
  76. const Red = new Control(red, {min: 0, max: 255})
  77. const Green = new Control(green, {value: 200, min: 0, max: 255})
  78. const Blue = new Control(blue, {value: 125, min: 0, max: 255})
  79. let setRGB = (element) => {
  80. element.style.backgroundColor = `rgb(${Red.getValue()||0}, ${Green.getValue()||0}, ${Blue.getValue()||0})`
  81. }
  82. setRGB(document.getElementById('color-window'))
  83. Red.currentValue.onchange = () => setRGB(document.getElementById('color-window'))
  84. Green.currentValue.onchange = () => setRGB(document.getElementById('color-window'))
  85. Blue.currentValue.onchange = () => setRGB(document.getElementById('color-window'))