UNPKG

various-ui

Version:

This is a test version of the Vue 3 component library

1 lines 22.1 kB
{"version":3,"file":"composable.mjs","sources":["../../../../../../packages/components/carousel/default/src/composable.ts"],"sourcesContent":["import { gsap } from \"gsap\";\r\nimport { SetupContext, computed, ref, watch } from \"vue\";\r\nimport { UiCarouselProps, UiCarouselEmits } from \"../index\";\r\nimport { utility } from \"@various/utils\";\r\n\r\nexport const useComposable = (define: UiCarouselProps, emits: SetupContext<typeof UiCarouselEmits>[\"emit\"]) => {\r\n //* 静态变量\r\n const variable = {\r\n delay: define.transitionDelay / 1000,\r\n observer: undefined as ResizeObserver | undefined,\r\n };\r\n\r\n //* 响应式变量\r\n const refs = {\r\n main: ref<HTMLElement>(), //* 轮播图组件的主体\r\n container: ref<HTMLElement>(), //* 轮播图组件列表的容器\r\n childrens: ref<HTMLElement[]>([]), //* 轮播图组件列表\r\n autoTimer: ref<NodeJS.Timeout>(), //* 轮播图组件自动播放定时器\r\n skipTimer: ref<Boolean>(false), //* 轮播图组件是否正在跳转中\r\n active: ref<number>(0), //* 轮播图组件当前激活的列表项\r\n };\r\n\r\n //* 工具函数\r\n const utils = {\r\n //* 切换动画\r\n switch: (current: number, ready: number, option?: { notEmit?: boolean; next?: boolean; set?: boolean }) => {\r\n //* 检测是否存在轮播内容\r\n if (!refs.container.value || !refs.childrens.value?.[current] || !refs.childrens.value?.[ready]) return;\r\n else {\r\n refs.active.value = ready;\r\n }\r\n\r\n //* 触发change回调\r\n !option?.notEmit && emits(\"change\", refs.active.value);\r\n\r\n //* 缓存轮播图内容节点\r\n const currentNode = refs.childrens.value[current];\r\n const readyNode = refs.childrens.value[ready];\r\n\r\n //* 初始化容器尺寸\r\n const size = refs.container.value.clientWidth;\r\n\r\n //* 设置候选内容入场前位置\r\n if (option?.set) {\r\n gsap.set(readyNode, { translateX: option?.next ? `${-2 * size}px` : 0 });\r\n }\r\n\r\n //* 创建过渡动画时间线\r\n const timeline = gsap.timeline();\r\n //* 离场动画配置\r\n const leave = {\r\n position: \"absolute\",\r\n duration: variable.delay,\r\n translateX: option?.next ? 0 : `${-2 * size}px`,\r\n onComplete: () => {\r\n //* 重置离场节点位置\r\n gsap.set(currentNode, { translateX: 0 });\r\n\r\n //* 删除剩余动画效果\r\n timeline.kill();\r\n\r\n //* 自动播放\r\n if (define.autoplay) {\r\n refs.autoTimer.value = setTimeout(() => methods.switchCarousel(refs.active.value + 1), define.delay);\r\n }\r\n\r\n //* 关闭禁用切换\r\n refs.skipTimer.value = false;\r\n\r\n //* 触发change-after回调\r\n !option?.notEmit && emits(\"change-after\", refs.active.value);\r\n },\r\n };\r\n\r\n //* 入场动画\r\n timeline.to(readyNode, { position: \"relative\", duration: variable.delay, translateX: `${-1 * size}px` });\r\n\r\n //* 离场动画\r\n timeline.to(currentNode, leave, \"<\");\r\n },\r\n\r\n //* 自动播放回调\r\n autoplayHandler: () => {\r\n refs.autoTimer.value && clearTimeout(refs.autoTimer.value);\r\n refs.autoTimer.value = setTimeout(() => {\r\n refs.autoTimer.value = undefined;\r\n if (define.autoplay) {\r\n methods.switchCarousel(refs.active.value + 1);\r\n }\r\n }, define.delay);\r\n },\r\n };\r\n\r\n //* 侦听器列表\r\n const watchs = {\r\n stopAutoPlay: watch(() => define.autoplay, utils.autoplayHandler, {\r\n immediate: true,\r\n }),\r\n };\r\n\r\n //* 函数列表\r\n const methods = {\r\n //* 初始化函数\r\n init: (number?: number) => {\r\n //* 获取模块容器失败则取消后续操作\r\n if (!refs.container.value || !refs.container.value?.children?.length) return;\r\n else {\r\n //* 初始化并缓存轮播图组件列表\r\n refs.childrens.value = [];\r\n for (let i = 0; i < refs.container.value.children.length; i++) {\r\n //* 节点初始化\r\n const node = refs.container.value.children[i] as HTMLElement;\r\n //* 样式初始化\r\n gsap.set(node, { translateX: 0, position: \"absolute\" });\r\n //* 缓存节点\r\n refs.childrens.value.push(node);\r\n }\r\n\r\n //* 显示轮播图组件当前激活的列表项\r\n if (utility.isNumber(number)) refs.active.value = number;\r\n if (refs.childrens.value[refs.active.value]) {\r\n gsap.set(refs.childrens.value[refs.active.value], {\r\n translateX: `${-1 * refs.container.value.clientWidth}px`,\r\n position: \"relative\",\r\n });\r\n }\r\n }\r\n },\r\n\r\n //* 拖拽函数\r\n dragCarousel: (ev: TouchEvent) => {\r\n //* 轮播图组件列表长度\r\n const count = refs.childrens.value.length || 0;\r\n //* 检测是否满足运行条件\r\n if (!refs.container.value || refs.skipTimer.value || count <= 1) return;\r\n\r\n //* 关闭自动播放的定时器\r\n refs.autoTimer.value && clearTimeout(refs.autoTimer.value);\r\n //* 禁用切换函数\r\n refs.skipTimer.value = true;\r\n\r\n //* 初始化鼠标位置\r\n const initPos = ev.touches[0].clientX;\r\n //* 初始化容器尺寸\r\n const size = refs.container.value?.clientWidth || 0;\r\n //* 初始化拖拽配置\r\n const option = {\r\n next: 1, //* 拖拽方向[1 = 左, -1 = 右],\r\n ready: -1, //* 候场的HTML NODE Key\r\n offset: 0, //* 拖拽距离\r\n current: refs.active.value, //* 退场的HTML NODE Key\r\n };\r\n\r\n //* 拖拽移动处理函数\r\n const ontouchmove = (ev: TouchEvent) => {\r\n //* 禁用页面默认事件\r\n ev.preventDefault();\r\n //* 初始化方向与距离\r\n option.next = ev.touches[0].clientX < initPos ? -1 : 1;\r\n option.offset = ev.touches[0].clientX - initPos;\r\n //* 拖拽距离最多不超过一屏\r\n if (Math.abs(option.offset) > size) option.offset = size * option.next;\r\n //* 获取候场的HTML Node\r\n if (ev.touches[0].clientX > initPos && refs.active.value == 0) {\r\n option.ready = count - 1;\r\n } else if (ev.touches[0].clientX < initPos && refs.active.value == count - 1) {\r\n option.ready = 0;\r\n } else {\r\n option.ready = refs.active.value - option.next;\r\n }\r\n\r\n //* 设置位置\r\n if (refs.childrens.value[option.current] && refs.childrens.value[option.ready]) {\r\n gsap.set(refs.childrens.value[option.current], { translateX: `${option.offset + -1 * size}px` });\r\n gsap.set(refs.childrens.value[option.ready], { translateX: `${option.offset + (option.next > 0 ? -2 * size : 0)}px` });\r\n }\r\n };\r\n\r\n //* 拖拽结束处理函数\r\n const ontouchend = (ev: TouchEvent) => {\r\n //* 清除注册的文档事件\r\n document.body.removeEventListener(\"touchmove\", ontouchmove);\r\n document.body.removeEventListener(\"touchend\", ontouchend);\r\n //* 触发拖拽前的事件\r\n emits(\"drag\");\r\n if (option.offset != 0) {\r\n //* 当拖拽距离小于容器尺寸的30%时, 回退位置\r\n if (Math.abs(option.offset) <= size * 0.3) {\r\n utils.switch(option.ready, option.current, { next: option.next < 0, notEmit: true });\r\n } else {\r\n utils.switch(option.current, option.ready, { next: option.next > 0 });\r\n }\r\n } else {\r\n //* 关闭禁用切换\r\n refs.skipTimer.value = false;\r\n //* 自动播放\r\n if (define.autoplay) {\r\n refs.autoTimer.value = setTimeout(() => methods.switchCarousel(refs.active.value + 1), define.delay);\r\n }\r\n }\r\n };\r\n\r\n //* 触发拖拽前的事件\r\n emits(\"drag-after\");\r\n //* 事件注册\r\n document.body.addEventListener(\"touchmove\", ontouchmove, { passive: false });\r\n document.body.addEventListener(\"touchend\", ontouchend);\r\n },\r\n\r\n //* 切换函数\r\n switchCarousel: (number: number, _data?: any) => {\r\n //* 轮播图组件列表长度\r\n const count = refs.childrens.value.length || 0;\r\n //* 检测是否满足运行条件\r\n if (!refs.container.value || refs.skipTimer.value || count <= 1 || number == refs.active.value) return;\r\n else {\r\n //* 关闭自动播放的定时器\r\n refs.autoTimer.value && clearTimeout(refs.autoTimer.value);\r\n //* 禁用切换函数\r\n refs.skipTimer.value = true;\r\n\r\n //* 轮播图触边处理\r\n if (number >= count || number < 0) {\r\n //* 轮播图到达最后一页\r\n if (number >= count) {\r\n utils.switch(refs.active.value, 0, { set: true });\r\n } else if (number < 0) {\r\n utils.switch(refs.active.value, count - 1, { set: true, next: true });\r\n }\r\n } else {\r\n utils.switch(refs.active.value, number, { set: true, next: refs.active.value > number });\r\n }\r\n }\r\n },\r\n\r\n //* 切换函数(上)\r\n switchBack: () => methods.switchCarousel(refs.active.value - 1),\r\n\r\n //* 切换函数(下)\r\n switchNext: () => methods.switchCarousel(refs.active.value + 1),\r\n };\r\n\r\n //* 计算属性\r\n const computeds = {\r\n //* 是否显示左侧控制按钮\r\n isFirstControl: computed(() => define.arrow != \"never\"),\r\n //* 是否显示右侧控制按钮\r\n isLastControl: computed(() => define.arrow != \"never\"),\r\n //* 主体类名\r\n className: computed(() => `ui-carousel-${define.arrow}`),\r\n style: computed(() => {\r\n //* 初始化返回列表\r\n const result: { [name: string]: any } = {};\r\n\r\n //* 宽度处理\r\n if (define.width) {\r\n if (utility.isNumber(define.width)) result.width = define.width + \"px\";\r\n else result.width = define.width;\r\n }\r\n\r\n //* 高度处理\r\n if (define.height) {\r\n if (utility.isNumber(define.height)) result.height = define.height + \"px\";\r\n else result.height = define.height;\r\n }\r\n\r\n return result;\r\n }),\r\n };\r\n\r\n //* 响应事件\r\n const ons = {\r\n //* 容器的处理函数\r\n container: define.drag ? { touchstart: methods.dragCarousel } : {},\r\n //* 主体的处理函数\r\n main: {\r\n mouseenter: () => refs.autoTimer.value && clearTimeout(refs.autoTimer.value),\r\n mouseleave: () => {\r\n utils.autoplayHandler();\r\n },\r\n },\r\n };\r\n\r\n return { ons, refs, watchs, methods, computeds, variable };\r\n};\r\n"],"names":["utility.isNumber","ev"],"mappings":"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"}