UNPKG

vexip-ui

Version:

A Vue 3 UI library, Highly customizability, full TypeScript, performance pretty good

1 lines 34 kB
{"version":3,"file":"scroll.vue2.mjs","sources":["../../../components/scroll/scroll.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { Scrollbar } from '@/components/scrollbar'\nimport { ResizeObserver } from '@/components/resize-observer'\n\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowReadonly,\n toRef,\n watch,\n watchEffect,\n} from 'vue'\n\nimport { emitEvent, useNameHelper, useProps } from '@vexip-ui/config'\nimport { useRtl, useSetTimeout } from '@vexip-ui/hooks'\nimport { USE_TOUCH, createEventEmitter, isClient, isElement, isTrue } from '@vexip-ui/utils'\nimport { scrollProps } from './props'\nimport { useScrollWrapper } from './hooks'\nimport { MOVE_EVENT, UP_EVENT, scrollModes } from './symbol'\n\nimport type { ScrollbarExposed } from '@/components/scrollbar'\nimport type { EventHandler } from '@vexip-ui/utils'\nimport type { ScrollMode } from './symbol'\n\ndefineOptions({ name: 'Scroll' })\n\nconst _props = defineProps(scrollProps)\nconst props = useProps('scroll', _props, {\n scrollClass: null,\n scrollStyle: null,\n scrollAttrs: null,\n mode: {\n default: 'vertical',\n validator: value => scrollModes.includes(value),\n },\n width: '',\n height: '',\n deltaX: 40,\n deltaY: 40,\n disabled: false,\n pointer: USE_TOUCH,\n wheel: true,\n scrollX: {\n default: 0,\n static: true,\n },\n scrollY: {\n default: 0,\n static: true,\n },\n useXBar: false,\n useYBar: false,\n barFade: 1500,\n barClass: null,\n autoplay: false,\n playWaiting: 500,\n noBuffer: false,\n noTransition: false,\n onBeforeScroll: {\n default: null,\n isFunc: true,\n },\n useBarTrack: false,\n scrollTag: 'div',\n})\n\nconst emitter = createEventEmitter()\n\nconst nh = useNameHelper('scroll')\nconst { isRtl } = useRtl()\nconst { timer } = useSetTimeout()\n\nconst usingBar = ref(false)\nconst scrolling = ref(false)\nconst transitionDuration = ref<number>(0)\nconst mode = computed(() => (props.mode === 'horizontal-exact' ? 'horizontal' : props.mode))\n\nlet waitDelay = 180\n\nconst xBar = ref<ScrollbarExposed>()\nconst yBar = ref<ScrollbarExposed>()\n\nlet initialized = false\n\nconst {\n wrapperEl,\n contentEl,\n\n wrapper,\n isReady,\n x,\n y,\n percentX,\n percentY,\n xScrollLimit,\n yScrollLimit,\n enableXScroll,\n enableYScroll,\n xBarLength,\n yBarLength,\n\n handleResize,\n verifyScroll,\n computePercent,\n refresh,\n triggerUpdate,\n} = useScrollWrapper({\n mode,\n disabled: toRef(props, 'disabled'),\n width: toRef(props, 'width'),\n height: toRef(props, 'height'),\n scrollX: toRef(props, 'scrollX'),\n scrollY: toRef(props, 'scrollY'),\n onResize: entry => {\n emitEvent(props.onResize, entry)\n },\n // onBeforeRefresh: stopAutoplay,\n onAfterRefresh: () => {\n syncBarScroll()\n\n if (!initialized) {\n initialized = true\n startAutoplay()\n }\n },\n})\n\nconst slotParams = shallowReadonly({\n getState,\n refresh,\n scrollTo,\n scrollBy,\n scrollToElement,\n ensureInView,\n})\n\n/* autoplay */\nconst canPlay = ref(false)\n\nconst canAutoplay = computed(() => {\n return (\n mode.value !== 'both' &&\n (isTrue(props.autoplay) || +props.autoplay > 1000) &&\n ((mode.value === 'horizontal' && enableXScroll.value) ||\n (mode.value === 'vertical' && enableYScroll.value))\n )\n})\n\nwatch([() => props.autoplay, () => props.playWaiting], () => {\n stopAutoplay()\n nextTick(startAutoplay)\n})\n\nfunction startAutoplay() {\n if (!canAutoplay.value) return\n\n stopAutoplay()\n\n const distance = mode.value === 'horizontal' ? 'width' : 'height'\n const limit = mode.value === 'horizontal' ? xScrollLimit : yScrollLimit\n // const prop = mode.value === 'horizontal' ? 'x' : 'y'\n const prop = mode.value === 'horizontal' ? x : y\n const waiting = props.playWaiting < 20 ? 20 : props.playWaiting\n\n let playSpeed = 0.5\n\n if (typeof props.autoplay === 'number') {\n playSpeed = (wrapper[distance] / props.autoplay) * 16\n }\n\n const precessScroll = () => {\n computePercent()\n triggerUpdate()\n syncBarScroll()\n emitScrollEvent(mode.value)\n }\n const scroll = () => {\n prop.value -= playSpeed\n\n if (prop.value <= limit.value) {\n prop.value = limit.value\n canPlay.value = false\n\n precessScroll()\n\n timer.end = setTimeout(() => {\n scrollTo(0, 0, 500)\n\n timer.start = setTimeout(() => {\n canPlay.value = true\n\n emitScrollEvent(mode.value)\n scroll()\n }, 500 + waiting)\n }, waiting)\n } else {\n precessScroll()\n\n if (canPlay.value) {\n requestAnimationFrame(scroll)\n }\n }\n }\n\n timer.play = setTimeout(() => {\n canPlay.value = true\n scroll()\n }, waiting)\n}\n\nfunction stopAutoplay() {\n canPlay.value = false\n\n clearTimeout(timer.play)\n clearTimeout(timer.start)\n clearTimeout(timer.end)\n}\n/* autoplay */\n\nconst className = computed(() => {\n return [\n nh.b(),\n nh.bs('vars'),\n nh.bm(mode.value),\n {\n [nh.bm('inherit')]: props.inherit,\n [nh.bm('using-bar')]: usingBar.value,\n [nh.bm('scrolling')]: scrolling.value,\n [nh.bm('no-ready')]: !isReady.value,\n [nh.bm('no-transition')]: props.noTransition,\n },\n ]\n})\nconst style = computed(() => {\n const { width, height } = props\n\n return {\n width: width\n ? typeof width === 'string'\n ? Number.isNaN(Number(width))\n ? width\n : `${Number(width)}px`\n : `${width}px`\n : undefined,\n height: height\n ? typeof height === 'string'\n ? Number.isNaN(Number(height))\n ? height\n : `${Number(height)}px`\n : `${height}px`\n : undefined,\n }\n})\nconst wrapperClass = computed(() => {\n return [props.scrollAttrs?.class, props.scrollClass, nh.be('wrapper')]\n})\nconst wrapperStyle = computed(() => {\n return [props.scrollAttrs?.style, props.scrollStyle]\n})\n\nwatch(enableXScroll, value => {\n emitEvent(props.onXEnabledChange, value)\n})\nwatch(enableYScroll, value => {\n emitEvent(props.onYEnabledChange, value)\n})\nwatch(isReady, value => {\n if (value) {\n transitionDuration.value = -1\n emitEvent(props.onReady)\n } else {\n transitionDuration.value = 0\n }\n})\nwatchEffect(() => {\n if (!contentEl.value) return\n\n contentEl.value.style.transform = `translate3d(${isRtl.value ? -x.value : x.value}px, ${\n y.value\n }px, 0)`\n})\nwatchEffect(() => {\n if (!contentEl.value) return\n\n contentEl.value.style.transitionDuration =\n transitionDuration.value < 0 ? '' : `${transitionDuration.value}ms`\n})\n\nonMounted(() => {\n if (!isClient || !wrapperEl.value) return\n\n const style = getComputedStyle(wrapperEl.value)\n const duration = style.getPropertyValue(nh.cv('move-duration')).trim()\n\n if (duration.endsWith('ms')) {\n waitDelay = parseFloat(duration)\n } else if (duration.endsWith('s')) {\n waitDelay = parseFloat(duration) * 1000\n }\n\n waitDelay = Number.isNaN(waitDelay) ? 140 : waitDelay\n})\n\nonBeforeUnmount(stopAutoplay)\n\ndefineExpose({\n percentX,\n percentY,\n x,\n y,\n isReady,\n\n xBarLength,\n yBarLength,\n enableXScroll,\n enableYScroll,\n\n wrapper: wrapperEl,\n content: contentEl,\n xBar,\n yBar,\n\n refresh,\n scrollTo,\n scrollBy,\n scrollToElement,\n ensureInView,\n getXScrollLimit,\n getYScrollLimit,\n addScrollListener,\n removeScrollListener,\n})\n\nfunction getCommonPayload() {\n return {\n clientX: -x.value,\n clientY: -y.value,\n percentX: percentX.value,\n percentY: percentY.value,\n }\n}\n\nfunction syncBarScroll() {\n xBar.value?.handleScroll(percentX.value)\n yBar.value?.handleScroll(percentY.value)\n}\n\nfunction handleMouseDown(event: MouseEvent) {\n if (!props.pointer || event.button > 0 || USE_TOUCH) {\n return false\n }\n\n handlePointerDown(event)\n}\n\nfunction handleTouchStart(event: TouchEvent) {\n if (!props.pointer || event.touches.length !== 1) {\n return false\n }\n\n handlePointerDown(event)\n}\n\n// 记录滚动开始位置\nlet xScrollStartAt = 0\nlet yScrollStartAt = 0\n\n// 记录滚动开始鼠标位置\nlet cursorXPosition = 0\nlet cursorYPosition = 0\n\nlet moved = false\nlet target: EventTarget | null = null\nlet lastDate = 0\n\nfunction handlePointerDown(event: MouseEvent | TouchEvent) {\n if (!enableXScroll.value && !enableYScroll.value) {\n return false\n }\n\n if (event.cancelable) {\n event.preventDefault()\n }\n\n prepareScroll()\n\n transitionDuration.value = 0\n\n const pointer = 'touches' in event ? event.touches[0] : event\n\n xScrollStartAt = x.value\n yScrollStartAt = y.value\n cursorXPosition = pointer.clientX\n cursorYPosition = pointer.clientY\n\n moved = false\n target = event.target\n lastDate = Date.now()\n\n document.addEventListener(MOVE_EVENT, handlePointerMove)\n document.addEventListener(UP_EVENT, handlePointerUp)\n\n emitEvent(props.onScrollStart, getCommonPayload())\n}\n\nfunction handlePointerMove(event: MouseEvent | TouchEvent) {\n event.stopPropagation()\n\n if (!USE_TOUCH) {\n event.preventDefault()\n }\n\n const pointer = 'touches' in event ? event.touches[0] : event\n const signX = pointer.clientX - cursorXPosition > 0 ? 1 : -1\n const signY = pointer.clientY - cursorYPosition > 0 ? 1 : -1\n\n if (props.onBeforeScroll?.({ signX, signY }) === false) {\n return false\n }\n\n scrolling.value = true\n\n if (enableXScroll.value) {\n x.value = xScrollStartAt + pointer.clientX - cursorXPosition\n moved = true\n }\n\n if (enableYScroll.value) {\n y.value = yScrollStartAt + pointer.clientY - cursorYPosition\n moved = true\n }\n\n if (props.noBuffer) {\n verifyScroll()\n } else {\n computePercent()\n triggerUpdate()\n }\n\n syncBarScroll()\n emitScrollEvent(mode.value)\n}\n\nfunction handlePointerUp(event: MouseEvent | TouchEvent) {\n if (!moved && target && event.target === target && Date.now() - lastDate <= 500) {\n target.dispatchEvent(new MouseEvent('click', event))\n }\n\n document.removeEventListener(MOVE_EVENT, handlePointerMove)\n document.removeEventListener(UP_EVENT, handlePointerUp)\n\n transitionDuration.value = -1\n moved = false\n\n handleBuffer()\n verifyScroll()\n syncBarScroll()\n emitEvent(props.onScrollEnd, getCommonPayload())\n startAutoplay()\n}\n\n// 按下 shift 时为横向滚动,保持和原生操作一致\nfunction handleWheel(event: WheelEvent, type: 'vertical' | 'horizontal') {\n const isVerticalScroll = enableYScroll.value && type === 'vertical'\n const isHorizontalScroll = enableXScroll.value && type === 'horizontal'\n\n // 纵横滚动均使用 deltaY 标记\n const sign = event.deltaY > 0 ? -1 : 1\n\n if (\n props.wheel &&\n (isVerticalScroll || isHorizontalScroll) &&\n props.onBeforeScroll?.({ signX: -sign, signY: -sign }) !== false\n ) {\n event.preventDefault()\n event.stopPropagation()\n } else {\n return true\n }\n\n if (mode.value !== 'both' && mode.value !== type) return false\n\n prepareScroll()\n\n const computedDelta = sign * (type === 'horizontal' ? props.deltaX : props.deltaY)\n\n if (isVerticalScroll) {\n y.value += computedDelta\n } else if (isHorizontalScroll) {\n x.value += computedDelta\n }\n\n verifyScroll()\n syncBarScroll()\n emitScrollEvent(type)\n\n emitEvent(props.onWheel, {\n ...getCommonPayload(),\n type,\n sign: -sign as 1 | -1,\n })\n\n startAutoplay()\n}\n\nfunction prepareScroll() {\n stopAutoplay()\n clearTimeout(timer.buffer)\n}\n\nfunction handleBuffer() {\n if (props.noBuffer) {\n timer.buffer = setTimeout(() => {\n scrolling.value = false\n }, 300)\n } else {\n scrolling.value = false\n }\n}\n\nfunction handleBarScrollStart(type: 'vertical' | 'horizontal') {\n usingBar.value = true\n emitEvent(props.onBarScrollStart, { ...getCommonPayload(), type })\n}\n\nfunction handleBarScrollEnd(type: 'vertical' | 'horizontal') {\n usingBar.value = false\n emitEvent(props.onBarScrollEnd, { ...getCommonPayload(), type })\n}\n\nfunction handleXBarScroll(percent: number) {\n percentX.value = percent\n x.value = (percent * xScrollLimit.value) / 100\n triggerUpdate()\n\n emitEvent(props.onBarScroll, {\n ...getCommonPayload(),\n type: 'horizontal',\n })\n emitScrollEvent('horizontal')\n}\n\nfunction handleYBarScroll(percent: number) {\n percentY.value = percent\n y.value = (percent * yScrollLimit.value) / 100\n triggerUpdate()\n\n emitEvent(props.onBarScroll, {\n ...getCommonPayload(),\n type: 'vertical',\n })\n emitScrollEvent('vertical')\n}\n\nfunction emitScrollEvent(type: Exclude<ScrollMode, 'horizontal-exact'>) {\n emitEvent(props.onScroll, {\n ...getCommonPayload(),\n type,\n })\n emitter.emit('scroll', {\n ...getCommonPayload(),\n type,\n })\n}\n\nfunction ensureScrollOffset() {\n if (wrapperEl.value) {\n wrapperEl.value.scrollTop = 0\n wrapperEl.value.scrollLeft = 0\n }\n}\n\nfunction getState() {\n const { clientX: scrollX, clientY: scrollY, percentX, percentY } = getCommonPayload()\n\n return {\n scrollX,\n scrollY,\n percentX,\n percentY,\n enableXScroll: enableXScroll.value,\n enableYScroll: enableYScroll.value,\n }\n}\n\nfunction waitTransition(duration = waitDelay) {\n clearTimeout(timer.wait)\n\n return new Promise<void>(resolve => {\n timer.wait = setTimeout(() => resolve(), duration + 1)\n })\n}\n\nfunction scrollTo(clientX: number, clientY: number, duration?: number) {\n setDuration(duration)\n nextTick(() => {\n let changed = false\n\n if (enableXScroll.value && Math.abs(x.value + clientX) > 0.01) {\n x.value = -clientX\n changed = true\n }\n\n if (enableYScroll.value && Math.abs(y.value + clientY) > 0.01) {\n y.value = -clientY\n changed = true\n }\n\n verifyScroll()\n syncBarScroll()\n\n if (!changed) transitionDuration.value = -1\n })\n\n return waitTransition(duration)\n}\n\nfunction scrollBy(deltaX: number, deltaY: number, duration?: number) {\n setDuration(duration)\n nextTick(() => {\n let changed = false\n\n if (deltaX && enableXScroll) {\n x.value -= deltaX\n changed = true\n }\n\n if (deltaY && enableYScroll) {\n y.value -= deltaY\n changed = true\n }\n\n verifyScroll()\n syncBarScroll()\n\n if (!changed) transitionDuration.value = -1\n })\n\n return waitTransition(duration)\n}\n\nfunction setDuration(duration?: number) {\n if (typeof duration === 'number') {\n transitionDuration.value = duration\n\n if (transitionDuration.value === 0) {\n nextTick(() => {\n transitionDuration.value = -1\n })\n }\n }\n}\n\nfunction scrollToElement(el: string | Element, duration?: number, offset = 0) {\n if (!contentEl.value) return Promise.resolve()\n\n if (typeof el === 'string') {\n el = contentEl.value.querySelector(el)!\n }\n\n if (!isElement(el)) return Promise.resolve()\n\n const wrapperRect = contentEl.value.getBoundingClientRect()\n const elRect = el.getBoundingClientRect()\n\n let clientX = 0\n let clientY = 0\n\n if (mode.value !== 'vertical') {\n clientX = elRect.left - wrapperRect.left + offset\n }\n\n if (mode.value !== 'horizontal') {\n clientY = elRect.top - wrapperRect.top + offset\n }\n\n return scrollTo(clientX, clientY, duration)\n}\n\nfunction ensureInView(el: string | Element, duration?: number, offset = 0) {\n if (!wrapperEl.value) return Promise.resolve()\n\n if (typeof el === 'string') {\n el = wrapperEl.value.querySelector(el)!\n }\n\n if (!isElement(el)) return Promise.resolve()\n\n const wrapperRect = wrapperEl.value.getBoundingClientRect()\n const elRect = el.getBoundingClientRect()\n\n let clientX = 0\n let clientY = 0\n\n if (mode.value !== 'vertical') {\n if (elRect.left < wrapperRect.left + offset) {\n clientX = elRect.left - wrapperRect.left - offset\n } else if (elRect.right > wrapperRect.right - offset) {\n clientX = elRect.right - wrapperRect.right + offset\n }\n }\n\n if (mode.value !== 'horizontal') {\n if (elRect.top < wrapperRect.top + offset) {\n clientY = elRect.top - wrapperRect.top - offset\n } else if (elRect.bottom > wrapperRect.bottom - offset) {\n clientY = elRect.bottom - wrapperRect.bottom + offset\n }\n }\n\n return scrollBy(clientX, clientY, duration)\n}\n\nfunction getXScrollLimit() {\n return [0, -xScrollLimit.value]\n}\n\nfunction getYScrollLimit() {\n return [0, -yScrollLimit.value]\n}\n\nfunction addScrollListener(listener: EventHandler) {\n emitter.on('scroll', listener)\n}\n\nfunction removeScrollListener(listener: EventHandler) {\n emitter.off('scroll', listener)\n}\n</script>\n\n<template>\n <div\n ref=\"wrapperEl\"\n :class=\"className\"\n :style=\"style\"\n @mousedown=\"handleMouseDown\"\n @touchstart=\"handleTouchStart\"\n @scroll=\"ensureScrollOffset\"\n @wheel.exact=\"\n handleWheel($event, props.mode === 'horizontal-exact' ? 'horizontal' : 'vertical')\n \"\n @wheel.shift=\"handleWheel($event, 'horizontal')\"\n >\n <div v-if=\"$slots.extra\" :class=\"nh.be('extra')\">\n <slot name=\"extra\" v-bind=\"slotParams\"></slot>\n </div>\n <ResizeObserver throttle :on-resize=\"handleResize\">\n <component\n :is=\"props.scrollTag || 'div'\"\n v-bind=\"props.scrollAttrs\"\n ref=\"contentEl\"\n :class=\"wrapperClass\"\n :style=\"wrapperStyle\"\n @transitionend=\"transitionDuration = -1\"\n >\n <slot v-bind=\"slotParams\"></slot>\n </component>\n </ResizeObserver>\n <Scrollbar\n v-if=\"props.useXBar\"\n ref=\"xBar\"\n inherit\n placement=\"bottom\"\n :class=\"[nh.bem('bar', 'horizontal'), props.barClass]\"\n :fade=\"props.barFade\"\n :bar-length=\"xBarLength\"\n :disabled=\"!enableXScroll\"\n :duration=\"transitionDuration\"\n :use-track=\"props.useBarTrack\"\n @scroll-start=\"handleBarScrollStart('horizontal')\"\n @scroll=\"handleXBarScroll\"\n @scroll-end=\"handleBarScrollEnd('horizontal')\"\n ></Scrollbar>\n <Scrollbar\n v-if=\"props.useYBar\"\n ref=\"yBar\"\n inherit\n placement=\"right\"\n :class=\"[nh.bem('bar', 'vertical'), props.barClass]\"\n :fade=\"props.barFade\"\n :bar-length=\"yBarLength\"\n :disabled=\"!enableYScroll\"\n :duration=\"transitionDuration\"\n :use-track=\"props.useBarTrack\"\n @scroll-start=\"handleBarScrollStart('vertical')\"\n @scroll=\"handleYBarScroll\"\n @scroll-end=\"handleBarScrollEnd('vertical')\"\n ></Scrollbar>\n </div>\n</template>\n"],"names":["props","useProps","__props","value","scrollModes","USE_TOUCH","emitter","createEventEmitter","nh","useNameHelper","isRtl","useRtl","timer","useSetTimeout","usingBar","ref","scrolling","transitionDuration","mode","computed","waitDelay","xBar","yBar","initialized","wrapperEl","contentEl","wrapper","isReady","x","y","percentX","percentY","xScrollLimit","yScrollLimit","enableXScroll","enableYScroll","xBarLength","yBarLength","handleResize","verifyScroll","computePercent","refresh","triggerUpdate","useScrollWrapper","toRef","entry","emitEvent","syncBarScroll","startAutoplay","slotParams","shallowReadonly","getState","scrollTo","scrollBy","scrollToElement","ensureInView","canPlay","canAutoplay","isTrue","watch","stopAutoplay","nextTick","distance","limit","prop","waiting","playSpeed","precessScroll","emitScrollEvent","scroll","className","style","width","height","wrapperClass","_a","wrapperStyle","watchEffect","onMounted","isClient","duration","onBeforeUnmount","__expose","getXScrollLimit","getYScrollLimit","addScrollListener","removeScrollListener","getCommonPayload","_b","handleMouseDown","event","handlePointerDown","handleTouchStart","xScrollStartAt","yScrollStartAt","cursorXPosition","cursorYPosition","moved","target","lastDate","prepareScroll","pointer","MOVE_EVENT","handlePointerMove","UP_EVENT","handlePointerUp","signX","signY","handleBuffer","handleWheel","type","isVerticalScroll","isHorizontalScroll","sign","computedDelta","handleBarScrollStart","handleBarScrollEnd","handleXBarScroll","percent","handleYBarScroll","ensureScrollOffset","scrollX","scrollY","waitTransition","resolve","clientX","clientY","setDuration","changed","deltaX","deltaY","el","offset","isElement","wrapperRect","elRect","listener","_createElementBlock","$event","_unref","_cache","_withModifiers","$slots","_normalizeClass","_renderSlot","_ctx","_createVNode","ResizeObserver","_createBlock","_resolveDynamicComponent","_mergeProps","Scrollbar"],"mappings":"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"}