HomeView.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980
  1. <template>
  2. <div
  3. class="home"
  4. >
  5. <div class="left">
  6. <div class="title">
  7. <h2>其他遗存</h2>
  8. <div class="deco-line-1" />
  9. <div class="deco-line-2" />
  10. </div>
  11. <ul>
  12. <li
  13. v-for="item in otherRelicList"
  14. :key="item.id"
  15. @click="activeOtherRelicData = item, isShowOtherRelicDetail = true"
  16. >
  17. <img
  18. class=""
  19. :src="`${$env.VUE_APP_DEPLOY_ORIGIN}${item.thumb}`"
  20. alt=""
  21. draggable="false"
  22. >
  23. <div class="right">
  24. <div class="name">
  25. {{ item.name }}
  26. </div>
  27. <div class="desc">
  28. {{ item.description }}
  29. </div>
  30. </div>
  31. </li>
  32. </ul>
  33. </div>
  34. <div
  35. ref="centerRef"
  36. class="center"
  37. >
  38. <div
  39. class="img-list-wrap"
  40. :style="{
  41. width: imgWrapSize + 'px',
  42. height: imgWrapSize + 'px',
  43. }"
  44. >
  45. <img
  46. v-for="(item, idx) in hotRelicList"
  47. v-show="activeAreaIdx === -1 || areaList[activeAreaIdx] === item.belongArea"
  48. :key="item.name + '-pos-in-map'"
  49. class="pos-in-map"
  50. :class="{
  51. active: activeHotRelicIdx === idx,
  52. }"
  53. :src="activeHotRelicIdx !== idx ? require('@/assets/images/icon_pos_in_map.png') : require('@/assets/images/icon_pos_in_map-active.png')"
  54. alt=""
  55. draggable="false"
  56. :style="{
  57. left: item.xInMap,
  58. top: item.yInMap,
  59. }"
  60. @click="activeHotRelicIdx = idx"
  61. >
  62. <img
  63. v-for="(item, idx) in hotRelicList"
  64. v-show="(activeAreaIdx === -1 || areaList[activeAreaIdx] === item.belongArea) && (idx !== activeHotRelicIdx)"
  65. :key="item.name + '-no-color'"
  66. class="no-color"
  67. :src="require(`@/assets/images/relic-drawings/${item.imgName}.png`)"
  68. alt=""
  69. draggable="false"
  70. :style="{
  71. left: `${(item.x + item.widthNoColor / 2) / 734 * 100}%`,
  72. top: `${(item.y + item.heightNoColor / 2) / 734 * 100}%`,
  73. width: `${item.widthNoColor / 734 * 100}%`,
  74. height: `${item.heightNoColor / 734 * 100}%`,
  75. }"
  76. @click="activeHotRelicIdx = idx"
  77. >
  78. <img
  79. v-for="(item, idx) in hotRelicList"
  80. v-show="(activeAreaIdx === -1 || areaList[activeAreaIdx] === item.belongArea) && (idx === activeHotRelicIdx)"
  81. :key="item.name + 'colorful'"
  82. class="colorful"
  83. :src="require(`@/assets/images/relic-drawings/${item.imgName}上色.png`)"
  84. alt=""
  85. draggable="false"
  86. :style="{
  87. left: `${(item.x + item.widthNoColor / 2) / 734 * 100}%`,
  88. top: `${(item.y + item.heightNoColor / 2) / 734 * 100}%`,
  89. width: `${item.widthColorful / 734 * 100}%`,
  90. height: `${item.heightColorful / 734 * 100}%`,
  91. }"
  92. >
  93. </div>
  94. </div>
  95. <div class="right">
  96. <div
  97. class="relic-detail"
  98. >
  99. <div class="top-bar">
  100. <h3 :title="activeHotRelicDetail?.name">
  101. {{ activeHotRelicDetail?.name }}
  102. </h3>
  103. <div class="btn-wrap">
  104. <!-- <button class="pano"/> -->
  105. <button
  106. class="vr"
  107. @click="onClickHotRelicSceneEntry"
  108. />
  109. </div>
  110. </div>
  111. <div class="splitter" />
  112. <div class="text">
  113. {{ activeHotRelicDetail?.description }}
  114. </div>
  115. <img
  116. class=""
  117. :src="`${$env.VUE_APP_DEPLOY_ORIGIN}${activeHotRelicDetail?.thumb}`"
  118. alt=""
  119. draggable="false"
  120. >
  121. </div>
  122. <div class="relic-detail-shadow" />
  123. <menu
  124. class="area-list"
  125. :class="{
  126. hide: !isShowAreaList
  127. }"
  128. >
  129. <button
  130. v-for="(item, idx) in areaList"
  131. :key="idx"
  132. :class="{
  133. active: idx === activeAreaIdx,
  134. }"
  135. @click="onClickArea(idx)"
  136. >
  137. {{ item }}
  138. </button>
  139. </menu>
  140. <button
  141. class="area-list-switch"
  142. :class="{
  143. active: isShowAreaList
  144. }"
  145. @click="isShowAreaList = !isShowAreaList"
  146. >
  147. 分类
  148. <img
  149. class=""
  150. src="@/assets/images/icon_arrow-half.png"
  151. alt=""
  152. draggable="false"
  153. >
  154. </button>
  155. <button
  156. class="search"
  157. @click="isShowRelicSearch = true"
  158. >
  159. 搜索
  160. <img
  161. class=""
  162. src="@/assets/images/icon_search.png"
  163. alt=""
  164. draggable="false"
  165. >
  166. </button>
  167. </div>
  168. <img
  169. class="decoration-bottom"
  170. src="@/assets/images/home-bottom-bg.png"
  171. alt=""
  172. draggable="false"
  173. >
  174. <button
  175. v-if="!$isTablet"
  176. class="arrow-down"
  177. @click="router.push({
  178. name: 'CityOfXishan',
  179. })"
  180. />
  181. <OtherRelicDetail
  182. v-if="isShowOtherRelicDetail"
  183. :data="activeOtherRelicData"
  184. @close="isShowOtherRelicDetail = false, activeOtherRelicData = {}"
  185. />
  186. <RelicSearch
  187. v-if="isShowRelicSearch"
  188. @open="onSearchViewClose"
  189. @close="isShowRelicSearch = false"
  190. />
  191. <IframeWrap
  192. v-if="isShowIframeWrap"
  193. class="iframe-wrap"
  194. :url="iframeUrl"
  195. show-close
  196. @back="isShowIframeWrap = false, iframeUrl = ''"
  197. />
  198. <audio
  199. :src="bgAudio"
  200. loop
  201. autoplay
  202. preload="auto"
  203. style="display: none;"
  204. />
  205. </div>
  206. </template>
  207. <script setup>
  208. import { ref, watch, watchEffect, inject } from "vue"
  209. import { useRouter } from "vue-router"
  210. import { useStore } from "vuex"
  211. import { useElementSize } from '@vueuse/core'
  212. import OtherRelicDetail from '@/components/OtherRelicDetail.vue'
  213. import RelicSearch from '@/components/RelicSearch.vue'
  214. import IframeWrap from '@/components/IframeWrap.vue'
  215. import { getRelicList } from '@/api.js'
  216. import bgAudio from '@/assets/audios/ysdt-bg.mp3'
  217. const router = useRouter()
  218. const store = useStore()
  219. const $env = inject('$env')
  220. // 运营埋点
  221. store.dispatch('recordPageVisitIfNeeded', {
  222. pageId: 1,
  223. })
  224. const otherRelicList = ref([])
  225. getRelicList().then((res) => {
  226. otherRelicList.value = res
  227. })
  228. const isShowOtherRelicDetail = ref(false)
  229. const activeOtherRelicData = ref({})
  230. const centerRef = ref(null)
  231. const { width: centerWidth, height: centerHeight } = useElementSize(centerRef)
  232. const imgWrapSize = ref(0)
  233. watchEffect(() => {
  234. if (centerHeight.value - window.innerHeight * 0.1 < 0) {
  235. return
  236. }
  237. if (centerWidth.value > (centerHeight.value - window.innerHeight * 0.1)) {
  238. imgWrapSize.value = centerHeight.value - window.innerHeight * 0.1
  239. } else {
  240. imgWrapSize.value = centerWidth.value
  241. }
  242. })
  243. const hotRelicList = ref([
  244. {
  245. x: 634,
  246. y: 305,
  247. widthNoColor: 129,
  248. heightNoColor: 81,
  249. widthColorful: 169,
  250. heightColorful: 101,
  251. imgName: '6竺西书院',
  252. photoName: '6竺西书院.jpg',
  253. xInMap: '45.7%',
  254. yInMap: '55%',
  255. belongArea: '宜兴市',
  256. name: '竺西书院',
  257. },
  258. {
  259. x: 651,
  260. y: 391,
  261. widthNoColor: 84,
  262. heightNoColor: 48,
  263. widthColorful: 84,
  264. heightColorful: 48,
  265. imgName: '14宝界桥',
  266. photoName: '14宝界桥.webp',
  267. xInMap: '58.5%',
  268. yInMap: '47%',
  269. belongArea: '滨湖区',
  270. name: '宝界桥',
  271. },
  272. {
  273. x: 619,
  274. y: 428,
  275. widthNoColor: 52,
  276. heightNoColor: 72,
  277. widthColorful: 52,
  278. heightColorful: 72,
  279. imgName: '9祝大椿故居',
  280. photoName: '9祝大椿故居.webp',
  281. xInMap: '62%',
  282. yInMap: '47%',
  283. belongArea: '梁溪区',
  284. name: '祝大椿故居',
  285. },
  286. {
  287. x: 620,
  288. y: 516,
  289. widthNoColor: 90,
  290. heightNoColor: 36,
  291. widthColorful: 94,
  292. heightColorful: 64,
  293. imgName: '3尚仁初级商科职业学校',
  294. photoName: '3尚仁初级商科职业学校.webp',
  295. xInMap: '60.5%',
  296. yInMap: '27.5%',
  297. belongArea: '江阴市',
  298. name: '尚仁初级商科职业学校',
  299. },
  300. {
  301. x: 562,
  302. y: 540,
  303. widthNoColor: 78,
  304. heightNoColor: 66,
  305. widthColorful: 82,
  306. heightColorful: 66,
  307. imgName: '23怀海义庄',
  308. photoName: '23怀海义庄上色.webp',
  309. xInMap: '71%',
  310. yInMap: '50%',
  311. belongArea: '新吴区',
  312. name: '怀海义庄',
  313. },
  314. {
  315. x: 504,
  316. y: 587,
  317. widthNoColor: 48,
  318. heightNoColor: 87,
  319. widthColorful: 63,
  320. heightColorful: 87,
  321. imgName: '7坎宫救熄会',
  322. photoName: '7坎宫救熄会.jpg',
  323. xInMap: '61%',
  324. yInMap: '47.5%',
  325. belongArea: '梁溪区',
  326. name: '坎宫救熄会',
  327. },
  328. {
  329. x: 397,
  330. y: 644,
  331. widthNoColor: 88,
  332. heightNoColor: 54,
  333. widthColorful: 97,
  334. heightColorful: 54,
  335. imgName: '13大公图书馆',
  336. photoName: '13大公图书馆.jpg',
  337. xInMap: '57.5%',
  338. yInMap: '45%',
  339. belongArea: '滨湖区',
  340. name: '大公图书馆',
  341. },
  342. {
  343. x: 314,
  344. y: 630,
  345. widthNoColor: 65,
  346. heightNoColor: 83,
  347. widthColorful: 66,
  348. heightColorful: 86,
  349. imgName: '11惠山古镇',
  350. photoName: '11惠山古镇.png',
  351. xInMap: '60%',
  352. yInMap: '43.5%',
  353. belongArea: '梁溪区',
  354. name: '慈善大讲堂(惠山古镇)',
  355. },
  356. {
  357. x: 211,
  358. y: 636,
  359. widthNoColor: 87,
  360. heightNoColor: 49,
  361. widthColorful: 112,
  362. heightColorful: 73,
  363. imgName: '4善卷洞',
  364. photoName: '4善卷洞.webp',
  365. xInMap: '27.5%',
  366. yInMap: '63%',
  367. belongArea: '宜兴市',
  368. name: '善卷洞',
  369. },
  370. {
  371. x: 140,
  372. y: 597,
  373. widthNoColor: 52,
  374. heightNoColor: 68,
  375. widthColorful: 54,
  376. heightColorful: 70,
  377. imgName: '19徐氏义庄(查桥)',
  378. photoName: '19徐氏义庄(查桥).jpg',
  379. xInMap: '65.5%',
  380. yInMap: '43%',
  381. belongArea: '锡山区',
  382. name: '徐氏义庄(查桥)',
  383. },
  384. {
  385. x: 27,
  386. y: 547,
  387. widthNoColor: 109,
  388. heightNoColor: 53,
  389. widthColorful: 109,
  390. heightColorful: 72,
  391. imgName: '16华氏老义庄',
  392. photoName: '16华氏老义庄.webp',
  393. xInMap: '75.5%',
  394. yInMap: '48%',
  395. belongArea: '锡山区',
  396. name: '华氏老义庄',
  397. },
  398. {
  399. x: 47,
  400. y: 473,
  401. widthNoColor: 50,
  402. heightNoColor: 68,
  403. widthColorful: 79,
  404. heightColorful: 88,
  405. imgName: '21李金镛故居',
  406. photoName: '21李金镛故居.webp',
  407. xInMap: '58.5%',
  408. yInMap: '39%',
  409. belongArea: '惠山区',
  410. name: '李金镛故居',
  411. },
  412. {
  413. x: -9,
  414. y: 385,
  415. widthNoColor: 97,
  416. heightNoColor: 75,
  417. widthColorful: 99,
  418. heightColorful: 78,
  419. imgName: '8公花园',
  420. photoName: '8公花园.jpg',
  421. xInMap: '60.5%',
  422. yInMap: '45%',
  423. belongArea: '梁溪区',
  424. name: '公花园',
  425. },
  426. {
  427. x: -32,
  428. y: 334,
  429. widthNoColor: 129,
  430. heightNoColor: 37,
  431. widthColorful: 133,
  432. heightColorful: 73,
  433. imgName: '20唐氏花厅',
  434. photoName: '20唐氏花厅.png',
  435. xInMap: '73%',
  436. yInMap: '42%',
  437. belongArea: '锡山区',
  438. name: '唐氏花厅',
  439. },
  440. {
  441. x: 8,
  442. y: 248,
  443. widthNoColor: 85,
  444. heightNoColor: 61,
  445. widthColorful: 85,
  446. heightColorful: 61,
  447. imgName: '12市慈善总会',
  448. photoName: '12市慈善总会.jpg',
  449. xInMap: '59%',
  450. yInMap: '43.5%',
  451. belongArea: '梁溪区',
  452. name: '慈善展示馆(市慈善总会)',
  453. },
  454. {
  455. x: 59,
  456. y: 204,
  457. widthNoColor: 56,
  458. heightNoColor: 49,
  459. widthColorful: 68,
  460. heightColorful: 60,
  461. imgName: '5洑溪徐氏宗祠(现名:徐大宗祠)',
  462. photoName: '5洑溪徐氏宗祠(现名:徐大宗祠).png',
  463. xInMap: '32%',
  464. yInMap: '60%',
  465. belongArea: '宜兴区',
  466. name: '洑溪徐氏宗祠(现名:徐大宗祠)',
  467. },
  468. {
  469. x: 65,
  470. y: 136,
  471. widthNoColor: 95,
  472. heightNoColor: 47,
  473. widthColorful: 95,
  474. heightColorful: 52,
  475. imgName: '110匡村中学旧址',
  476. photoName: '110匡村中学旧址.png',
  477. xInMap: '53%',
  478. yInMap: '40%',
  479. belongArea: '惠山区',
  480. name: '匡园(匡村中学旧址)',
  481. },
  482. {
  483. x: 141,
  484. y: 83,
  485. widthNoColor: 74,
  486. heightNoColor: 56,
  487. widthColorful: 91,
  488. heightColorful: 70,
  489. imgName: '15钱伟长旧居',
  490. photoName: '15钱伟长旧居.jpg',
  491. xInMap: '74.5%',
  492. yInMap: '47%',
  493. belongArea: '锡山区',
  494. name: '钱伟长旧居',
  495. },
  496. {
  497. x: 202,
  498. y: 54,
  499. widthNoColor: 72,
  500. heightNoColor: 42,
  501. widthColorful: 72,
  502. heightColorful: 53,
  503. imgName: '18徐义庄(荡口)',
  504. photoName: '18徐义庄(荡口).jpg',
  505. xInMap: '74%',
  506. yInMap: '46.5%',
  507. belongArea: '锡山区',
  508. name: '徐义庄(荡口)',
  509. },
  510. {
  511. x: 282,
  512. y: 27,
  513. widthNoColor: 51,
  514. heightNoColor: 57,
  515. widthColorful: 68,
  516. heightColorful: 61,
  517. imgName: '109景云楼',
  518. photoName: '109景云楼.png',
  519. xInMap: '71%',
  520. yInMap: '26%',
  521. belongArea: '江阴市',
  522. name: '景云楼',
  523. },
  524. {
  525. x: 343,
  526. y: 49,
  527. widthNoColor: 67,
  528. heightNoColor: 40,
  529. widthColorful: 67,
  530. heightColorful: 41,
  531. imgName: '108炎黄陈列馆',
  532. photoName: '108炎黄陈列馆上色.webp',
  533. xInMap: '68%',
  534. yInMap: '32%',
  535. belongArea: '江阴市',
  536. name: '炎黄陈列馆',
  537. },
  538. {
  539. x: 427,
  540. y: 36,
  541. widthNoColor: 60,
  542. heightNoColor: 61,
  543. widthColorful: 61,
  544. heightColorful: 61,
  545. imgName: '22村前公立蒙学堂',
  546. photoName: '22村前公立蒙学堂.png',
  547. xInMap: '60%',
  548. yInMap: '36.5%',
  549. belongArea: '惠山区',
  550. name: '村前公立蒙学堂',
  551. },
  552. {
  553. x: 492,
  554. y: 80,
  555. widthNoColor: 86,
  556. heightNoColor: 86,
  557. widthColorful: 86,
  558. heightColorful: 86,
  559. imgName: '24周新镇',
  560. photoName: '24周新镇.jpg',
  561. xInMap: '60.5%',
  562. yInMap: '50%',
  563. belongArea: '经开区',
  564. name: '周新镇',
  565. },
  566. {
  567. x: 553,
  568. y: 137,
  569. widthNoColor: 109,
  570. heightNoColor: 40,
  571. widthColorful: 109,
  572. heightColorful: 72,
  573. imgName: '17襄义庄',
  574. photoName: '17襄义庄.jpg',
  575. xInMap: '74%',
  576. yInMap: '49%',
  577. belongArea: '锡山区',
  578. name: '襄义庄',
  579. },
  580. {
  581. x: 603,
  582. y: 186,
  583. widthNoColor: 53,
  584. heightNoColor: 68,
  585. widthColorful: 56,
  586. heightColorful: 71,
  587. imgName: '10施子祠',
  588. photoName: '10施子祠.webp',
  589. xInMap: '59%',
  590. yInMap: '43.5%',
  591. belongArea: '梁溪区',
  592. name: '慈善展示馆(惠山古镇施子祠)',
  593. },
  594. {
  595. x: 655,
  596. y: 238,
  597. widthNoColor: 80,
  598. heightNoColor: 56,
  599. widthColorful: 80,
  600. heightColorful: 56,
  601. imgName: '1缪氏义庄',
  602. photoName: '1缪氏义庄.jpg',
  603. xInMap: '71%',
  604. yInMap: '31%',
  605. belongArea: '江阴市',
  606. name: '缪氏义庄',
  607. },
  608. ])
  609. const activeHotRelicIdx = ref(0)
  610. const activeHotRelicDetail = ref(null)
  611. watch(activeHotRelicIdx, (v) => {
  612. getRelicList(hotRelicList.value[v].name).then((res) => {
  613. activeHotRelicDetail.value = res[0]
  614. })
  615. }, {
  616. immediate: true,
  617. })
  618. const $isTablet = inject('$isTablet')
  619. function onClickHotRelicSceneEntry() {
  620. // 运营埋点
  621. store.dispatch('recordPageVisitIfNeeded', {
  622. pageId: activeHotRelicDetail.value.id,
  623. })
  624. if ($isTablet) {
  625. iframeUrl.value = activeHotRelicDetail.value?.link, isShowIframeWrap.value = true
  626. } else {
  627. window.open(activeHotRelicDetail.value?.link)
  628. }
  629. }
  630. const isShowAreaList = ref(true)
  631. const areaList = ref([
  632. '江阴市',
  633. '宜兴市',
  634. '梁溪区',
  635. '锡山区',
  636. '惠山区',
  637. '滨湖区',
  638. '新吴区',
  639. '经开区'
  640. ])
  641. const activeAreaIdx = ref(-1)
  642. function onClickArea(idx) {
  643. if (activeAreaIdx.value === idx) {
  644. activeAreaIdx.value = -1
  645. } else {
  646. activeAreaIdx.value = idx
  647. if (activeHotRelicDetail.value.region !== areaList.value[activeAreaIdx.value]) {
  648. activeHotRelicIdx.value = hotRelicList.value.findIndex((item) => {
  649. return item.belongArea === areaList.value[activeAreaIdx.value]
  650. })
  651. }
  652. }
  653. }
  654. const isShowRelicSearch = ref(false)
  655. function onSearchViewClose(relicData) {
  656. // isShowRelicSearch.value = false
  657. if (relicData) {
  658. activeOtherRelicData.value = relicData
  659. isShowOtherRelicDetail.value = true
  660. }
  661. }
  662. const isShowIframeWrap = ref(false)
  663. const iframeUrl = ref('')
  664. </script>
  665. <style lang="less" scoped>
  666. .home {
  667. position: absolute;
  668. left: 0;
  669. top: 0;
  670. width: 100%;
  671. height: 100%;
  672. display: flex;
  673. justify-content: space-evenly;
  674. >.left{
  675. flex: 0 0 auto;
  676. width: 370px;
  677. display: flex;
  678. flex-direction: column;
  679. padding-top: 5vh;
  680. padding-bottom: 11vh;
  681. position: relative;
  682. z-index: 1;
  683. >.title{
  684. flex: 0 0 auto;
  685. margin-bottom: 22px;
  686. >h2{
  687. font-family: Source Han Sans CN, Source Han Sans CN;
  688. font-weight: bold;
  689. font-size: 24px;
  690. color: #589498;
  691. line-height: 28px;
  692. margin-bottom: 4px;
  693. }
  694. >.deco-line-1{
  695. height: 2px;
  696. width: 67px;
  697. background: #589498;
  698. }
  699. >.deco-line-2{
  700. height: 2px;
  701. background: linear-gradient( 90deg, #589498 0%, rgba(88,148,152,0) 100%);
  702. }
  703. }
  704. >ul{
  705. flex: 1 0 1px;
  706. overflow: auto;
  707. padding-right: 22px;
  708. &::-webkit-scrollbar { background: transparent; width: 2px; height: 0; }
  709. &::-webkit-scrollbar-thumb { background: #589498; opacity: 0.5; }
  710. >li{
  711. display: flex;
  712. justify-content: space-between;
  713. align-items: center;
  714. margin-bottom: 29px;
  715. cursor: pointer;
  716. >img{
  717. flex: 0 0 auto;
  718. width: 39px;
  719. height: 39px;
  720. box-shadow: 0px 1px 4px 0px rgba(0,0,0,0.25);
  721. border-radius: 50%;
  722. border: 2px solid #FFFFFF;
  723. margin-right: 13px;
  724. }
  725. >.right{
  726. flex: 0 0 auto;
  727. width: 300px;
  728. >.name{
  729. font-family: Source Han Sans CN, Source Han Sans CN;
  730. font-weight: bold;
  731. font-size: 16px;
  732. color: #589498;
  733. line-height: 19px;
  734. overflow: hidden;
  735. white-space: pre;
  736. text-overflow: ellipsis;
  737. }
  738. >.desc{
  739. font-family: Source Han Sans CN, Source Han Sans CN;
  740. font-weight: 400;
  741. font-size: 14px;
  742. color: #589498;
  743. line-height: 16px;
  744. overflow: hidden;
  745. white-space: nowrap;
  746. text-overflow: ellipsis;
  747. }
  748. }
  749. }
  750. }
  751. }
  752. >.center{
  753. flex: 1 1 auto;
  754. min-width: 300px;
  755. max-width: 800px;
  756. padding-bottom: 10vh;
  757. display: flex;
  758. justify-content: center;
  759. align-items: center;
  760. position: relative;
  761. z-index: 1;
  762. >.img-list-wrap{
  763. background-image: url(@/assets/images/home-center-img-wrap-bg.png);
  764. background-size: contain;
  765. background-repeat: no-repeat;
  766. background-position: center center;
  767. position: relative;
  768. >img.pos-in-map{
  769. position: absolute;
  770. transform: translate(-50%, -50%);
  771. width: calc(15 / 734 * 100%);
  772. height: calc(22 / 734 * 100%);
  773. transform-origin: center bottom;
  774. cursor: pointer;
  775. &.active{
  776. transform: translate(-50%, -50%) scale(1.5);
  777. z-index: 1;
  778. }
  779. }
  780. >img.no-color{
  781. position: absolute;
  782. width: 100%;
  783. height: 100%;
  784. opacity: 0.3;
  785. transform: translate(-50%, -50%);
  786. cursor: pointer;
  787. }
  788. >img.colorful{
  789. position: absolute;
  790. width: 100%;
  791. height: 100%;
  792. transform: translate(-50%, -50%);
  793. }
  794. }
  795. }
  796. >.right{
  797. flex: 0 0 auto;
  798. width: 420px;
  799. padding-top: 5vh;
  800. padding-bottom: 18vh;
  801. position: relative;
  802. z-index: 1;
  803. >.relic-detail{
  804. position: relative;
  805. width: 406px;
  806. height: 375px;
  807. background: #ddebe9;
  808. border-radius: 10px 0 10px 0;
  809. z-index: 1;
  810. padding: 18px 26px 16px 26px;
  811. margin-bottom: 5vh;
  812. >.top-bar{
  813. display: flex;
  814. justify-content: space-between;
  815. align-items: center;
  816. >h3{
  817. width: calc(100% - 80px);
  818. font-family: Source Han Sans CN, Source Han Sans CN;
  819. font-weight: bold;
  820. font-size: 20px;
  821. color: #589498;
  822. line-height: 23px;
  823. overflow: hidden;
  824. white-space: pre;
  825. text-overflow: ellipsis;
  826. }
  827. >.btn-wrap{
  828. >button.pano{
  829. width: 33px;
  830. height: 33px;
  831. margin-right: 11px;
  832. background-image: url(@/assets/images/icon_panorama.png);
  833. background-size: cover;
  834. background-repeat: no-repeat;
  835. background-position: center center;
  836. }
  837. >button.vr{
  838. width: 33px;
  839. height: 33px;
  840. background-image: url(@/assets/images/icon_vr.png);
  841. background-size: cover;
  842. background-repeat: no-repeat;
  843. background-position: center center;
  844. }
  845. }
  846. }
  847. >.splitter{
  848. margin-top: 13px;
  849. margin-bottom: 13px;
  850. border-bottom: 1px dashed #589498;
  851. }
  852. >.text{
  853. font-family: Source Han Sans CN, Source Han Sans CN;
  854. font-weight: 400;
  855. font-size: 14px;
  856. color: #589498;
  857. line-height: 20px;
  858. text-indent: 2em;
  859. height: 91px;
  860. overflow: auto;
  861. padding-right: 0.5em;
  862. margin-bottom: 10px;
  863. &::-webkit-scrollbar { background: transparent; width: 2px; height: 0; }
  864. &::-webkit-scrollbar-thumb { background: #589498; opacity: 0.5; }
  865. }
  866. >img{
  867. width: 351px;
  868. height: 175px;
  869. object-fit: cover;
  870. }
  871. }
  872. >.relic-detail-shadow{
  873. position: absolute;
  874. top: calc(5vh + 12px);
  875. left: 12px;
  876. width: 406px;
  877. height: 375px;
  878. border-radius: 10px 0 10px 0;
  879. border: 1px solid #FFFFFF;
  880. z-index: 0;
  881. }
  882. >menu.area-list{
  883. margin-bottom: 2vh;
  884. width: 384px;
  885. margin-left: auto;
  886. &.hide{
  887. opacity: 0;
  888. pointer-events: none;
  889. }
  890. >button{
  891. margin-left: 10px;
  892. margin-bottom: 10px;
  893. width: 86px;
  894. height: 39px;
  895. border-radius: 53px 53px 53px 53px;
  896. border: 1px solid #589498;
  897. font-family: Source Han Sans CN, Source Han Sans CN;
  898. font-weight: 400;
  899. font-size: 14px;
  900. color: #589498;
  901. line-height: 16px;
  902. &.active{
  903. color: #fff;
  904. background-color: #589498;
  905. }
  906. }
  907. }
  908. >button.search, button.area-list-switch{
  909. display: block;
  910. width: 375px;
  911. height: 67px;
  912. margin-left: auto;
  913. margin-bottom: 2vh;
  914. border: 1px solid;
  915. border-image: linear-gradient(90deg, rgba(255, 255, 255, 0), rgba(88, 148, 152, 1)) 1 1;
  916. display: flex;
  917. justify-content: flex-end;
  918. align-items: center;
  919. font-family: Source Han Sans CN, Source Han Sans CN;
  920. font-weight: bold;
  921. font-size: 20px;
  922. color: #589498;
  923. line-height: 23px;
  924. &.active{
  925. background: linear-gradient( 90deg, rgba(88,148,152,0) 0%, #589498 100%);
  926. border: none;
  927. font-weight: bold;
  928. color: #FFFFFF;
  929. }
  930. >img{
  931. width: 20px;
  932. margin-left: 12px;
  933. margin-right: 24px;
  934. }
  935. }
  936. }
  937. >.decoration-bottom{
  938. position: absolute;
  939. left: 0;
  940. bottom: 0;
  941. width: 100%;
  942. height: 26%;
  943. object-fit: cover;
  944. object-position: center top;
  945. pointer-events: none;
  946. }
  947. >.arrow-down{
  948. position: absolute;
  949. left: 50%;
  950. bottom: 12px;
  951. transform: translate(-50%, 0);
  952. width: 50px;
  953. height: 50px;
  954. background-image: url(@/assets/images/icon_arrow-down.png);
  955. background-size: cover;
  956. background-repeat: no-repeat;
  957. background-position: center center;
  958. z-index: 5;
  959. }
  960. .iframe-wrap{
  961. z-index: 10;
  962. }
  963. }
  964. </style>