HomeView.vue 24 KB

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