HomeView.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  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. top: `${(paintingTop + 550) / windowSizeWhenDesignForRef * windowSizeInCssForRef.substring(0, windowSizeInCssForRef.length - 2)}px`,
  184. opacity: summaryOpacity,
  185. }"
  186. >
  187. {{ summaryDesc }}
  188. </div>
  189. <OperationTip
  190. v-if="isStartupOver"
  191. class="operation-tip"
  192. text="了解作品"
  193. :is-show="isShowOperationTip"
  194. />
  195. <div
  196. ref="scrollerEl"
  197. class="scroller"
  198. @touchstart="handletouchstart($event)"
  199. @touchmove="touchMove($event)"
  200. >
  201. <div class="inner" />
  202. </div>
  203. <!-- 热点详情页 -->
  204. <Transition name="fade-in-out">
  205. <HotspotDetail1
  206. v-if="isShowHotspotDetail1"
  207. class="hotspot-detail"
  208. @close="isShowHotspotDetail1 = false"
  209. />
  210. </Transition>
  211. <!-- <Transition name="fade-in-out">
  212. <PaintingDetail
  213. v-if="isShowPaintingDetail"
  214. :thumb="require(`@/assets/images/home-painting.jpg`)"
  215. :title="'修篁树石图'"
  216. :author="'李衎'"
  217. :age="'元'"
  218. :subtitle="'轴 绢本 墨笔'"
  219. :location="'南京博物院藏'"
  220. :painting-desc="homepagePaintingDesc.join('\n\n')"
  221. :author-desc="homepageAuthorDesc.join('\n\n')"
  222. :big-painting="require(`@/assets/images/home-painting-big.jpg`)"
  223. :need-operation-tip="true"
  224. class="hotspot-detail painting-detail"
  225. @close="isShowPaintingDetail = false"
  226. />
  227. </Transition> -->
  228. <Transition name="fade-in-out">
  229. <HotspotDetail3
  230. v-if="isShowHotspotDetail3"
  231. class="hotspot-detail"
  232. @close="isShowHotspotDetail3 = false"
  233. />
  234. </Transition>
  235. <Transition name="fade-in">
  236. <video
  237. v-if="isShowVideoFadeToNextPage"
  238. ref="videoFadeToNextPageEl"
  239. class="fade-to-next-page"
  240. src="@/assets/videos/fade-from-home-to-more-content.mp4"
  241. playsinline
  242. webkit-playsinline="true"
  243. x5-video-player-type="h5"
  244. @ended="router.push({
  245. name: 'MoreContent',
  246. })"
  247. />
  248. </Transition>
  249. </div>
  250. </template>
  251. <script setup>
  252. import { ref, computed, watch, onMounted, inject, onBeforeUnmount, onUnmounted, nextTick } from "vue"
  253. import { useRoute, useRouter } from "vue-router"
  254. import { useStore } from "vuex"
  255. import Startup from '@/views/StartupView.vue'
  256. import useSizeAdapt from "@/useFunctions/useSizeAdapt"
  257. import HotspotDetail1 from '@/views/HotspotDetail1.vue'
  258. // import PaintingDetail from '@/views/PaintingDetail.vue'
  259. import HotspotDetail3 from '@/views/HotspotDetail3.vue'
  260. import { api as viewerApi } from 'v-viewer'
  261. const route = useRoute()
  262. const router = useRouter()
  263. const store = useStore()
  264. const $env = inject('$env')
  265. const {
  266. windowSizeInCssForRef,
  267. windowSizeWhenDesignForRef,
  268. } = useSizeAdapt()
  269. const homepagePaintingDesc = configText.homepagePaintingDesc
  270. const homepageAuthorDesc = configText.homepageAuthorDesc
  271. const detailDescStem = configText.homepagePaintingDetailDescStem
  272. const detailDescLeaf = configText.homepagePaintingDetailDescLeaf
  273. const detailDescStone = configText.homepagePaintingDetailDescStone
  274. const summaryDesc = configText.homepagePaintingSummary
  275. const scrollerEl = ref(null)
  276. const scrollerElScrollTop = ref(0)
  277. function onScroll() {
  278. scrollerElScrollTop.value = scrollerEl.value.scrollTop
  279. }
  280. onMounted(() => {
  281. scrollerEl.value.addEventListener('scroll', onScroll)
  282. })
  283. onBeforeUnmount(() => {
  284. scrollerEl.value.removeEventListener('scroll', onScroll)
  285. })
  286. const isShowOperationTip = ref(true)
  287. watch(scrollerElScrollTop, (v) => {
  288. if (v > 0) {
  289. isShowOperationTip.value = false
  290. }
  291. })
  292. const haveShownStartup = computed(() => {
  293. return store.state.haveShownStartup
  294. })
  295. const isStartupOver = ref(false)
  296. const unwatch = watch(haveShownStartup, (v) => {
  297. if (v) {
  298. setTimeout(() => {
  299. isStartupOver.value = true
  300. }, 2000)
  301. unwatch()
  302. }
  303. })
  304. const titleOpacity = computed(() => {
  305. let ret = null
  306. if (scrollerElScrollTop.value <= window.innerHeight * 0.3) {
  307. ret = 1 - (window.innerHeight * 0.3 - scrollerElScrollTop.value) / (window.innerHeight * 0.3)
  308. } else if (scrollerElScrollTop.value > window.innerHeight * 0.3 && scrollerElScrollTop.value < window.innerHeight * 0.5) {
  309. ret = 1
  310. } else {
  311. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 0.5) / (window.innerHeight * (0.75 - 0.5))
  312. }
  313. return ret
  314. })
  315. const paintingTop = computed(() => {
  316. let ret = null
  317. if (scrollerElScrollTop.value <= window.innerHeight * 0.5) {
  318. ret = 180
  319. } else if (scrollerElScrollTop.value > window.innerHeight * 0.5 && scrollerElScrollTop.value < window.innerHeight * 1) {
  320. ret = (scrollerElScrollTop.value - window.innerHeight * 0.5) / (window.innerHeight * (1 - 0.5)) * (67 - 180) + 180
  321. } else {
  322. ret = 67
  323. }
  324. return ret
  325. })
  326. const longDesc = ref(null)
  327. const longDescOpacity = computed(() => {
  328. let ret = null
  329. if (scrollerElScrollTop.value <= window.innerHeight * 0.3) {
  330. ret = 1 - (window.innerHeight * 0.3 - scrollerElScrollTop.value) / (window.innerHeight * 0.3)
  331. } else if (scrollerElScrollTop.value > window.innerHeight * 0.3 && scrollerElScrollTop.value < window.innerHeight * 2) {
  332. ret = 1
  333. } else {
  334. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 2) / (window.innerHeight * (3 - 2))
  335. }
  336. return ret
  337. })
  338. watch(scrollerElScrollTop, (vNew, vOld) => {
  339. if (vNew > window.innerHeight * 1) {
  340. longDesc.value.scrollTop = vNew - window.innerHeight * 1
  341. } else if (vNew < vOld && vNew <= window.innerHeight * 1) {
  342. longDesc.value.scrollTop = 0
  343. }
  344. })
  345. const stemOpacity = computed(() => {
  346. let ret = null
  347. if (scrollerElScrollTop.value <= window.innerHeight * 3) {
  348. ret = 0
  349. } else if (scrollerElScrollTop.value > window.innerHeight * 3 && scrollerElScrollTop.value < window.innerHeight * 3.5) {
  350. ret = (scrollerElScrollTop.value - window.innerHeight * 3) / (window.innerHeight * (3.5 - 3))
  351. } else if (scrollerElScrollTop.value >= window.innerHeight * 3.5 && scrollerElScrollTop.value <= window.innerHeight * 4) {
  352. ret = 1
  353. } else if (scrollerElScrollTop.value > window.innerHeight * 4 && scrollerElScrollTop.value < window.innerHeight * 4.5) {
  354. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 4) / (window.innerHeight * (4.5 - 4))
  355. } else {
  356. ret = 0
  357. }
  358. return ret
  359. })
  360. const leafOpacity = computed(() => {
  361. let ret = null
  362. if (scrollerElScrollTop.value <= window.innerHeight * 5) {
  363. ret = 0
  364. } else if (scrollerElScrollTop.value > window.innerHeight * 5 && scrollerElScrollTop.value < window.innerHeight * 5.5) {
  365. ret = (scrollerElScrollTop.value - window.innerHeight * 5) / (window.innerHeight * (5.5 - 5))
  366. } else if (scrollerElScrollTop.value >= window.innerHeight * 5.5 && scrollerElScrollTop.value <= window.innerHeight * 6) {
  367. ret = 1
  368. } else if (scrollerElScrollTop.value > window.innerHeight * 6 && scrollerElScrollTop.value < window.innerHeight * 6.5) {
  369. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 6) / (window.innerHeight * (6.5 - 6))
  370. } else {
  371. ret = 0
  372. }
  373. return ret
  374. })
  375. const stoneOpacity = computed(() => {
  376. let ret = null
  377. if (scrollerElScrollTop.value <= window.innerHeight * 7) {
  378. ret = 0
  379. } else if (scrollerElScrollTop.value > window.innerHeight * 7 && scrollerElScrollTop.value < window.innerHeight * 7.5) {
  380. ret = (scrollerElScrollTop.value - window.innerHeight * 7) / (window.innerHeight * (7.5 - 7))
  381. } else if (scrollerElScrollTop.value >= window.innerHeight * 7.5 && scrollerElScrollTop.value <= window.innerHeight * 8) {
  382. ret = 1
  383. } else if (scrollerElScrollTop.value > window.innerHeight * 8 && scrollerElScrollTop.value < window.innerHeight * 8.5) {
  384. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 8) / (window.innerHeight * (8.5 - 8))
  385. } else {
  386. ret = 0
  387. }
  388. return ret
  389. })
  390. const summaryOpacity = computed(() => {
  391. let ret = null
  392. if (scrollerElScrollTop.value <= window.innerHeight * 9) {
  393. ret = 0
  394. } else if (scrollerElScrollTop.value > window.innerHeight * 9 && scrollerElScrollTop.value < window.innerHeight * 9.5) {
  395. ret = (scrollerElScrollTop.value - window.innerHeight * 9) / (window.innerHeight * (9.5 - 9))
  396. } else if (scrollerElScrollTop.value >= window.innerHeight * 9.5 && scrollerElScrollTop.value <= window.innerHeight * 10) {
  397. ret = 1
  398. } else if (scrollerElScrollTop.value > window.innerHeight * 10 && scrollerElScrollTop.value < window.innerHeight * 10.5) {
  399. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 10) / (window.innerHeight * (10.5 - 10))
  400. } else {
  401. ret = 0
  402. }
  403. return ret
  404. })
  405. const sizeOpacity = computed(() => {
  406. let ret = null
  407. if (scrollerElScrollTop.value <= window.innerHeight * 3) {
  408. ret = 0
  409. } else if (scrollerElScrollTop.value > window.innerHeight * 3 && scrollerElScrollTop.value < window.innerHeight * 3.5) {
  410. ret = (scrollerElScrollTop.value - window.innerHeight * 3) / (window.innerHeight * (3.5 - 3))
  411. } else if (scrollerElScrollTop.value >= window.innerHeight * 3.5 && scrollerElScrollTop.value <= window.innerHeight * 8) {
  412. ret = 1
  413. } else if (scrollerElScrollTop.value > window.innerHeight * 8 && scrollerElScrollTop.value < window.innerHeight * 8.5) {
  414. ret = 1 - (scrollerElScrollTop.value - window.innerHeight * 8) / (window.innerHeight * (8.5 - 8))
  415. } else {
  416. ret = 0
  417. }
  418. return ret
  419. })
  420. const isShowHotspot = computed(() => {
  421. let ret = null
  422. if (scrollerElScrollTop.value <= window.innerHeight * 3) {
  423. ret = false
  424. } else {
  425. return true
  426. }
  427. return ret
  428. })
  429. const isShowHotspotDetail1 = ref(false)
  430. // const isShowPaintingDetail = ref(false)
  431. const isShowHotspotDetail3 = ref(false)
  432. function showBigPainting() {
  433. viewerApi({
  434. images: [require(`@/assets/images/home-painting-big.jpg`)],
  435. })
  436. }
  437. /**
  438. * 上滑跳转新页面
  439. */
  440. const videoFadeToNextPageEl = ref(null)
  441. const isShowVideoFadeToNextPage = ref(false)
  442. const fingerPosYWhenTouchStart = ref(0)
  443. const isAtBottomWhenTouchStart = ref(false)
  444. const handletouchstart = (event) => {
  445. fingerPosYWhenTouchStart.value = event.changedTouches[0].pageY
  446. if (Math.abs(scrollerEl.value.scrollTop + scrollerEl.value.clientHeight - scrollerEl.value.scrollHeight) <= 1) {
  447. isAtBottomWhenTouchStart.value = true
  448. } else {
  449. isAtBottomWhenTouchStart.value = false
  450. }
  451. }
  452. const touchMove = (event) => {
  453. let currentY = event.changedTouches[0].pageY
  454. let tY = currentY - fingerPosYWhenTouchStart.value
  455. if (tY < -5 && isAtBottomWhenTouchStart.value) {
  456. isShowVideoFadeToNextPage.value = true
  457. nextTick(() => {
  458. videoFadeToNextPageEl.value.play()
  459. })
  460. }
  461. }
  462. </script>
  463. <style lang="less" scoped>
  464. .home {
  465. width: 100%;
  466. height: 100%;
  467. background-image: url(@/assets/images/home-painting-line-small.jpg);
  468. background-size: cover;
  469. background-repeat: no-repeat;
  470. background-position: center center;
  471. // 滚动条,只设置某一项可能导致不生效。
  472. ::-webkit-scrollbar { width: 0; height: 0; }
  473. >.bg-mask{
  474. position: absolute;
  475. left: 0;
  476. top: 0;
  477. width: 100%;
  478. height: 100%;
  479. background: rgba(60, 89, 71, 0.65);
  480. backdrop-filter: blur(calc(22 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef')));
  481. }
  482. >.startup{
  483. z-index: 10;
  484. }
  485. >.title-wrap{
  486. position: absolute;
  487. left: 50%;
  488. top: calc(6 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  489. transform: translate(-50%);
  490. width: calc(43 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  491. height: calc(180 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  492. z-index: 5;
  493. >img.title{
  494. position: absolute;
  495. left: 0;
  496. top: 0;
  497. width: 100%;
  498. height: 100%;
  499. }
  500. >.sub-text{
  501. position: absolute;
  502. left: 110%;
  503. top: 46%;
  504. transform: translateY(-50%);
  505. writing-mode: vertical-lr;
  506. font-family: KaiTi, KaiTi;
  507. font-weight: 400;
  508. font-size: calc(18 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  509. color: #FFFFFF;
  510. line-height: calc(21 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  511. white-space: pre;
  512. letter-spacing: 0.2em;
  513. text-align: center;
  514. }
  515. }
  516. >.painting-wrap{
  517. position: absolute;
  518. left: 50%;
  519. transform: translate(-50%, 0);
  520. width: calc(309 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  521. height: calc(522 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  522. >.size-sign-h{
  523. position: absolute;
  524. left: 50%;
  525. top: 0;
  526. transform: translate(-50%, -105%);
  527. width: calc(309 * 0.9 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  528. >img{
  529. width: 100%;
  530. }
  531. >span{
  532. position: absolute;
  533. left: 50%;
  534. top: 50%;
  535. transform: translate(-50%, -50%);
  536. font-family: KaiTi, KaiTi;
  537. font-weight: 400;
  538. font-size: calc(18 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  539. color: #FFFFFF;
  540. line-height: calc(23 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  541. text-shadow: 0px 0px calc(4 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef')) #F8DD86;
  542. }
  543. }
  544. >.size-sign-v{
  545. position: absolute;
  546. right: 0;
  547. top: 50%;
  548. transform: translate(80%, -50%);
  549. height: calc(464 * 0.9 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  550. >img{
  551. height: 100%;
  552. }
  553. >span{
  554. position: absolute;
  555. left: 50%;
  556. top: 50%;
  557. transform: translate(-50%, -50%);
  558. font-family: KaiTi, KaiTi;
  559. font-weight: 400;
  560. font-size: calc(18 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  561. color: #FFFFFF;
  562. line-height: calc(23 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  563. text-shadow: 0px 0px calc(4 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef')) #F8DD86;
  564. writing-mode: vertical-lr;
  565. }
  566. }
  567. >img.painting-border{
  568. position: absolute;
  569. left: 0;
  570. top: 0;
  571. width: 100%;
  572. height: 100%;
  573. }
  574. >img.painting, img.painting-stem, img.painting-leaf, img.painting-stone{
  575. position: absolute;
  576. left: 50%;
  577. top: calc(103 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  578. transform: translate(-50%, 0);
  579. width: calc(245 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  580. }
  581. }
  582. >.hotspot-wrap{
  583. position: absolute;
  584. left: 50%;
  585. transform: translate(-50%, 0);
  586. width: calc(309 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  587. height: calc(522 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  588. z-index: 7;
  589. pointer-events: none;
  590. >.hotspot-1{
  591. position: absolute;
  592. top: calc(54 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  593. right: calc(0 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  594. pointer-events: initial;
  595. }
  596. >.hotspot-2{
  597. position: absolute;
  598. left: calc(60 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  599. top: calc(222 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  600. pointer-events: initial;
  601. }
  602. >.hotspot-3{
  603. position: absolute;
  604. bottom: calc(-10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  605. right: calc(-10 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  606. pointer-events: initial;
  607. }
  608. }
  609. >.long-desc{
  610. position: absolute;
  611. left: 50%;
  612. bottom: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  613. width: calc(309 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  614. transform: translate(-50%, 0);
  615. color: white;
  616. overflow: auto;
  617. font-family: KaiTi, KaiTi;
  618. color: #FFFFFF;
  619. >h3{
  620. font-size: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  621. margin-bottom: 0.5em;
  622. font-weight: 600;
  623. }
  624. >p{
  625. font-weight: 400;
  626. font-size: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  627. line-height: calc(25 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  628. text-align: justify;
  629. margin-bottom: 0.5em;
  630. }
  631. }
  632. >.fixed-desc{
  633. position: absolute;
  634. left: 50%;
  635. transform: translateX(-50%);
  636. width: calc(309 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  637. height: 20%;
  638. display: flex;
  639. justify-content: center;
  640. align-items: center;
  641. font-family: KaiTi, KaiTi;
  642. color: #FFFFFF;
  643. font-weight: 400;
  644. font-size: calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  645. line-height: calc(25 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  646. text-align: justify;
  647. }
  648. >.operation-tip{
  649. position: absolute;
  650. left: 50%;
  651. bottom: calc(77 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef'));
  652. transform: translateX(-50%);
  653. }
  654. >.scroller{
  655. position: absolute;
  656. left: 0;
  657. top: 0;
  658. width: 100%;
  659. height: 100%;
  660. overflow: auto;
  661. >.inner{
  662. width: 100%;
  663. height: 1050%;
  664. }
  665. }
  666. >.hotspot-detail{
  667. z-index: 10;
  668. }
  669. >.hotspot-detail.painting-detail{
  670. backdrop-filter: blur(calc(20 / v-bind('windowSizeWhenDesignForRef') * v-bind('windowSizeInCssForRef')));
  671. }
  672. >.fade-to-next-page{
  673. position: absolute;
  674. left: 0;
  675. top: 0;
  676. width: 100%;
  677. height: 100%;
  678. object-fit: cover;
  679. z-index: 20;
  680. }
  681. }
  682. </style>