HotspotDetail1.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <template>
  2. <div :class="`hotspot-detail-1 ${pageLev === 1 ? '' : 'hotspot-detail-2'}`">
  3. <!-- 左上角 -->
  4. <img
  5. class="HD1_1"
  6. :src="require(`@/assets/images/HD1/img_title.png`)"
  7. :style="`opacity:${pageLev === 1 ? '1' : '0'}`"
  8. >
  9. <!-- 中间--点击查看 -->
  10. <div :class="`HD1_2 ${isLookImg ? '' : 'HD1_2Hide'}`">
  11. <img
  12. class=""
  13. :src="require(`@/assets/images/icon-click-tip.png`)"
  14. alt=""
  15. draggable="false"
  16. >
  17. <div>点 击 查 看</div>
  18. </div>
  19. <!-- 右边三个画 -->
  20. <div
  21. v-for="(item, index) in imgList"
  22. :key="item.id"
  23. :class="`HD1_3 HD1_3_${index + 1}
  24. ${pageLev === item.id ? 'HD1_3Ac' : ''}
  25. ${pageShow && pageLev !== item.id ? 'HD1_3Hide' : ''}
  26. `"
  27. @click="ImgClick(item)"
  28. >
  29. <div
  30. v-show="pageLev === item.id"
  31. v-touch:swipe.left="() => onSwipeChange(1, index)"
  32. v-touch:swipe.right="() => onSwipeChange(-1, index)"
  33. :swipe-options="{ direction: 'horizontal' }"
  34. class="HD1_3AcMove"
  35. >
  36. <OperationTip
  37. v-if="isShowOperationTip"
  38. class="operation-tip"
  39. :direction="'h'"
  40. :text="'左右滑动'"
  41. :is-show="isShowOperationTip"
  42. color="green"
  43. />
  44. </div>
  45. <img
  46. :src="
  47. require(`@/assets/images/HD1/img${
  48. pageLev === item.id ? '' : '_list'
  49. }_${item.imgName}.png`)
  50. "
  51. alt=""
  52. >
  53. </div>
  54. <!-- 顶部文字 -->
  55. <div
  56. :class="`HD1_4 ${pageShow ? 'HD1_4Ac' : ''}`"
  57. :style="`opacity:${swChange && pageShow ? '1' : '0'}`"
  58. >
  59. <H3>{{ txtShow.title }}</H3>
  60. <p>{{ txtShow.desc }}</p>
  61. </div>
  62. <BtnBack
  63. color="green"
  64. @click="backBtnFu"
  65. />
  66. </div>
  67. </template>
  68. <script setup>
  69. import { ref, onMounted } from "vue"
  70. const emit = defineEmits(["close"])
  71. const craftInfo = configText.craft
  72. const imgList = [
  73. {
  74. id: 11,
  75. imgName: "juan",
  76. title: craftInfo[3].title,
  77. desc: craftInfo[3].desc,
  78. },
  79. {
  80. id: 12,
  81. imgName: "ling",
  82. title: craftInfo[5].title,
  83. desc: craftInfo[5].desc,
  84. },
  85. {
  86. id: 13,
  87. imgName: "paper",
  88. title: craftInfo[4].title,
  89. desc: craftInfo[4].desc,
  90. },
  91. ]
  92. // 当前页面 层级
  93. const pageLev = ref(1)
  94. const pageShow = ref(false)
  95. // 点击返回按钮
  96. const backBtnFu = () => {
  97. if (pageLev.value !== 1) {
  98. pageShow.value = false
  99. pageLev.value = 1
  100. } else emit("close")
  101. }
  102. // 点击查看自动消失
  103. const isLookImg = ref(true)
  104. onMounted(() => {
  105. setTimeout(() => {
  106. isLookImg.value = false
  107. }, 3000)
  108. })
  109. // 页面展示的文字
  110. const txtShow = ref({
  111. title: "",
  112. desc: "",
  113. })
  114. const isShowOperationTip = ref(false)
  115. // 点击图片
  116. const ImgClick = (item) => {
  117. if (!isShowOperationTip.value) {
  118. isShowOperationTip.value = true
  119. setTimeout(()=>{
  120. isShowOperationTip.value = false
  121. }, 2000)
  122. }
  123. pageShow.value = true
  124. isLookImg.value = false
  125. pageLev.value = item.id
  126. txtShow.value = {
  127. title: item.title,
  128. desc: item.desc,
  129. }
  130. }
  131. const swChange = ref(true)
  132. // 左滑右滑
  133. const onSwipeChange = (num, index) => {
  134. if (swChange.value) {
  135. swChange.value = false
  136. setTimeout(() => {
  137. swChange.value = true
  138. }, 600)
  139. }
  140. let newItem = imgList[index + num]
  141. if (index === 0 && num === -1) newItem = imgList[imgList.length - 1]
  142. if (index === imgList.length - 1 && num === 1) newItem = imgList[0]
  143. pageLev.value = newItem.id
  144. setTimeout(() => {
  145. txtShow.value = {
  146. title: newItem.title,
  147. desc: newItem.desc,
  148. }
  149. }, 500)
  150. }
  151. </script>
  152. <style lang="less" scoped>
  153. .hotspot-detail-1 {
  154. position: absolute;
  155. left: 0;
  156. top: 0;
  157. width: 100%;
  158. height: 100%;
  159. background-image: url("../assets/images/HD1/bg_caizhi.jpg");
  160. background-size: 100% 100%;
  161. transition: all 1s;
  162. .btn-back {
  163. z-index: 20;
  164. }
  165. .HD1_1 {
  166. transition: all 1s;
  167. position: absolute;
  168. z-index: 10;
  169. top: 60px;
  170. left: 30px;
  171. width: 80px;
  172. }
  173. .HD1_2 {
  174. position: absolute;
  175. z-index: 11;
  176. top: 48%;
  177. left: 40%;
  178. transform: translate(-50%, -50%);
  179. width: 30px;
  180. display: flex;
  181. flex-direction: column;
  182. pointer-events: none;
  183. transition: opacity 1s;
  184. opacity: 1;
  185. & > img {
  186. width: 40px;
  187. }
  188. & > div {
  189. margin-top: 10px;
  190. position: relative;
  191. line-height: 20px;
  192. left: 9px;
  193. font-weight: 400;
  194. font-family: KaiTi, KaiTi;
  195. color: #fff;
  196. text-align: center;
  197. }
  198. }
  199. .HD1_2Hide {
  200. opacity: 0;
  201. }
  202. .HD1_3 {
  203. position: absolute;
  204. z-index: 10;
  205. transition: top 1s, right 1s, opacity 0.5s;
  206. width: 100%;
  207. & > img {
  208. width: 100%;
  209. }
  210. }
  211. .HD1_3_1 {
  212. top: 12%;
  213. right: -60%;
  214. z-index: 1;
  215. }
  216. .HD1_3_2 {
  217. top: 24%;
  218. right: -50%;
  219. z-index: 2;
  220. }
  221. .HD1_3_3 {
  222. top: 36%;
  223. right: -40%;
  224. z-index: 3;
  225. }
  226. .HD1_3Ac {
  227. top: 40%;
  228. right: 0;
  229. .HD1_3AcMove {
  230. position: absolute;
  231. top: 0;
  232. left: 0;
  233. width: 100%;
  234. height: 100%;
  235. display: flex;
  236. justify-content: center;
  237. align-items: center;
  238. padding-top: 30%;
  239. }
  240. }
  241. .HD1_3Hide {
  242. right: -100%;
  243. opacity: 0;
  244. pointer-events: none;
  245. }
  246. .HD1_4 {
  247. position: absolute;
  248. z-index: 11;
  249. left: 50%;
  250. top: -14%;
  251. transform: translateX(-50%);
  252. font-family: KaiTi, KaiTi;
  253. font-weight: 400;
  254. color: #5e715d;
  255. width: 70%;
  256. height: 30%;
  257. opacity: 0;
  258. pointer-events: none;
  259. transition: top 1s, opacity 0.5s;
  260. h3 {
  261. font-weight: 700;
  262. text-align: center;
  263. font-size: 30px;
  264. }
  265. p {
  266. font-size: 16px;
  267. position: absolute;
  268. top: 50px;
  269. left: 50%;
  270. transform: translateX(-50%);
  271. letter-spacing: 2px;
  272. height: calc(100% - 50px);
  273. writing-mode: vertical-rl;
  274. line-height: 120%;
  275. }
  276. }
  277. .HD1_4Ac {
  278. opacity: 1;
  279. top: 4%;
  280. }
  281. }
  282. .hotspot-detail-2 {
  283. background-image: url("../assets/images/HD1/bg_paper.jpg");
  284. }
  285. </style>