lab_4_2.js 2.5 KB

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