index.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import React, { useEffect, useMemo, useRef, useState } from "react";
  2. import styles from "./index.module.scss";
  3. import classNames from "classnames";
  4. import { envUrl } from "@/utils/env";
  5. import { maoData2, mapData1 } from "./data";
  6. import iconImg1 from "@/assets/img/map/icon1.png";
  7. import iconImg1Ac from "@/assets/img/map/icon1Ac.png";
  8. import iconImg2 from "@/assets/img/map/icon2.png";
  9. import iconImg2Ac from "@/assets/img/map/icon2Ac.png";
  10. type Props = {
  11. type: number;
  12. };
  13. function A0Map({ type }: Props) {
  14. const [videoInd, setVidoeInd] = useState(true);
  15. const [moveInd, setMoveInd] = useState(0);
  16. // 30个动画帧div
  17. const moveDiv = useMemo(() => {
  18. const arr = [];
  19. for (let i = 0; i <= 30; i++) {
  20. arr.push(
  21. <div
  22. className={classNames("videoRow", moveInd === i ? "videoRowAc" : "")}
  23. key={i}
  24. >
  25. <img src={`${envUrl}/yunMove/yan_${i}.png`} alt="" />
  26. </div>
  27. );
  28. }
  29. return arr;
  30. }, [moveInd]);
  31. const moveTime = useRef(-1);
  32. useEffect(() => {
  33. if (videoInd) {
  34. clearInterval(moveTime.current);
  35. let num = 0;
  36. moveTime.current = window.setInterval(() => {
  37. setMoveInd(num);
  38. num++;
  39. if (num > 30) {
  40. clearInterval(moveTime.current);
  41. setVidoeInd(false);
  42. }
  43. }, 50);
  44. }
  45. return () => {
  46. clearInterval(moveTime.current);
  47. };
  48. }, [videoInd]);
  49. return (
  50. <div className={styles.A0Map}>
  51. {/* 开场动画帧 */}
  52. <div
  53. className={classNames("videoBoxMove", !videoInd ? "videoBoxHide" : "")}
  54. >
  55. {moveDiv}
  56. </div>
  57. {/* 一级地图 */}
  58. <div
  59. className={classNames(
  60. "mapMain",
  61. type === 2 ? "mapMain2" : type === 3 ? "mapMain3" : ""
  62. )}
  63. >
  64. {/* 定位大图标 */}
  65. {mapData1.map((v) => (
  66. <div
  67. key={v.id}
  68. className="A0iconBox"
  69. style={{ top: v.y, left: v.x, zIndex: v.ind }}
  70. >
  71. <div className="iconNum">{v.id}</div>
  72. <img className="iconImg1" src={iconImg1} alt="" />
  73. <img className="iconImg2" src={iconImg1Ac} alt="" />
  74. {/* 文字标题 */}
  75. <div className="txtBox">
  76. <div>{v.name}</div>
  77. </div>
  78. {/* 悬停出来的图片和名称 */}
  79. <div className="hoverShowBox">
  80. <div className="hoverShowBoxM">
  81. <div className="hoverShowBox1">{v.name}</div>
  82. <div className="hoverShowBox2">
  83. <img src={`${envUrl}/map/icon/${v.id}.jpg`} alt="" />
  84. </div>
  85. </div>
  86. </div>
  87. </div>
  88. ))}
  89. {/* 定位小图标 */}
  90. {maoData2.map((v) => (
  91. <div
  92. key={v.id}
  93. className={classNames(
  94. "A0iconSmBox",
  95. v.type === "right" ? "A0iconSmBoxR" : ""
  96. )}
  97. style={{
  98. top: v.y,
  99. left: v.x,
  100. bottom: v.b,
  101. right: v.r,
  102. zIndex: v.ind,
  103. }}
  104. >
  105. <img className="ic2Img1" src={iconImg2} alt="" />
  106. <img className="ic2Img2" src={iconImg2Ac} alt="" />
  107. {/* 文字标题 */}
  108. <div className={classNames("ic2txtBox", `ic2txtBox${v.id}`)}>
  109. {v.name}
  110. </div>
  111. {/* 悬停出来的图片和名称 */}
  112. <div
  113. className={classNames(
  114. "ic2HoverBox",
  115. v.type === "right" ? "ic2HoverBox2" : ""
  116. )}
  117. >
  118. <div className="ic2HoverBoxll">{v.name}</div>
  119. <div className="ic2HoverBoxrr">
  120. <img src={`${envUrl}/map/icon/${v.id}.jpg`} alt="" />
  121. </div>
  122. </div>
  123. </div>
  124. ))}
  125. <div className="mapBac">
  126. <img src={`${envUrl}/map/1.jpg`} alt="" />
  127. </div>
  128. </div>
  129. <div className="yunBox">
  130. <div className="yunSon1"></div>
  131. <div className="yunSon2"></div>
  132. </div>
  133. </div>
  134. );
  135. }
  136. const MemoA0Map = React.memo(A0Map);
  137. export default MemoA0Map;