diff --git a/packages/frontend/src/components/MkImageGallery.vue b/packages/frontend/src/components/MkImageGallery.vue index 872e0e17c2..cd602051ed 100644 --- a/packages/frontend/src/components/MkImageGallery.vue +++ b/packages/frontend/src/components/MkImageGallery.vue @@ -18,7 +18,13 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
{ const openAnimDuration = 200; const closeAnimDuration = 200; +const slideAnimDuration = 300; const zIndex = os.claimZIndex('high'); const showing = ref(true); const screenWidth = ref(window.innerWidth); const imagesOffset = ref(currentIndex.value * -window.innerWidth); +const enableSlideTransition = ref(false); let currentScrollLeft = imagesOffset.value; function onHorizontalSwipe(offset: number) { @@ -82,16 +89,22 @@ function onHorizontalSwipe(offset: number) { } function scrollToCurrentIndex() { - currentScrollLeft = currentIndex.value * -screenWidth.value; - beginAnimation({ - from: { value: imagesOffset.value }, - to: { value: currentIndex.value * -screenWidth.value }, - duration: 300, - easing: easing_easeInOutQuad, - apply: ({ value }) => { - imagesOffset.value = value; - }, - }); + const targetOffset = currentIndex.value * -screenWidth.value; + currentScrollLeft = targetOffset; + + if (!prefer.s.animation || imagesOffset.value === targetOffset) { + enableSlideTransition.value = false; + imagesOffset.value = targetOffset; + return; + } + + enableSlideTransition.value = true; + imagesOffset.value = targetOffset; +} + +function onSlideTransitionFinished(ev: TransitionEvent) { + if (ev.propertyName !== 'translate') return; + enableSlideTransition.value = false; } function onCancelHorizontalSwipe() { @@ -164,6 +177,11 @@ function onItemClose() { contain: strict; } +.itemsTransition { + pointer-events: none; + transition: translate v-bind("slideAnimDuration + 'ms'") cubic-bezier(0.45, 0, 0.55, 1); +} + .item { width: 100dvw; height: 100dvh;