lab_4_19.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const startX = 20;
  2. const startY = 440;
  3. let direction = true; // направление движения true - в сторону увеличения координаты
  4. const delay = 0; // >=0, задержка мсек перед просчетоп следующей координаты
  5. const step = 2; // >0, шаг просчета координат: 1 - каждый пиксель, 2 - каждый второй...
  6. const amplitude = 10; // множитель амплитуды колебаний
  7. const tail = 2500; // длина хвоста "для красоты"
  8. let myCheckbox = document.getElementById("myCheckbox");
  9. myCheckbox.style.left = startX.toString() + "px";
  10. myCheckbox.style.top = startY.toString() + "px";
  11. myCheckbox.onmousemove = (e) => {
  12. e.preventDefault(); // отмена стандартного дествия браузера
  13. myCheckbox.checked = !myCheckbox.checked;
  14. };
  15. myCheckbox.onclick = (e) => {
  16. e.preventDefault(); // отмена стандартного дествия браузера
  17. };
  18. myCheckbox.ondblclick = (e) => {
  19. e.preventDefault(); // отмена стандартного дествия браузера
  20. moveChbox(myCheckbox);
  21. };
  22. const moveChbox = function (element) {
  23. let positionX = +element.style.left.slice(0, -2);
  24. function f(x) {
  25. // поскольку корня квадратного из отрицательного числа не существует
  26. // в качестве аргумента возьмем модуль х
  27. return amplitude * Math.pow(Math.abs(x), 0.5) - 50;
  28. }
  29. // для красоты - рисует точки прохождения на экране
  30. function putPoint(x, y) {
  31. let div = document.createElement("div");
  32. div.classList.add("point");
  33. div.style.top = y;
  34. div.style.left = x;
  35. document.body.append(div);
  36. setTimeout(() => div.remove(), ((delay + 1) * tail) / step);
  37. }
  38. if (
  39. positionX < 0 ||
  40. positionX + element.offsetHeight + element.clientTop >
  41. document.documentElement.clientWidth
  42. ) {
  43. direction = !direction;
  44. }
  45. positionX += direction ? step : -step;
  46. element.style.left = positionX + "px";
  47. element.style.top = `${-f(positionX - startX) + startY - 50}` + "px";
  48. // -50 - компенсация начального скачка функции f()
  49. // для красоты - рисует точки прохождения на экране
  50. putPoint(element.style.left, element.style.top);
  51. setTimeout(() => moveChbox(element), delay);
  52. };