lab_9_02.js 2.6 KB

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