HomeView.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. <template>
  2. <div
  3. class="home"
  4. @mousedown="onMouseDown"
  5. @mousemove="onMouseMove"
  6. @mouseup="onMouseUp"
  7. @mouseleave="onMouseLeave"
  8. @wheel.passive="onWheel"
  9. @dragstart.prevent
  10. >
  11. <div
  12. ref="landscape-wrap"
  13. class="landscape-wrap"
  14. :style="{
  15. left: landscapePositionleft,
  16. }"
  17. >
  18. <img
  19. v-for="index in 3"
  20. :key="index"
  21. class="landscape"
  22. src="@/assets/landscape.png"
  23. alt=""
  24. @dragstart.prevent
  25. >
  26. </div>
  27. <div
  28. class="people-far-wrap"
  29. :style="{
  30. right: peopleFarPositionRight,
  31. }"
  32. >
  33. <img
  34. class="people-far"
  35. :class="peopleFarColorStatus"
  36. src="@/assets/people-far-serial-frame-400-600-60.png"
  37. alt=""
  38. @dragstart.prevent
  39. >
  40. <HotSpot
  41. v-if="[3].includes(tourState) || ([0].includes(tourState) && maskOpacity === 0)"
  42. class="hot-spot"
  43. @click="onClickPeopleFarHotSpot"
  44. />
  45. </div>
  46. <div
  47. class="people-near-wrap"
  48. :style="{
  49. left: peopleNearPositionLeft,
  50. }"
  51. >
  52. <img
  53. class="people-near"
  54. src="@/assets/people-near.png"
  55. alt=""
  56. @dragstart.prevent
  57. >
  58. <img
  59. v-show="[0, 1].includes(tourState)"
  60. ref="treasure"
  61. class="treasure"
  62. :style="{
  63. height: treasureInitialHeightPercent + '%',
  64. opacity: treasureOpacity,
  65. }"
  66. src="@/assets/treasure.png"
  67. alt=""
  68. @dragstart.prevent
  69. >
  70. </div>
  71. <img
  72. class="introduce"
  73. :style="{
  74. left: introducePositionLeft,
  75. }"
  76. src="@/assets/introduce.png"
  77. alt=""
  78. @dragstart.prevent
  79. >
  80. <div
  81. v-if="[0, 1, 2].includes(tourState) && maskOpacity !== 0"
  82. class="fade-mask"
  83. :style="{
  84. opacity: maskOpacity,
  85. }"
  86. >
  87. <img
  88. v-show="[2].includes(tourState)"
  89. src="@/assets/treasure-last-frame.jpg"
  90. alt=""
  91. >
  92. </div>
  93. <div
  94. v-show="[1].includes(tourState)"
  95. class="treasure-frames-wrap"
  96. >
  97. <img
  98. v-for="index of treasureFrameTotalNum"
  99. v-show="treasureFrameCurNum === index - 1 ||
  100. treasureFrameCurNum - 1 === index - 1
  101. "
  102. :key="index"
  103. class="treasure-frame"
  104. :src="require(`@/assets/treasure-frames/合成 1_${(index-1).toString().padStart(5, '0')}.jpg`)"
  105. alt=""
  106. @load="onTreasureFrameLoad(index - 1)"
  107. @error="onTreasureFrameError(index - 1)"
  108. >
  109. <div
  110. class="text1"
  111. :style="{opacity: text1Opacity}"
  112. >
  113. <span class="title">宋清瓷团花粉盒</span><br>
  114. <span>约公元前1220年<br>口径13.5cm 底径8cm 高6cm</span>
  115. </div>
  116. <div
  117. class="text2"
  118. :style="{opacity: text2Opacity}"
  119. >
  120. 此展品为宋代文物。子母口,浅腹,平底,盖面平;盒为子口,内有三个小碟;胎灰白,坚硬,施青色釉,口沿与底部无釉。现收藏于松阳县博物馆。
  121. </div>
  122. </div>
  123. </div>
  124. </template>
  125. <script>
  126. const initialPeopleNearPositionLeft = '25%'
  127. const initPeopleFarPositionRight = '10%'
  128. const landscapeSpeedRate = 0.02
  129. const peopleFarSpeedRate = 0.4
  130. const peopleNearSpeedRate = 0.6
  131. const introduceSpeedRate = 0.6
  132. const treasureFadeInProgressRightBorder = 3000
  133. const treasureDisplayProgressRightBorder = 6000
  134. const treasureFadeOutProgressRightBorder = 2000
  135. const translateLengthRightBorder = 900
  136. const treasureFrameTotalNum = 125
  137. const treasureInitialHeightPercent = 9
  138. const treasureFinalHeightPercent = 116
  139. export default {
  140. name: 'HomeView',
  141. components: {
  142. },
  143. data() {
  144. return {
  145. // 鼠标拖拽相关
  146. isMouseDown: false,
  147. lastMoveEventTimeStamp: 0,
  148. moveSpeed: 0,
  149. // 动画帧相关
  150. lastAnimationTimeStamp: 0,
  151. animationFrameId: null,
  152. tourState: 0, // 0:文物淡入过渡阶段;1:文物三维展示阶段;2:文物渐出过渡阶段;3:镜头平移阶段
  153. // 镜头平移相关
  154. translateLength: 0,
  155. landscapePositionleft: '18.491%',
  156. peopleFarPositionRight: initPeopleFarPositionRight,
  157. peopleNearPositionLeft: initialPeopleNearPositionLeft,
  158. introducePositionLeft: '3.347%',
  159. // 文物淡入相关
  160. treasureFadeInProgress: 0,
  161. treasureFadeInProgressRightBorder,
  162. treasureFadeInInitialLeft: 0,
  163. treasureFadeInInitialTop: 0,
  164. treasureFadeInFinalLeft: 0,
  165. treasureFadeInFinalTop: 0,
  166. treasureInitialHeightPercent,
  167. // 文物展示相关
  168. treasureDisplayProgress: 0,
  169. treasureFrameTotalNum,
  170. treasureFrameCurNum: 0,
  171. treasureFrameStateList: new Array(treasureFrameTotalNum),
  172. // 文物淡出相关
  173. treasureFadeOutProgress: 0,
  174. treasureFadeOutProgressRightBorder,
  175. // 远处人物变色相关
  176. peopleFarColorStatus: 'no-color', // 'no-color', 'color'
  177. isPeopleFarColorChanging: false,
  178. }
  179. },
  180. computed: {
  181. treasureOpacity() {
  182. if (this.tourState === 0) {
  183. if (this.treasureFadeInProgress > treasureFadeInProgressRightBorder / 2) {
  184. return 1
  185. } else {
  186. return this.treasureFadeInProgress / (treasureFadeInProgressRightBorder / 2)
  187. }
  188. } else if (this.tourState === 2) {
  189. if (this.treasureFadeOutProgress < treasureFadeOutProgressRightBorder / 2) {
  190. return 1
  191. } else {
  192. return 1 - (this.treasureFadeOutProgress - treasureFadeOutProgressRightBorder / 2) / (treasureFadeOutProgressRightBorder / 2)
  193. }
  194. } else {
  195. return 0
  196. }
  197. },
  198. maskOpacity() {
  199. if (this.tourState === 0) {
  200. if (this.treasureFadeInProgress > treasureFadeInProgressRightBorder / 2) {
  201. return 1
  202. } else {
  203. return this.treasureFadeInProgress / (treasureFadeInProgressRightBorder / 2)
  204. }
  205. } else if (this.tourState === 2) {
  206. if (this.treasureFadeOutProgress < treasureFadeOutProgressRightBorder / 2) {
  207. return 1
  208. } else {
  209. return 1 - (this.treasureFadeOutProgress - treasureFadeOutProgressRightBorder / 2) / (treasureFadeOutProgressRightBorder / 2)
  210. }
  211. } else {
  212. return 1
  213. }
  214. },
  215. text1Opacity() {
  216. if (this.tourState === 1) {
  217. if (this.treasureDisplayProgress < treasureDisplayProgressRightBorder * 0.1) {
  218. return this.treasureDisplayProgress / (treasureDisplayProgressRightBorder * 0.1)
  219. } else if (this.treasureDisplayProgress >= treasureDisplayProgressRightBorder * 0.1 && this.treasureDisplayProgress < treasureDisplayProgressRightBorder * 0.4) {
  220. return 1
  221. } else if (this.treasureDisplayProgress >= treasureDisplayProgressRightBorder * 0.4 && this.treasureDisplayProgress < treasureDisplayProgressRightBorder * 0.5) {
  222. return 1 - (this.treasureDisplayProgress - treasureDisplayProgressRightBorder * 0.4) / (treasureDisplayProgressRightBorder * (0.5 - 0.4))
  223. } else {
  224. return 0
  225. }
  226. } else {
  227. return 0
  228. }
  229. },
  230. text2Opacity() {
  231. if (this.tourState === 1) {
  232. if (this.treasureDisplayProgress < treasureDisplayProgressRightBorder * 0.5) {
  233. return 0
  234. } else if (this.treasureDisplayProgress >= treasureDisplayProgressRightBorder * 0.5 && this.treasureDisplayProgress < treasureDisplayProgressRightBorder * 0.6) {
  235. return (this.treasureDisplayProgress - treasureDisplayProgressRightBorder * 0.5) / (treasureDisplayProgressRightBorder * (0.6 - 0.5))
  236. } else if (this.treasureDisplayProgress >= treasureDisplayProgressRightBorder * 0.6 && this.treasureDisplayProgress < treasureDisplayProgressRightBorder * 0.9) {
  237. return 1
  238. } else {
  239. return 1 - (this.treasureDisplayProgress - treasureDisplayProgressRightBorder * 0.9) / (treasureDisplayProgressRightBorder * (1 - 0.9))
  240. }
  241. } else {
  242. return 0
  243. }
  244. },
  245. },
  246. watch: {
  247. tourState(vNew, vOld) {
  248. console.log('进入tourState ', vNew)
  249. if (vOld === 0 && vNew === 1) {
  250. this.treasureDisplayProgress += 0.001
  251. } else if (vOld === 1 && vNew === 2) {
  252. this.treasureFadeOutProgress += 0.001
  253. } else if (vOld === 2 && vNew === 3) {
  254. this.translateLength -= 0.001
  255. } else if (vOld === 3 && vNew === 2) {
  256. this.treasureFadeOutProgress -= 0.001
  257. } else if (vOld === 2 && vNew === 1) {
  258. this.treasureDisplayProgress -= 0.001
  259. } else if (vOld === 1 && vNew === 0) {
  260. this.treasureFadeInProgress -= 0.001
  261. }
  262. },
  263. treasureFadeInProgress: {
  264. handler(vNew, vOld) {
  265. if (vOld < this.treasureFadeInProgressRightBorder && vNew >= this.treasureFadeInProgressRightBorder && this.tourState === 0) {
  266. this.tourState = 1
  267. }
  268. if (this.treasureFadeInProgress > treasureFadeInProgressRightBorder / 2) {
  269. this.$refs.treasure.style.left = this.treasureFadeInInitialLeft + (this.treasureFadeInProgress - treasureFadeInProgressRightBorder / 2) / (treasureFadeInProgressRightBorder / 2) * (this.treasureFadeInFinalLeft - this.treasureFadeInInitialLeft) + 'px'
  270. this.$refs.treasure.style.top = this.treasureFadeInInitialTop + (this.treasureFadeInProgress - treasureFadeInProgressRightBorder / 2) / (treasureFadeInProgressRightBorder / 2) * (this.treasureFadeInFinalTop - this.treasureFadeInInitialTop) + 'px'
  271. this.$refs.treasure.style.transform = `translate(-50%, -50%) scale(${1 + (this.treasureFadeInProgress - treasureFadeInProgressRightBorder / 2) / (treasureFadeInProgressRightBorder / 2) * (treasureFinalHeightPercent / this.treasureInitialHeightPercent - 1)})`
  272. } else {
  273. this.$refs.treasure.style.left = this.treasureFadeInInitialLeft + 'px'
  274. this.$refs.treasure.style.top = this.treasureFadeInInitialTop + 'px'
  275. this.$refs.treasure.style.transform = `translate(-50%, -50%) scale(1)`
  276. }
  277. }
  278. },
  279. treasureDisplayProgress: {
  280. handler(vNew, vOld) {
  281. // 更新toureState
  282. if (vOld > 0 && vNew <= 0 && this.tourState === 1) {
  283. this.tourState = 0
  284. } else if (vOld < treasureDisplayProgressRightBorder && vNew >= treasureDisplayProgressRightBorder && this.tourState === 1) {
  285. this.tourState = 2
  286. }
  287. let idealCurNum = Math.round(this.treasureDisplayProgress / treasureDisplayProgressRightBorder * treasureFrameTotalNum)
  288. while (this.treasureFrameStateList[idealCurNum] === false) {
  289. idealCurNum--
  290. }
  291. this.treasureFrameCurNum = idealCurNum
  292. }
  293. },
  294. treasureFadeOutProgress: {
  295. handler(vNew, vOld) {
  296. if (vOld > 0 && vNew <= 0 && this.tourState === 2) {
  297. this.tourState = 1
  298. } else if (vOld < this.treasureFadeOutProgressRightBorder && vNew >= this.treasureFadeOutProgressRightBorder && this.tourState === 2) {
  299. this.tourState = 3
  300. }
  301. }
  302. },
  303. translateLength: {
  304. handler(vNew, vOld) {
  305. // const rightBorder = window.innerWidth * 2
  306. if (vOld < 0 && vNew >= 0 && this.tourState === 3) {
  307. this.tourState = 2
  308. }
  309. // if (vOld > -rightBorder && vNew <= -rightBorder && this.tourState === 3) {
  310. // this.tourState = 1
  311. // }
  312. this.landscapePositionleft = `calc(18.491% + ${vNew * landscapeSpeedRate}px)`
  313. this.peopleFarPositionRight = `calc(${initPeopleFarPositionRight} - ${vNew * peopleFarSpeedRate}px)`
  314. this.peopleNearPositionLeft = `calc(${initialPeopleNearPositionLeft} + ${vNew * peopleNearSpeedRate}px)`
  315. this.introducePositionLeft = `calc(3.347% + ${vNew * introduceSpeedRate}px)`
  316. }
  317. },
  318. },
  319. mounted() {
  320. this.animationFrameId = requestAnimationFrame(this.inertanceEffect)
  321. setTimeout(() => {
  322. this.treasureFadeInInitialLeft = this.$refs.treasure.offsetLeft
  323. this.treasureFadeInInitialTop = this.$refs.treasure.offsetTop
  324. this.treasureFadeInFinalLeft = window.innerWidth / 2 - this.$refs.treasure.offsetParent.offsetLeft
  325. this.treasureFadeInFinalTop = window.innerHeight / 2 - this.$refs.treasure.offsetParent.offsetTop
  326. }, 100)
  327. },
  328. unmounted() {
  329. cancelAnimationFrame(this.animationFrameId)
  330. },
  331. methods: {
  332. onMouseDown(e) {
  333. this.isMouseDown = true
  334. this.moveSpeed = 0
  335. this.lastMoveEventTimeStamp = 0
  336. this.lastAnimationTimeStamp = Date.now()
  337. },
  338. onMouseUp(e) {
  339. this.isMouseDown = false
  340. },
  341. onMouseLeave() {
  342. this.isMouseDown = false
  343. },
  344. onMouseMove(e) {
  345. if (this.isMouseDown) {
  346. if (this.lastMoveEventTimeStamp) {
  347. // 更新speed
  348. const currentMoveSpeed = e.movementX / (e.timeStamp - this.lastMoveEventTimeStamp)
  349. this.moveSpeed = this.moveSpeed * 0.9 + currentMoveSpeed * 0.1
  350. }
  351. this.lastMoveEventTimeStamp = e.timeStamp
  352. }
  353. },
  354. onWheel(e) {
  355. if (this.tourState === 0) {
  356. this.treasureFadeInProgress += e.deltaY
  357. if (this.treasureFadeInProgress < 0) {
  358. this.treasureFadeInProgress = 0
  359. this.moveSpeed = 0
  360. } else if (this.treasureFadeInProgress > this.treasureFadeInProgressRightBorder) {
  361. this.treasureFadeInProgress = this.treasureFadeInProgressRightBorder
  362. }
  363. } else if (this.tourState === 1) {
  364. this.treasureDisplayProgress += e.deltaY
  365. if (this.treasureDisplayProgress < 0) {
  366. this.treasureDisplayProgress = 0
  367. } else if (this.treasureDisplayProgress > treasureDisplayProgressRightBorder) {
  368. this.treasureDisplayProgress = treasureDisplayProgressRightBorder
  369. }
  370. } else if (this.tourState === 2) {
  371. this.treasureFadeOutProgress += e.deltaY
  372. if (this.treasureFadeOutProgress < 0) {
  373. this.treasureFadeOutProgress = 0
  374. } else if (this.treasureFadeOutProgress > this.treasureFadeOutProgressRightBorder) {
  375. this.treasureFadeOutProgress = this.treasureFadeOutProgressRightBorder
  376. }
  377. } else if (this.tourState === 3) {
  378. this.translateLength -= e.deltaY
  379. if (this.translateLength > 0) {
  380. this.translateLength = 0
  381. } else if (this.translateLength < -translateLengthRightBorder) {
  382. this.translateLength = -translateLengthRightBorder
  383. this.moveSpeed = 0
  384. }
  385. }
  386. },
  387. inertanceEffect() {
  388. const timeStamp = Date.now()
  389. const timeElapsed = timeStamp - this.lastAnimationTimeStamp
  390. // 速度减慢
  391. if (this.moveSpeed > 0) {
  392. this.moveSpeed -= 0.003 * timeElapsed
  393. if (this.moveSpeed < 0) {
  394. this.moveSpeed = 0
  395. }
  396. } else if (this.moveSpeed < 0) {
  397. this.moveSpeed += 0.003 * timeElapsed
  398. if (this.moveSpeed > 0) {
  399. this.moveSpeed = 0
  400. }
  401. }
  402. // 根据速度更新“距离”
  403. if (this.tourState === 0) {
  404. this.treasureFadeInProgress -= this.moveSpeed * timeElapsed
  405. if (this.treasureFadeInProgress < 0) {
  406. this.treasureFadeInProgress = 0
  407. this.moveSpeed = 0
  408. } else if (this.treasureFadeInProgress > this.treasureFadeInProgressRightBorder) {
  409. this.treasureFadeInProgress = this.treasureFadeInProgressRightBorder
  410. }
  411. } else if (this.tourState === 1) {
  412. this.treasureDisplayProgress -= this.moveSpeed * timeElapsed
  413. if (this.treasureDisplayProgress < 0) {
  414. this.treasureDisplayProgress = 0
  415. } else if (this.treasureDisplayProgress > treasureDisplayProgressRightBorder) {
  416. this.treasureDisplayProgress = treasureDisplayProgressRightBorder
  417. }
  418. } else if (this.tourState === 2) {
  419. this.treasureFadeOutProgress -= this.moveSpeed * timeElapsed
  420. if (this.treasureFadeOutProgress < 0) {
  421. this.treasureFadeOutProgress = 0
  422. } else if (this.treasureFadeOutProgress > this.treasureFadeOutProgressRightBorder) {
  423. this.treasureFadeOutProgress = this.treasureFadeOutProgressRightBorder
  424. }
  425. } else if (this.tourState === 3) {
  426. this.translateLength += this.moveSpeed * timeElapsed
  427. if (this.translateLength > 0) {
  428. this.translateLength = 0
  429. } else if (this.translateLength < -translateLengthRightBorder) {
  430. this.translateLength = -translateLengthRightBorder
  431. this.moveSpeed = 0
  432. }
  433. }
  434. this.lastAnimationTimeStamp = timeStamp
  435. this.animationFrameId = requestAnimationFrame(this.inertanceEffect)
  436. },
  437. onClickPeopleFarHotSpot() {
  438. if (this.isPeopleFarColorChanging) {
  439. return
  440. } else {
  441. if (this.peopleFarColorStatus === 'no-color') {
  442. this.peopleFarColorStatus = 'color'
  443. } else {
  444. this.peopleFarColorStatus = 'no-color'
  445. }
  446. this.isPeopleFarColorChanging = true
  447. setTimeout(() => {
  448. this.isPeopleFarColorChanging = false
  449. }, 2500)
  450. }
  451. },
  452. onTreasureFrameLoad(idx) {
  453. this.treasureFrameStateList[idx] = true
  454. },
  455. onTreasureFrameError(idx) {
  456. this.treasureFrameStateList[idx] = false
  457. },
  458. }
  459. }
  460. </script>
  461. <style lang="less" scoped>
  462. .home {
  463. width: 100%;
  464. height: 100%;
  465. background-image: url(@/assets/background.jpg);
  466. background-repeat: repeat;
  467. background-size: contain;
  468. position: relative;
  469. overflow: hidden;
  470. .landscape-wrap {
  471. position: absolute;
  472. height: 30%;
  473. top: 0;
  474. display: flex;
  475. > .landscape {
  476. height: 100%;
  477. }
  478. }
  479. > .people-far-wrap {
  480. position: absolute;
  481. top: 20%;
  482. height: 630px;
  483. width: 420px;
  484. overflow: hidden;
  485. > .people-far {
  486. position: absolute;
  487. height: 100%;
  488. transition-property: left;
  489. transition-duration: 2.5s;
  490. transition-timing-function: steps(59, jump-end);
  491. &.no-color {
  492. left: 0;
  493. }
  494. &.color {
  495. left: calc(-100% * 59)
  496. }
  497. }
  498. > .hot-spot {
  499. position: absolute;
  500. left: 52%;
  501. transform: translateX(-50%);
  502. top: 17%;
  503. }
  504. }
  505. > .people-near-wrap {
  506. position: absolute;
  507. bottom: -13%;
  508. height: 100vh;
  509. > .people-near {
  510. height: 100%;
  511. }
  512. > .treasure {
  513. position: absolute;
  514. left: 49%;
  515. top: 32.5%;
  516. z-index: 2;
  517. transform: translate(-50%, -50%);
  518. }
  519. }
  520. .introduce {
  521. position: absolute;
  522. top: 5%;
  523. width: 13.727%;
  524. }
  525. .fade-mask {
  526. position: absolute;
  527. top: 0;
  528. bottom: 0;
  529. left: 0;
  530. right: 0;
  531. background-color: #bfbfa7;
  532. z-index: 1;
  533. img {
  534. width: 100%;
  535. height: 100%;
  536. object-fit: cover;
  537. }
  538. }
  539. .treasure-frames-wrap {
  540. position: absolute;
  541. top: 0;
  542. left: 0;
  543. width: 100%;
  544. height: 100%;
  545. z-index: 3;
  546. > img {
  547. width: 100%;
  548. height: 100%;
  549. object-fit: cover;
  550. }
  551. > .text1 {
  552. color: #fff;
  553. position: absolute;
  554. top: 5%;
  555. left: 3%;
  556. .title {
  557. font-size: 24px;
  558. font-weight: bold;
  559. line-height: 2;
  560. }
  561. span {
  562. font-size: 18px;
  563. line-height: 1.5;
  564. }
  565. }
  566. > .text2 {
  567. color: #fff;
  568. position: absolute;
  569. bottom: 5%;
  570. right: 3%;
  571. width: 30%;
  572. font-size: 18px;
  573. line-height: 1.5;
  574. }
  575. }
  576. @media screen and (max-height: 810px) {
  577. .people-far-wrap {
  578. height: 540px;
  579. width: 360px;
  580. }
  581. }
  582. @media screen and (max-height: 720px) {
  583. .people-far-wrap {
  584. height: 480px;
  585. width: 320px;
  586. }
  587. }
  588. @media screen and (max-height: 630px) {
  589. .people-far-wrap {
  590. height: 420px;
  591. width: 280px;
  592. }
  593. }
  594. @media screen and (max-height: 540px) {
  595. .people-far-wrap {
  596. height: 360px;
  597. width: 240px;
  598. }
  599. }
  600. }
  601. </style>