From 18f2e324c79a005a6badcdcaa35eee60f9c1a480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fe=CC=81lix=20Pe=CC=81ault?= Date: Wed, 3 Nov 2021 18:45:18 +0100 Subject: [PATCH] Manage Carousel arrow rotation depending on the current slide Right only when first and Left only when last --- src/components/organisms/Carousel.svelte | 33 +++++++++++++++--------- src/style/organisms/_carousel.scss | 9 ++++++- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/components/organisms/Carousel.svelte b/src/components/organisms/Carousel.svelte index be61786..5585004 100644 --- a/src/components/organisms/Carousel.svelte +++ b/src/components/organisms/Carousel.svelte @@ -13,6 +13,8 @@ let carousel: EmblaCarouselType let currentSlide = 0 let arrowDirection: string = null + $: isFirstSlide = currentSlide === 0 + $: isLastSlide = currentSlide === slides.length - 1 /** Navigate to specific slide */ @@ -28,10 +30,19 @@ * */ /** Move arrow and define direction on mousemove */ - const handleArrowMove = ({ offsetX, offsetY }: MouseEvent) => { + const handleArrowMove = (event: MouseEvent) => { + const { left, top, width } = carouselEl.getBoundingClientRect() + const offsetX = event.clientX - left + const offsetY = event.clientY - top + // Define direction - const { width } = carouselEl.getBoundingClientRect() - arrowDirection = offsetX < Math.round(width / 2) ? 'prev' : 'next' + if (isFirstSlide) { + arrowDirection = 'next' + } else if (isLastSlide) { + arrowDirection = 'prev' + } else { + arrowDirection = offsetX < Math.round(width / 2) ? 'prev' : 'next' + } // Move arrow arrowPosition.set({ @@ -70,15 +81,13 @@ }) -