| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- <template>
- <div class="screen-slide-list">
- <div
- :class="[
- 'slide-item',
- `turning-mode-${slide.turningMode}`,
- {
- current: index === slideIndex,
- before: index < slideIndex,
- after: index > slideIndex,
- hide:
- (index === slideIndex - 1 || index === slideIndex + 1) &&
- slide.turningMode !== slidesWithTurningMode[slideIndex].turningMode,
- last: index === slideIndex - 1,
- next: index === slideIndex + 1,
- },
- ]"
- v-for="(slide, index) in slidesWithTurningMode"
- :key="slide.id"
- >
- <div
- class="slide-content"
- :style="{
- width: slideWidth + 'px',
- height: slideHeight + 'px',
- }"
- v-show="Math.abs(slideIndex - index) < 2 || slide.animations?.length"
- >
- <ScreenSlide
- :slide="slide"
- :scale="scale"
- :animationIndex="animationIndex"
- :turnSlideToId="turnSlideToId"
- :manualExitFullscreen="manualExitFullscreen"
- :is-visible="slideIndex === index"
- />
- </div>
- </div>
- </div>
- </template>
- <script lang="ts" setup>
- import { computed, provide } from 'vue'
- import { storeToRefs } from 'pinia'
- import { useSlidesStore } from '@/store'
- import { injectKeySlideScale } from '@/types/injectKey'
- import useSlidesWithTurningMode from './hooks/useSlidesWithTurningMode'
- import ScreenSlide from './ScreenSlide.vue'
- const props = defineProps<{
- slideWidth: number;
- slideHeight: number;
- animationIndex: number;
- turnSlideToId: (id: string) => void;
- manualExitFullscreen: () => void;
- slideIndex: number;
- }>()
- const { slideIndex, viewportSize } = storeToRefs(useSlidesStore())
- const { slidesWithTurningMode } = useSlidesWithTurningMode()
- const scale = computed(() => props.slideWidth / viewportSize.value)
- provide(injectKeySlideScale, scale)
- </script>
- <style lang="scss" scoped>
- .screen-slide-list {
- background: #1d1d1d;
- position: relative;
- width: 100%;
- height: 100%;
- }
- .slide-item {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- &:not(.last, .next) {
- z-index: -1;
- }
- &.current {
- z-index: 2;
- }
- &.hide {
- opacity: 0;
- }
- &.turning-mode-no {
- &.before {
- //transform: translate(0, -100%) rotate(0) scale(1);
- }
- &.after {
- //transform: translateY(100%);
- //transform: translate(0, 100%) rotate(0) scale(1);
- }
- }
- &.turning-mode-fade {
- transition: opacity 0.75s;
- &.before {
- pointer-events: none;
- opacity: 0;
- }
- &.after {
- pointer-events: none;
- opacity: 0;
- }
- }
- &.turning-mode-slideX {
- transition: transform 0.35s;
- &.before {
- transform: translateX(-100%);
- }
- &.after {
- transform: translateX(100%);
- }
- }
- &.turning-mode-slideY {
- transition: transform 0.35s;
- &.before {
- //transform: translate(0, -100%) rotate(0) scale(1);
- }
- &.after {
- //transform: translateY(100%);
- //transform: translate(0, 100%) rotate(0) scale(1);
- }
- }
- &.turning-mode-slideX3D {
- transition: transform 0.5s;
- &.before {
- transform: translateX(-100%) scale(0.5);
- }
- &.after {
- transform: translateX(100%) scale(0.5);
- }
- }
- &.turning-mode-slideY3D {
- transition: transform 0.5s;
- &.before {
- transform: translateY(-100%) scale(0.5);
- }
- &.after {
- transform: translateY(100%) scale(0.5);
- }
- }
- &.turning-mode-rotate {
- transition: transform 0.5s;
- transform-origin: 0 0;
- &.before {
- transform: rotate(90deg);
- }
- &.after {
- transform: rotate(-90deg);
- }
- }
- &.turning-mode-scaleY {
- transition: transform 0.5s;
- &.before {
- transform: scaleY(0.1);
- }
- &.after {
- transform: scaleY(0.1);
- }
- }
- &.turning-mode-scaleX {
- transition: transform 0.5s;
- &.before {
- transform: scaleX(0.1);
- }
- &.after {
- transform: scaleX(0.1);
- }
- }
- &.turning-mode-scale {
- transition: transform 0.5s;
- &.before {
- transform: scale(0.25);
- }
- &.after {
- transform: scale(0.25);
- }
- }
- &.turning-mode-scaleReverse {
- transition: transform 0.5s;
- &.before {
- transform: scale(2);
- }
- &.after {
- transform: scale(2);
- }
- }
- }
- .slide-content {
- background-color: #fff;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- display: flex;
- justify-content: center;
- align-items: center;
- }
- </style>
|