@@ -72,6 +72,7 @@ import {
7272 watch ,
7373} from ' vue' ;
7474import debounce from ' ./utils/debounce' ;
75+ import delay from ' ./utils/delay' ;
7576import Navigation from ' ./Navigation.vue' ;
7677import Pagination from ' ./Pagination.vue' ;
7778
@@ -403,6 +404,7 @@ export default {
403404 const startTime = ref (null );
404405 const autoplayInterval = ref (null );
405406 const slotSlides = ref ([]);
407+ const isFinishSlideAdjust = ref (false );
406408
407409 // Ref template
408410 const vueConciseCarousel = ref (null );
@@ -694,8 +696,8 @@ export default {
694696 */
695697 const getSlideCount = () => {
696698 if (vueConciseCarousel .value ) {
697- const carouselInnerElements = vueConciseCarousel .value .getElementsByClassName (
698- ' VueCarousel-slide'
699+ const carouselInnerElements = vueConciseCarousel .value .querySelectorAll (
700+ ' . VueCarousel-slide:not(.VueCarousel-slide-adjust) '
699701 );
700702 slotSlides .value = carouselInnerElements;
701703 slideCount .value = carouselInnerElements .length ;
@@ -715,8 +717,20 @@ export default {
715717 * @param {Number} page The value of the new page number
716718 * @param {string|undefined} advanceType An optional value describing the type of page advance
717719 */
718- const goToPage = (page , advanceType ) => {
720+ const goToPage = async (page , advanceType ) => {
719721 if (page >= 0 && page <= pageCount .value ) {
722+ if (hasVueCarouselSlideAdjust .value && ! isFinishSlideAdjust .value ) {
723+ if (page === navigateTo .value ) {
724+ currentPage .value = navigateTo .value ;
725+ return ;
726+ }
727+
728+ dragging .value = true ;
729+ handleVueCarouselSlideAdjust ();
730+ await delay (refreshRate .value );
731+ dragging .value = false ;
732+ }
733+
720734 offset .value = props .scrollPerPage
721735 ? Math .min (
722736 slideWidth .value * currentPerPage .value * page,
@@ -810,6 +824,15 @@ export default {
810824 * @param {Object} e The event object
811825 */
812826 const onDrag = (e ) => {
827+ if (
828+ hasVueCarouselSlideAdjust .value &&
829+ ! isFinishSlideAdjust .value &&
830+ currentPage .value > 0
831+ ) {
832+ handleVueCarouselSlideAdjust ();
833+ return ;
834+ }
835+
813836 const eventPosX = isTouch ? e .touches [0 ].clientX : e .clientX ;
814837 const eventPosY = isTouch ? e .touches [0 ].clientY : e .clientY ;
815838 const newOffsetX = dragStartX .value - eventPosX;
@@ -934,6 +957,39 @@ export default {
934957 }
935958 };
936959
960+ const hasVueCarouselSlideAdjust = computed (() => {
961+ if (vueConciseCarousel .value ) {
962+ return (
963+ vueConciseCarousel .value .querySelector (
964+ ' .VueCarousel-slide-adjust'
965+ ) !== null
966+ );
967+ }
968+
969+ return false ;
970+ });
971+
972+ const handleVueCarouselSlideAdjust = () => {
973+ if (hasVueCarouselSlideAdjust .value && ! isFinishSlideAdjust .value ) {
974+ if (currentPage .value > 0 ) {
975+ offset .value = props .scrollPerPage
976+ ? Math .min (
977+ slideWidth .value * currentPerPage .value * currentPage .value ,
978+ maxOffset .value
979+ )
980+ : slideWidth .value * currentPage .value ;
981+ }
982+
983+ const element = vueConciseCarousel .value .querySelector (
984+ ' .VueCarousel-slide-adjust'
985+ );
986+ if (element) {
987+ element .parentElement .removeChild (element);
988+ }
989+ isFinishSlideAdjust .value = true ;
990+ }
991+ };
992+
937993 provide (' carousel' , {
938994 isTouch,
939995 dragStartX,
@@ -947,6 +1003,7 @@ export default {
9471003 render ();
9481004 }
9491005 });
1006+
9501007 watch (
9511008 navigateTo,
9521009 (val ) => {
@@ -981,6 +1038,9 @@ export default {
9811038 watch (currentPage, (val ) => {
9821039 ctx .emit (' page-change' , val);
9831040 ctx .emit (' input' , val);
1041+ if (currentPage .value !== navigateTo .value ) {
1042+ handleVueCarouselSlideAdjust ();
1043+ }
9841044 });
9851045 onMounted (() => {
9861046 startAutoplay ();
0 commit comments