ScreenSlideList.vue 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <template>
  2. <div class="screen-slide-list">
  3. <div
  4. :class="[
  5. 'slide-item',
  6. `turning-mode-${slide.turningMode}`,
  7. {
  8. current: index === slideIndex,
  9. before: index < slideIndex,
  10. after: index > slideIndex,
  11. hide:
  12. (index === slideIndex - 1 || index === slideIndex + 1) &&
  13. slide.turningMode !== slidesWithTurningMode[slideIndex].turningMode,
  14. last: index === slideIndex - 1,
  15. next: index === slideIndex + 1,
  16. },
  17. ]"
  18. v-for="(slide, index) in slidesWithTurningMode"
  19. :key="slide.id"
  20. >
  21. <div
  22. class="slide-content"
  23. :style="{
  24. width: slideWidth + 'px',
  25. height: slideHeight + 'px',
  26. }"
  27. v-show="Math.abs(slideIndex - index) < 2 || slide.animations?.length"
  28. >
  29. <ScreenSlide
  30. :slide="slide"
  31. :scale="scale"
  32. :animationIndex="animationIndex"
  33. :turnSlideToId="turnSlideToId"
  34. :manualExitFullscreen="manualExitFullscreen"
  35. :is-visible="slideIndex === index"
  36. />
  37. </div>
  38. </div>
  39. </div>
  40. </template>
  41. <script lang="ts" setup>
  42. import { computed, provide } from 'vue'
  43. import { storeToRefs } from 'pinia'
  44. import { useSlidesStore } from '@/store'
  45. import { injectKeySlideScale } from '@/types/injectKey'
  46. import useSlidesWithTurningMode from './hooks/useSlidesWithTurningMode'
  47. import ScreenSlide from './ScreenSlide.vue'
  48. const props = defineProps<{
  49. slideWidth: number;
  50. slideHeight: number;
  51. animationIndex: number;
  52. turnSlideToId: (id: string) => void;
  53. manualExitFullscreen: () => void;
  54. slideIndex: number;
  55. }>()
  56. const { slideIndex, viewportSize } = storeToRefs(useSlidesStore())
  57. const { slidesWithTurningMode } = useSlidesWithTurningMode()
  58. const scale = computed(() => props.slideWidth / viewportSize.value)
  59. provide(injectKeySlideScale, scale)
  60. </script>
  61. <style lang="scss" scoped>
  62. .screen-slide-list {
  63. background: #1d1d1d;
  64. position: relative;
  65. width: 100%;
  66. height: 100%;
  67. }
  68. .slide-item {
  69. position: absolute;
  70. top: 0;
  71. left: 0;
  72. width: 100%;
  73. height: 100%;
  74. &:not(.last, .next) {
  75. z-index: -1;
  76. }
  77. &.current {
  78. z-index: 2;
  79. }
  80. &.hide {
  81. opacity: 0;
  82. }
  83. &.turning-mode-no {
  84. &.before {
  85. //transform: translate(0, -100%) rotate(0) scale(1);
  86. }
  87. &.after {
  88. //transform: translateY(100%);
  89. //transform: translate(0, 100%) rotate(0) scale(1);
  90. }
  91. }
  92. &.turning-mode-fade {
  93. transition: opacity 0.75s;
  94. &.before {
  95. pointer-events: none;
  96. opacity: 0;
  97. }
  98. &.after {
  99. pointer-events: none;
  100. opacity: 0;
  101. }
  102. }
  103. &.turning-mode-slideX {
  104. transition: transform 0.35s;
  105. &.before {
  106. transform: translateX(-100%);
  107. }
  108. &.after {
  109. transform: translateX(100%);
  110. }
  111. }
  112. &.turning-mode-slideY {
  113. transition: transform 0.35s;
  114. &.before {
  115. //transform: translate(0, -100%) rotate(0) scale(1);
  116. }
  117. &.after {
  118. //transform: translateY(100%);
  119. //transform: translate(0, 100%) rotate(0) scale(1);
  120. }
  121. }
  122. &.turning-mode-slideX3D {
  123. transition: transform 0.5s;
  124. &.before {
  125. transform: translateX(-100%) scale(0.5);
  126. }
  127. &.after {
  128. transform: translateX(100%) scale(0.5);
  129. }
  130. }
  131. &.turning-mode-slideY3D {
  132. transition: transform 0.5s;
  133. &.before {
  134. transform: translateY(-100%) scale(0.5);
  135. }
  136. &.after {
  137. transform: translateY(100%) scale(0.5);
  138. }
  139. }
  140. &.turning-mode-rotate {
  141. transition: transform 0.5s;
  142. transform-origin: 0 0;
  143. &.before {
  144. transform: rotate(90deg);
  145. }
  146. &.after {
  147. transform: rotate(-90deg);
  148. }
  149. }
  150. &.turning-mode-scaleY {
  151. transition: transform 0.5s;
  152. &.before {
  153. transform: scaleY(0.1);
  154. }
  155. &.after {
  156. transform: scaleY(0.1);
  157. }
  158. }
  159. &.turning-mode-scaleX {
  160. transition: transform 0.5s;
  161. &.before {
  162. transform: scaleX(0.1);
  163. }
  164. &.after {
  165. transform: scaleX(0.1);
  166. }
  167. }
  168. &.turning-mode-scale {
  169. transition: transform 0.5s;
  170. &.before {
  171. transform: scale(0.25);
  172. }
  173. &.after {
  174. transform: scale(0.25);
  175. }
  176. }
  177. &.turning-mode-scaleReverse {
  178. transition: transform 0.5s;
  179. &.before {
  180. transform: scale(2);
  181. }
  182. &.after {
  183. transform: scale(2);
  184. }
  185. }
  186. }
  187. .slide-content {
  188. background-color: #fff;
  189. position: absolute;
  190. top: 50%;
  191. left: 50%;
  192. transform: translate(-50%, -50%);
  193. display: flex;
  194. justify-content: center;
  195. align-items: center;
  196. }
  197. </style>