script.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. function Control(
  2. el, {
  3. value = 0,
  4. step = 1,
  5. max = 100,
  6. min = 0,
  7. maxAngle = 360,
  8. minAngle = 0
  9. } = {}
  10. ) {
  11. const img = document.createElement("img");
  12. img.src = "1@3x.png";
  13. img.width = "250";
  14. el.append(img);
  15. const ratio = (maxAngle - minAngle) / (max - min);
  16. const value2Deg = () => ratio * (value - min) + minAngle;
  17. const changeValue = (delta, fireEvent = false) => {
  18. let newValue = value + delta;
  19. if (newValue >= max) newValue = max;
  20. if (newValue <= min) newValue = min;
  21. value = newValue;
  22. if (fireEvent && this.onChange && typeof this.onChange === "function") {
  23. this.onChange(value);
  24. }
  25. img.style.transform = `rotate(${value2Deg()}deg)`;
  26. };
  27. const {
  28. top,
  29. left
  30. } = img.getBoundingClientRect();
  31. changeValue(0);
  32. console.log(img.width, top, left);
  33. img.onclick = (e) => {
  34. changeValue(e.clientX - left > img.width / 2 ? step : -step, true);
  35. };
  36. img.onmousewheel = (e) => {
  37. changeValue((e.deltaY * step) / 25, true);
  38. e.preventDefault();
  39. };
  40. let startDragAngle;
  41. const calcAngle = ({
  42. layerX,
  43. layerY
  44. }) => {
  45. const deltaX = layerX - img.width / 2;
  46. const deltaY = layerY - img.height / 2;
  47. return (Math.atan2(deltaY, deltaX) / Math.PI) * 180;
  48. };
  49. img.onmousedown = (e) => {
  50. startDragAngle = calcAngle(e);
  51. e.preventDefault();
  52. };
  53. img.onmousemove = (e) => {
  54. if (startDragAngle !== undefined) {
  55. const currentAngle = calcAngle(e);
  56. let deltaAngle = currentAngle - startDragAngle;
  57. // дальше идет коррекция перехода через +-180 градусов
  58. // но из-за функции onclick осталось иногда подергивание
  59. // при выкручивании в крайние положения
  60. // onclick пришлось отключить
  61. if (Math.abs(deltaAngle) >= 180) {
  62. deltaAngle += deltaAngle < 0 ? 360 : -360;
  63. } else {
  64. deltaAngle += deltaAngle < 0 ? -360 : 360;
  65. }
  66. deltaAngle = deltaAngle % 360;
  67. changeValue(deltaAngle / ratio, true);
  68. startDragAngle = currentAngle;
  69. e.preventDefault();
  70. }
  71. };
  72. img.onmouseup = img.onmouseout = (e) => {
  73. if (startDragAngle) {
  74. startDragAngle = undefined;
  75. e.preventDefault();
  76. }
  77. };
  78. this.setValue = (v) => changeValue(v - value);
  79. this.changeValue = changeValue;
  80. this.getValue = () => value;
  81. }
  82. const volumeControl = new Control(container1, {
  83. value: 50, max: 1, step: 0.01
  84. });
  85. let volumeMp3 = document.getElementById("audio");
  86. // volumeControl.onChange = (value) => console.log("VOLUME", value);
  87. volumeControl.onChange = (value) => volumeMp3.volume = value;
  88. const redControl = new Control(color1, {
  89. maxAngle: 90,
  90. minAngle: -90,
  91. min: 0,
  92. max: 255,
  93. value: 0,
  94. });
  95. const greenControl = new Control(color2, {
  96. maxAngle: 90,
  97. minAngle: -90,
  98. min: 0,
  99. max: 255,
  100. value: 0,
  101. });
  102. const blueControl = new Control(color3, {
  103. maxAngle: 90,
  104. minAngle: -90,
  105. min: 0,
  106. max: 255,
  107. value: 0,
  108. });
  109. redControl.onChange = (x) => RGB.style.background = `rgb(${x}, ${greenControl.getValue()}, ${blueControl.getValue()})`;
  110. greenControl.onChange = (x) => RGB.style.background = `rgb(${redControl.getValue()}, ${x}, ${blueControl.getValue()})`;
  111. blueControl.onChange = (x) => RGB.style.background = `rgb(${redControl.getValue()}, ${greenControl.getValue()}, ${x})`;
  112. // value = 0,
  113. // step = 1,
  114. // max = 100,
  115. // min = 0,
  116. // maxAngle = 360,
  117. // minAngle = 0