From 59f118641cc29f5c6f7d5504b037b2ae6c7aa69d Mon Sep 17 00:00:00 2001 From: Vadim Date: Thu, 21 Jan 2021 19:15:40 +0300 Subject: [PATCH] Move size functions to utils --- src/ImageCarousel.svelte | 73 ++++++++++++++++++++++++---------------- src/utils/size.js | 33 ++++++++++++++++++ 2 files changed, 77 insertions(+), 29 deletions(-) create mode 100644 src/utils/size.js diff --git a/src/ImageCarousel.svelte b/src/ImageCarousel.svelte index d0eb02f..97d5737 100644 --- a/src/ImageCarousel.svelte +++ b/src/ImageCarousel.svelte @@ -3,8 +3,14 @@ // TODO: seems CarouselChild component can be removed import { onMount } from 'svelte' import { store } from './store' + import { + getPageIndex, + getPagesCount, + getPerPageTail, + getSlideSize, + getIsNotCompletePage + } from './utils/size' - console.log('init') /** * Enable Next/Prev arrows @@ -17,50 +23,58 @@ export let infinite = true; - export let perPage = 3; + export let perPage = 2; - + + let contentContainerWidth = 0 let contentContainerElement let innerContentContainerElement - let children - let w = 0 + + function applySlideSizes() { + const children = innerContentContainerElement.children + contentContainerWidth = contentContainerElement.clientWidth + + // TODO: add event listener on resize + const slidesCount = children.length + const pagesCount = getPagesCount({ slidesCount, perPage }) + const perPageTail = getPerPageTail({ pagesCount, perPage, slidesCount }) + + let pageIndex = 0; // TODO: init value from params + for (let slideIndex=0; slideIndex { store.reset() // to init after hot reload - console.log('mounted!') store.setCurrentItemIndex(0) // to init index after hot reload, check one more time - children = innerContentContainerElement.children - console.log('children', children.length) - w = contentContainerElement.clientWidth + applySlideSizes() - let pageIndex = 0; - let pagesCount = Math.ceil(children.length/perPage) - // TODO: add event listener on resize - const perPageTail = children.length - perPage * (pagesCount - 1) - console.log('perPageTail', perPageTail) - for (let i=0; i= perPage ? Math.round(w/perPage) : Math.round(w/perPageTail) - console.log('childWidth', pageIndex === pagesCount - 1, Math.round(w/perPageTail), Math.round(w/perPage)) - children[i].style.minWidth = `${childWidth}px` - children[i].style.maxWidth = `${childWidth}px` - console.log('children', w) - store.setItem() + window.addEventListener('resize', applySlideSizes) + + + return () => { + window.removeEventListener('resize', applySlideSizes) } + + }) let offset function handlePrevClick() { store.prev({ infinite, perPage }) - offset = -$store.currentItemIndex * w // children[$store.currentItemIndex].clientWidth + offset = -$store.currentItemIndex * contentContainerWidth } function handleNextClick() { store.next({ infinite, perPage }) - // console.log('children.length', children.length, $store.currentItemIndex) - offset = -$store.currentItemIndex * w // children[$store.currentItemIndex].clientWidth - // console.log('offset', offset, children[$store.currentItemIndex].clientWidth) + offset = -$store.currentItemIndex * contentContainerWidth } @@ -103,6 +117,7 @@ flex: 1; display: flex; overflow: hidden; + box-sizing: border-box; } .content-container > div { width: 100%; diff --git a/src/utils/size.js b/src/utils/size.js new file mode 100644 index 0000000..e89a057 --- /dev/null +++ b/src/utils/size.js @@ -0,0 +1,33 @@ +export function getPagesCount({ slidesCount, perPage }) { + return Math.ceil(slidesCount/perPage) +} + +export function getPerPageTail({ + perPage, + slidesCount, + pagesCount +}) { + return slidesCount - perPage * (pagesCount - 1) +} + +export function getIsNotCompletePage({ + pageIndex, + pagesCount, +}) { + return pageIndex === pagesCount - 1 && pagesCount !== 1 +} + +export function getSlideSize({ + contentContainerWidth, + perPage, + perPageTail, + isNotCompletePage +}) { + return isNotCompletePage + ? Math.round(contentContainerWidth/perPageTail) + : Math.round(contentContainerWidth/perPage) +} + +export function getPageIndex({ slideIndex, perPage }) { + return Math.floor(slideIndex/perPage) +}