HomeView.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. <template>
  2. <div
  3. class="home"
  4. >
  5. <div class="bg-mask" />
  6. <Transition name="fade-out">
  7. <Startup
  8. v-if="!store.state.haveShownStartup"
  9. class="startup"
  10. />
  11. </Transition>
  12. <!-- 标题 -->
  13. <div
  14. class="title-wrap"
  15. :style="{
  16. opacity: titleOpacity,
  17. }"
  18. >
  19. <img
  20. class="title"
  21. src="@/assets/images/home-title.png"
  22. alt=""
  23. draggable="false"
  24. >
  25. <div class="sub-text">
  26. 南京博物院<br>
  27. 绢本 墨笔<br>
  28. 元 李衎<br>
  29. </div>
  30. </div>
  31. <!-- 画作 -->
  32. <div
  33. class="painting-wrap"
  34. :style="{
  35. top: `${paintingTop / windowSizeWhenDesignForRef * windowSizeInCssForRef.substring(0, windowSizeInCssForRef.length - 2)}px`
  36. }"
  37. >
  38. <div
  39. class="size-sign-h"
  40. :style="{
  41. opacity: sizeOpacity,
  42. }"
  43. >
  44. <img
  45. class=""
  46. src="@/assets/images/size-sign-h.png"
  47. alt=""
  48. draggable="false"
  49. >
  50. <span>100.6cm</span>
  51. </div>
  52. <div
  53. class="size-sign-v"
  54. :style="{
  55. opacity: sizeOpacity,
  56. }"
  57. >
  58. <img
  59. class=""
  60. src="@/assets/images/size-sign-v.png"
  61. alt=""
  62. draggable="false"
  63. >
  64. <span>151.7cm</span>
  65. </div>
  66. <img
  67. class="painting-border"
  68. src="@/assets/images/painting-border-new.png"
  69. alt=""
  70. draggable="false"
  71. >
  72. <img
  73. class="painting"
  74. src="@/assets/images/home-painting.jpg"
  75. alt=""
  76. draggable="false"
  77. >
  78. <img
  79. class="painting-stem"
  80. :style="{
  81. opacity: stemOpacity,
  82. }"
  83. src="@/assets/images/home-painting-stem.png"
  84. alt=""
  85. draggable="false"
  86. >
  87. <img
  88. class="painting-leaf"
  89. :style="{
  90. opacity: leafOpacity,
  91. }"
  92. src="@/assets/images/home-painting-leaf.png"
  93. alt=""
  94. draggable="false"
  95. >
  96. <img
  97. class="painting-stone"
  98. :style="{
  99. opacity: stoneOpacity,
  100. }"
  101. src="@/assets/images/home-painting-stone.png"
  102. alt=""
  103. draggable="false"
  104. >
  105. </div>
  106. <!-- 热点层 -->
  107. <div
  108. class="hotspot-wrap"
  109. :style="{
  110. top: `${paintingTop / windowSizeWhenDesignForRef * windowSizeInCssForRef.substring(0, windowSizeInCssForRef.length - 2)}px`
  111. }"
  112. >
  113. <HotspotComp
  114. v-show="isShowHotspot"
  115. class="hotspot-1"
  116. @click="isShowHotspotDetail1 = true"
  117. />
  118. <HotspotComp
  119. v-show="isShowHotspot"
  120. class="hotspot-2"
  121. @click="showBigPainting"
  122. />
  123. <HotspotComp
  124. v-show="isShowHotspot"
  125. class="hotspot-3"
  126. @click="isShowHotspotDetail3 = true"
  127. />
  128. </div>
  129. <!-- 文字介绍 -->
  130. <div
  131. ref="longDesc"
  132. class="long-desc"
  133. :style="{
  134. top: `${(paintingTop + 540) / windowSizeWhenDesignForRef * windowSizeInCssForRef.substring(0, windowSizeInCssForRef.length - 2)}px`,
  135. opacity: longDescOpacity,
  136. }"
  137. >
  138. <h3>作品简介:</h3>
  139. <p
  140. v-for="(item, index) in homepagePaintingDesc"
  141. :key="index"
  142. >
  143. {{ item }}
  144. </p>
  145. <h3>作者简介:</h3>
  146. <p
  147. v-for="(item, index) in homepageAuthorDesc"
  148. :key="index"
  149. >
  150. {{ item }}
  151. </p>
  152. </div>
  153. <div
  154. class="fixed-desc detail-desc-stem"
  155. :style="{
  156. top: `${(paintingTop + 550) / windowSizeWhenDesignForRef * windowSizeInCssForRef.substring(0, windowSizeInCssForRef.length - 2)}px`,
  157. opacity: stemOpacity,
  158. }"
  159. >
  160. {{ detailDescStem }}
  161. </div>
  162. <div
  163. class="fixed-desc detail-desc-leaf"
  164. :style="{
  165. top: `${(paintingTop + 550) / windowSizeWhenDesignForRef * windowSizeInCssForRef.substring(0, windowSizeInCssForRef.length - 2)}px`,
  166. opacity: leafOpacity,
  167. }"
  168. >
  169. {{ detailDescLeaf }}
  170. </div>
  171. <div
  172. class="fixed-desc detail-desc-stone"
  173. :style="{
  174. top: `${(paintingTop + 550) / windowSizeWhenDesignForRef * windowSizeInCssForRef.substring(0, windowSizeInCssForRef.length - 2)}px`,
  175. opacity: stoneOpacity,
  176. }"
  177. >
  178. {{ detailDescStone }}
  179. </div>
  180. <div
  181. class="fixed-desc summary-desc"
  182. :style="{
  183. opacity: summaryOpacity,
  184. }"
  185. >
  186. {{ summaryDesc }}
  187. </div>
  188. <OperationTip
  189. v-if="store.state.isStartupInvisible"
  190. class="operation-tip"
  191. text="了解作品"
  192. :is-show="isShowOperationTip"
  193. />
  194. <div
  195. ref="scrollerEl"
  196. class="scroller"
  197. >
  198. <div class="inner" />
  199. </div>
  200. <!-- 热点详情页 -->
  201. <Transition name="fade-in-out">
  202. <HotspotDetail1
  203. v-if="isShowHotspotDetail1"
  204. class="hotspot-detail"
  205. @close="isShowHotspotDetail1 = false"
  206. />
  207. </Transition>
  208. <!-- <Transition name="fade-in-out">
  209. <PaintingDetail
  210. v-if="isShowPaintingDetail"
  211. :thumb="require(`@/assets/images/home-painting.jpg`)"
  212. :title="'修篁树石图'"
  213. :author="'李衎'"
  214. :age="'元'"
  215. :subtitle="'轴 绢本 墨笔'"
  216. :location="'南京博物院藏'"
  217. :painting-desc="homepagePaintingDesc.join('\n\n')"
  218. :author-desc="homepageAuthorDesc.join('\n\n')"
  219. :big-painting="require(`@/assets/images/home-painting-big.jpg`)"
  220. :need-operation-tip="true"
  221. class="hotspot-detail painting-detail"
  222. @close="isShowPaintingDetail = false"
  223. />
  224. </Transition> -->
  225. <Transition name="fade-in-out">
  226. <HotspotDetail3
  227. v-if="isShowHotspotDetail3"
  228. class="hotspot-detail"
  229. @close="isShowHotspotDetail3 = false"
  230. />
  231. </Transition>
  232. </div>
  233. </template>
  234. <script setup>
  235. import { ref, computed, watch, onMounted, inject, onBeforeUnmount } from "vue"
  236. import { useRoute, useRouter } from "vue-router"
  237. import { useStore } from "vuex"
  238. import Startup from '@/views/StartupView.vue'
  239. import useSizeAdapt from "@/useFunctions/useSizeAdapt"
  240. import HotspotDetail1 from '@/views/HotspotDetail1.vue'
  241. // import PaintingDetail from '@/views/PaintingDetail.vue'
  242. import HotspotDetail3 from '@/views/HotspotDetail3.vue'
  243. import { api as viewerApi } from 'v-viewer'
  244. const route = useRoute()
  245. const router = useRouter()
  246. const store = useStore()
  247. const $env = inject('$env')
  248. const {
  249. windowSizeInCssForRef,
  250. windowSizeWhenDesignForRef,
  251. } = useSizeAdapt()
  252. const homepagePaintingDesc = configText.homepagePaintingDesc
  253. const homepageAuthorDesc = configText.homepageAuthorDesc
  254. const detailDescStem = configText.homepagePaintingDetailDescStem
  255. const detailDescLeaf = configText.homepagePaintingDetailDescLeaf
  256. const detailDescStone = configText.homepagePaintingDetailDescStone
  257. const summaryDesc = configText.homepagePaintingSummary
  258. const scrollerEl = ref(null)
  259. const scrollerElScrollTop = ref(0)
  260. function onScroll() {
  261. scrollerElScrollTop.value = scrollerEl.value.scrollTop
  262. }
  263. onMounted(() => {
  264. scrollerEl.value.addEventListener('scroll', onScroll)
  265. })
  266. onBeforeUnmount(() => {
  267. scrollerEl.value.addEventListener('scroll', onScroll)
  268. })
  269. const isShowOperationTip = ref(true)
  270. watch(scrollerElScrollTop, (v) => {
  271. if (v > 0) {
  272. isShowOperationTip.value = false
  273. }
  274. if (Math.abs(v - (scrollerEl.value.scrollHeight - scrollerEl.value.clientHeight)) <= 1) {
  275. router.push({
  276. name: 'MoreContent',
  277. })
  278. }
  279. })
  280. const isStartupInvisible = computed(() => {
  281. return store.state.isStartupInvisible
  282. })
  283. const titleOpacity = computed(() => {
  284. let ret = null
  285. if (scrollerElScrollTop.value <= window.innerHeight * 0.3) {
  286. ret = 1 - (window.innerHeight * 0.3 - scrollerElScrollTop.value) / (window.innerHeight * 0.3)
  287. } else if (scrollerElScrollTop.value > window.innerHeight * 0.3 && scrollerElScrollTop.value < window.innerHeight * 0.5) {
  288. ret = 1
  289. } else {
  290. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 0.5) / (window.innerHeight * (0.75 - 0.5))
  291. }
  292. return ret
  293. })
  294. const paintingTop = computed(() => {
  295. let ret = null
  296. if (scrollerElScrollTop.value <= window.innerHeight * 0.5) {
  297. ret = 180
  298. } else if (scrollerElScrollTop.value > window.innerHeight * 0.5 && scrollerElScrollTop.value < window.innerHeight * 1) {
  299. ret = (scrollerElScrollTop.value - window.innerHeight * 0.5) / (window.innerHeight * (1 - 0.5)) * (67 - 180) + 180
  300. } else {
  301. ret = 67
  302. }
  303. return ret
  304. })
  305. const longDesc = ref(null)
  306. const longDescOpacity = computed(() => {
  307. let ret = null
  308. if (scrollerElScrollTop.value <= window.innerHeight * 0.3) {
  309. ret = 1 - (window.innerHeight * 0.3 - scrollerElScrollTop.value) / (window.innerHeight * 0.3)
  310. } else if (scrollerElScrollTop.value > window.innerHeight * 0.3 && scrollerElScrollTop.value < window.innerHeight * 2) {
  311. ret = 1
  312. } else {
  313. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 2) / (window.innerHeight * (3 - 2))
  314. }
  315. return ret
  316. })
  317. watch(scrollerElScrollTop, (vNew, vOld) => {
  318. if (vNew > window.innerHeight * 1) {
  319. longDesc.value.scrollTop = vNew - window.innerHeight * 1
  320. } else if (vNew < vOld && vNew <= window.innerHeight * 1) {
  321. longDesc.value.scrollTop = 0
  322. }
  323. })
  324. const stemOpacity = computed(() => {
  325. let ret = null
  326. if (scrollerElScrollTop.value <= window.innerHeight * 3) {
  327. ret = 0
  328. } else if (scrollerElScrollTop.value > window.innerHeight * 3 && scrollerElScrollTop.value < window.innerHeight * 3.5) {
  329. ret = (scrollerElScrollTop.value - window.innerHeight * 3) / (window.innerHeight * (3.5 - 3))
  330. } else if (scrollerElScrollTop.value >= window.innerHeight * 3.5 && scrollerElScrollTop.value <= window.innerHeight * 4) {
  331. ret = 1
  332. } else if (scrollerElScrollTop.value > window.innerHeight * 4 && scrollerElScrollTop.value < window.innerHeight * 4.5) {
  333. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 4) / (window.innerHeight * (4.5 - 4))
  334. } else {
  335. ret = 0
  336. }
  337. return ret
  338. })
  339. const leafOpacity = computed(() => {
  340. let ret = null
  341. if (scrollerElScrollTop.value <= window.innerHeight * 5) {
  342. ret = 0
  343. } else if (scrollerElScrollTop.value > window.innerHeight * 5 && scrollerElScrollTop.value < window.innerHeight * 5.5) {
  344. ret = (scrollerElScrollTop.value - window.innerHeight * 5) / (window.innerHeight * (5.5 - 5))
  345. } else if (scrollerElScrollTop.value >= window.innerHeight * 5.5 && scrollerElScrollTop.value <= window.innerHeight * 6) {
  346. ret = 1
  347. } else if (scrollerElScrollTop.value > window.innerHeight * 6 && scrollerElScrollTop.value < window.innerHeight * 6.5) {
  348. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 6) / (window.innerHeight * (6.5 - 6))
  349. } else {
  350. ret = 0
  351. }
  352. return ret
  353. })
  354. const stoneOpacity = computed(() => {
  355. let ret = null
  356. if (scrollerElScrollTop.value <= window.innerHeight * 7) {
  357. ret = 0
  358. } else if (scrollerElScrollTop.value > window.innerHeight * 7 && scrollerElScrollTop.value < window.innerHeight * 7.5) {
  359. ret = (scrollerElScrollTop.value - window.innerHeight * 7) / (window.innerHeight * (7.5 - 7))
  360. } else if (scrollerElScrollTop.value >= window.innerHeight * 7.5 && scrollerElScrollTop.value <= window.innerHeight * 8) {
  361. ret = 1
  362. } else if (scrollerElScrollTop.value > window.innerHeight * 8 && scrollerElScrollTop.value < window.innerHeight * 8.5) {
  363. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 8) / (window.innerHeight * (8.5 - 8))
  364. } else {
  365. ret = 0
  366. }
  367. return ret
  368. })
  369. const summaryOpacity = computed(() => {
  370. let ret = null
  371. if (scrollerElScrollTop.value <= window.innerHeight * 9) {
  372. ret = 0
  373. } else if (scrollerElScrollTop.value > window.innerHeight * 9 && scrollerElScrollTop.value < window.innerHeight * 9.5) {
  374. ret = (scrollerElScrollTop.value - window.innerHeight * 9) / (window.innerHeight * (9.5 - 9))
  375. } else if (scrollerElScrollTop.value >= window.innerHeight * 9.5 && scrollerElScrollTop.value <= window.innerHeight * 10) {
  376. ret = 1
  377. } else if (scrollerElScrollTop.value > window.innerHeight * 10 && scrollerElScrollTop.value < window.innerHeight * 10.5) {
  378. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 10) / (window.innerHeight * (10.5 - 10))
  379. } else {
  380. ret = 0
  381. }
  382. return ret
  383. })
  384. const sizeOpacity = computed(() => {
  385. let ret = null
  386. if (scrollerElScrollTop.value <= window.innerHeight * 3) {
  387. ret = 0
  388. } else if (scrollerElScrollTop.value > window.innerHeight * 3 && scrollerElScrollTop.value < window.innerHeight * 3.5) {
  389. ret = (scrollerElScrollTop.value - window.innerHeight * 3) / (window.innerHeight * (3.5 - 3))
  390. } else if (scrollerElScrollTop.value >= window.innerHeight * 3.5 && scrollerElScrollTop.value <= window.innerHeight * 8) {
  391. ret = 1
  392. } else if (scrollerElScrollTop.value > window.innerHeight * 8 && scrollerElScrollTop.value < window.innerHeight * 8.5) {
  393. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 8) / (window.innerHeight * (8.5 - 8))
  394. } else {
  395. ret = 0
  396. }
  397. return ret
  398. })
  399. const isShowHotspot = computed(() => {
  400. let ret = null
  401. if (scrollerElScrollTop.value <= window.innerHeight * 3) {
  402. ret = false
  403. } else {
  404. return true
  405. }
  406. return ret
  407. })
  408. const isShowHotspotDetail1 = ref(false)
  409. // const isShowPaintingDetail = ref(false)
  410. const isShowHotspotDetail3 = ref(false)
  411. function showBigPainting() {
  412. viewerApi({
  413. images: [require(`@/assets/images/home-painting-big.jpg`)],
  414. })
  415. }
  416. </script>
  417. <style lang="less" scoped>
  418. .home {
  419. width: 100%;
  420. height: 100%;
  421. background-image: url(@/assets/images/home-painting-line-small.jpg);
  422. background-size: cover;
  423. background-repeat: no-repeat;
  424. background-position: center center;
  425. // 滚动条,只设置某一项可能导致不生效。
  426. ::-webkit-scrollbar { width: 0; height: 0; }
  427. >.bg-mask{
  428. position: absolute;
  429. left: 0;
  430. top: 0;
  431. width: 100%;
  432. height: 100%;
  433. background: rgba(60, 89, 71, 0.65);
  434. backdrop-filter: blur(calc(22 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef')));
  435. }
  436. >.startup{
  437. z-index: 10;
  438. }
  439. >.title-wrap{
  440. position: absolute;
  441. left: 50%;
  442. top: calc(6 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  443. transform: translate(-50%);
  444. width: calc(43 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  445. height: calc(180 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  446. z-index: 5;
  447. >img.title{
  448. position: absolute;
  449. left: 0;
  450. top: 0;
  451. width: 100%;
  452. height: 100%;
  453. }
  454. >.sub-text{
  455. position: absolute;
  456. left: 110%;
  457. top: 46%;
  458. transform: translateY(-50%);
  459. writing-mode: vertical-lr;
  460. font-family: KaiTi, KaiTi;
  461. font-weight: 400;
  462. font-size: calc(18 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  463. color: #FFFFFF;
  464. line-height: calc(21 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  465. white-space: pre;
  466. letter-spacing: 0.2em;
  467. text-align: center;
  468. }
  469. }
  470. >.painting-wrap{
  471. position: absolute;
  472. left: 50%;
  473. transform: translate(-50%, 0);
  474. width: calc(309 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  475. height: calc(522 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  476. >.size-sign-h{
  477. position: absolute;
  478. left: 50%;
  479. top: 0;
  480. transform: translate(-50%, -105%);
  481. width: calc(309 * 0.9 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  482. >img{
  483. width: 100%;
  484. }
  485. >span{
  486. position: absolute;
  487. left: 50%;
  488. top: 50%;
  489. transform: translate(-50%, -50%);
  490. font-family: KaiTi, KaiTi;
  491. font-weight: 400;
  492. font-size: calc(18 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  493. color: #FFFFFF;
  494. line-height: calc(23 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  495. text-shadow: 0px 0px calc(4 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef')) #F8DD86;
  496. }
  497. }
  498. >.size-sign-v{
  499. position: absolute;
  500. right: 0;
  501. top: 50%;
  502. transform: translate(80%, -50%);
  503. height: calc(464 * 0.9 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  504. >img{
  505. height: 100%;
  506. }
  507. >span{
  508. position: absolute;
  509. left: 50%;
  510. top: 50%;
  511. transform: translate(-50%, -50%);
  512. font-family: KaiTi, KaiTi;
  513. font-weight: 400;
  514. font-size: calc(18 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  515. color: #FFFFFF;
  516. line-height: calc(23 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  517. text-shadow: 0px 0px calc(4 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef')) #F8DD86;
  518. writing-mode: vertical-lr;
  519. }
  520. }
  521. >img.painting-border{
  522. position: absolute;
  523. left: 0;
  524. top: 0;
  525. width: 100%;
  526. height: 100%;
  527. }
  528. >img.painting, img.painting-stem, img.painting-leaf, img.painting-stone{
  529. position: absolute;
  530. left: 50%;
  531. top: calc(103 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  532. transform: translate(-50%, 0);
  533. width: calc(245 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  534. }
  535. }
  536. >.hotspot-wrap{
  537. position: absolute;
  538. left: 50%;
  539. transform: translate(-50%, 0);
  540. width: calc(309 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  541. height: calc(522 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  542. z-index: 7;
  543. pointer-events: none;
  544. >.hotspot-1{
  545. position: absolute;
  546. top: calc(54 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  547. right: calc(0 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  548. pointer-events: initial;
  549. }
  550. >.hotspot-2{
  551. position: absolute;
  552. left: calc(60 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  553. top: calc(222 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  554. pointer-events: initial;
  555. }
  556. >.hotspot-3{
  557. position: absolute;
  558. bottom: calc(-10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  559. right: calc(-10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  560. pointer-events: initial;
  561. }
  562. }
  563. >.long-desc{
  564. position: absolute;
  565. left: 50%;
  566. bottom: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  567. width: calc(309 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  568. transform: translate(-50%, 0);
  569. color: white;
  570. overflow: auto;
  571. font-family: KaiTi, KaiTi;
  572. color: #FFFFFF;
  573. >h3{
  574. font-size: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  575. margin-bottom: 0.5em;
  576. font-weight: 600;
  577. }
  578. >p{
  579. font-weight: 400;
  580. font-size: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  581. line-height: calc(25 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  582. text-align: justify;
  583. margin-bottom: 0.5em;
  584. }
  585. }
  586. >.fixed-desc{
  587. position: absolute;
  588. left: 50%;
  589. transform: translateX(-50%);
  590. width: calc(309 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  591. height: 20%;
  592. display: flex;
  593. justify-content: center;
  594. align-items: center;
  595. font-family: KaiTi, KaiTi;
  596. color: #FFFFFF;
  597. font-weight: 400;
  598. font-size: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  599. line-height: calc(25 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  600. text-align: justify;
  601. }
  602. >.operation-tip{
  603. position: absolute;
  604. left: 50%;
  605. bottom: calc(77 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  606. transform: translateX(-50%);
  607. }
  608. >.scroller{
  609. position: absolute;
  610. left: 0;
  611. top: 0;
  612. width: 100%;
  613. height: 100%;
  614. overflow: auto;
  615. >.inner{
  616. width: 100%;
  617. height: 1000%;
  618. }
  619. }
  620. >.hotspot-detail{
  621. z-index: 10;
  622. }
  623. >.hotspot-detail.painting-detail{
  624. backdrop-filter: blur(calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef')));
  625. }
  626. }
  627. </style>