index.vue 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <template>
  2. <div class="page pg-bg pg3" ref="pgRef">
  3. <div class="pg3-bg">
  4. <div>
  5. <img class="bg-left abs" src="/images/pg3/left-bg.png" alt="">
  6. <img class="bg-right abs" src="/images/pg3/right-bg.png" alt="">
  7. </div>
  8. </div>
  9. <Animate
  10. class="header"
  11. name="animate__zoomIn"
  12. delay="100ms"
  13. :ready="show"
  14. >
  15. <p class="txt" style="text-align:center">
  16. 向<br />世<br />界<br />讲<br />述
  17. </p>
  18. </Animate>
  19. <div class="nanjing">
  20. <div style="position: relative;">
  21. <Animate
  22. comp="img"
  23. src="/images/pg3/nan.png"
  24. name="animate__zoomIn"
  25. delay="100ms"
  26. :ready="show"
  27. />
  28. <Animate
  29. comp="img"
  30. class="stele abs animate__slow"
  31. src="/images/pg3/stele.png"
  32. name="animate__fadeInUp"
  33. delay="100ms"
  34. :ready="show"
  35. />
  36. </div>
  37. <div>
  38. <Animate
  39. comp="img"
  40. src="/images/pg3/jing.png"
  41. name="animate__zoomIn"
  42. delay="500ms"
  43. alt=""
  44. :ready="show"
  45. />
  46. </div>
  47. <div>
  48. <Animate
  49. class="nj-1937"
  50. comp="img"
  51. src="/images/pg3/1937.png"
  52. name="animate__fadeInLeft"
  53. delay="1000ms"
  54. alt=""
  55. :ready="show"
  56. />
  57. </div>
  58. </div>
  59. <div class="content">
  60. <Animate
  61. class="txt"
  62. comp="p"
  63. name="animate__fadeInDown"
  64. delay="1s"
  65. :ready="show"
  66. >
  67. 正如“紫金草行动”初衷一样,我们身边越来越多人,用自己的方式向世界讲述南京1937,他们不同年龄、不同肤色、不同国家、不同职业,但他们讲述的是全人类共同的心愿。
  68. </Animate>
  69. </div>
  70. <Splide
  71. :options="slideOptions"
  72. :has-track="false"
  73. @splide:move="onSlideChange"
  74. >
  75. <div class="ink-slider-wrapper">
  76. <SplideTrack>
  77. <SplideSlide
  78. v-for="(item, inx) in famous"
  79. :key="item.image"
  80. >
  81. <Ink class="slide-ink" :active="slideIndexRef == inx" :src="item.image" @click="onFamous(item)" />
  82. </SplideSlide>
  83. </SplideTrack>
  84. <div class="splide__arrows abs" style="left: 0; top: 0">
  85. <div class="splide__arrow splide__arrow--prev">
  86. <img src="/images/pg3/arrow.png" alt="" style="transform: rotate(180deg)">
  87. </div>
  88. </div>
  89. <div class="splide__arrows abs" style="right: 0; top: 0">
  90. <div class="splide__arrow splide__arrow--next">
  91. <img src="/images/pg3/arrow.png" alt="">
  92. </div>
  93. </div>
  94. </div>
  95. </Splide >
  96. <div class="btn-box">
  97. <img src="/images/pg3/btn.png" alt="" @click="onBtnClick">
  98. </div>
  99. <!-- <Persons v-if="showPerson" @cancel="showPerson = false" /> -->
  100. <IFrame v-if="showPerson" :link="personLink" @cancel="showPerson = false" />
  101. </div>
  102. </template>
  103. <script setup>
  104. import { onBeforeUnmount, onMounted, ref } from 'vue';
  105. import { useRouter } from 'vue-router';
  106. import { Splide, SplideSlide, SplideTrack } from '@splidejs/vue-splide';
  107. import Bell from '@/components/Bell.vue';
  108. import Btn from '@/components/Btn.vue';
  109. import Animate from '@/components/Animate.vue';
  110. import IFrame from '@/components/IFrame.vue';
  111. // import Persons from './Persons.vue';
  112. import Ink from './Ink.vue';
  113. import usePageShow from '../usePageShow';
  114. const router = useRouter();
  115. const [pgRef, show] = usePageShow(0.3);
  116. const showPerson = ref(false);
  117. const personLink = ref();
  118. const slideIndexRef = ref(0);
  119. const slideOptions = {
  120. // arrows: false,
  121. pagination: false,
  122. autoplay: true,
  123. type: 'loop',
  124. speed: 600,
  125. interval: 5000,
  126. }
  127. const famous = FAMOUS_LINKS;
  128. const onFamous = (famousItem) => {
  129. if (!famousItem.link) return;
  130. personLink.value = famousItem.link;
  131. showPerson.value = true;
  132. }
  133. const onVideo = () => {
  134. router.push('/pg4')
  135. }
  136. const onSlideChange = (slide, newIndex) => {
  137. slideIndexRef.value = newIndex;
  138. }
  139. const onBtnClick = () => {
  140. router.push('/pg4')
  141. }
  142. </script>
  143. <style lang="less" scoped>
  144. .pg3 {
  145. position: relative;
  146. height: auto;
  147. min-height: 100%;
  148. box-sizing: border-box;
  149. padding-bottom: 50px;
  150. .pg3-bg {
  151. position: absolute;
  152. z-index: 0;
  153. width: 100%;
  154. height: 100%;
  155. & > div {
  156. position: relative;
  157. height: 100%;
  158. }
  159. .bg-left {
  160. width: 40px;
  161. height: 158px;
  162. top: 30vh;
  163. left: 0;
  164. }
  165. .bg-right {
  166. width: 50px;
  167. height: 80px;
  168. top: 10vh;
  169. right: 0;
  170. }
  171. }
  172. .header {
  173. width: 30vw;
  174. margin: auto;
  175. // margin-top: 30px;
  176. position: relative;
  177. }
  178. .nanjing {
  179. width: 70vw;
  180. margin: auto;
  181. display: flex;
  182. align-items: center;
  183. justify-content: space-between;
  184. & > div {
  185. position: relative;
  186. }
  187. .stele {
  188. width: 6vw;
  189. bottom: 1vw;
  190. left: 6vw;
  191. }
  192. }
  193. .nj-1937 {
  194. width: 32vw;
  195. }
  196. .content {
  197. width: 70vw;
  198. margin: auto;
  199. font-size: 14px;
  200. line-height: 1.2em;
  201. .txt {
  202. color: #5D4135;
  203. }
  204. }
  205. .ink-slider-wrapper {
  206. position: relative;
  207. z-index: 2;
  208. .splide__arrows {
  209. position: absolute;
  210. z-index: 10;
  211. width: 48px;
  212. height: 54.89vw;
  213. line-height: 54.89vw;
  214. text-align: center;
  215. img {
  216. width: 12px;
  217. display: inline-block;
  218. }
  219. }
  220. }
  221. .slide-ink {
  222. width: 100vw;
  223. height: 54.89vw;
  224. }
  225. .btn-box {
  226. margin-top: 2em;
  227. text-align: center;
  228. position: relative;
  229. z-index: 200;
  230. img {
  231. width: 30vw;
  232. margin: auto;
  233. }
  234. }
  235. }
  236. </style>