From b9bd29a1a81f6f7de479e3cc3fdfe3d85fc660bf Mon Sep 17 00:00:00 2001 From: he wei <858544502@qq.com> Date: 星期三, 23 四月 2025 13:35:06 +0800 Subject: [PATCH] UA 整理提交 --- src/layout/components/TagsView/ScrollPane.vue | 177 +++++++++++++++++++++++++++++++--------------------------- 1 files changed, 95 insertions(+), 82 deletions(-) diff --git a/src/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue index 29a9d2c..4749a39 100644 --- a/src/layout/components/TagsView/ScrollPane.vue +++ b/src/layout/components/TagsView/ScrollPane.vue @@ -1,86 +1,84 @@ +<script setup name="ScrollPane"> +import { ref, computed, onMounted, onBeforeUnmount, nextTick } from "vue"; + +const $emit = defineEmits(["scroll"]); +const tagAndTagSpacing = 0; // tagAndTagSpacing +const left = ref(0); +const scrollContainer = ref(); +const props = defineProps({ + tagRefs: { + type: Array, + default: () => [], + }, +}); + +const wrap = computed(() => { + return scrollContainer.value.wrapRef; +}); + +function handleScroll(e) { + const eventDelta = e.wheelDelta || -e.deltaY * 40; + scrollContainer.value.scrollLeft = wrap.scrollLeft + eventDelta / 4; +} +function emitScroll() { + $emit("scroll"); +} +function moveToTarget(currentTag) { + // const $container = $refs.scrollContainer.$el; + const $container = scrollContainer.value.$el; + const $containerWidth = $container.offsetWidth; + // const $scrollWrapper = scrollWrapper; + const $scrollWrapper = scrollContainer.value; + // const tagList = $parent.$refs.tag; + const tagList = props.tagRefs; + + let firstTag = null; + let lastTag = null; + + // find first tag and last tag + if (tagList.length > 0) { + firstTag = tagList[0]; + lastTag = tagList[tagList.length - 1]; + } + + if (firstTag === currentTag) { + $scrollWrapper.scrollLeft = 0; + } else if (lastTag === currentTag) { + $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth; + } else { + // find preTag and nextTag + const currentIndex = tagList.findIndex((item) => item === currentTag); + const prevTag = tagList[currentIndex - 1]; + const nextTag = tagList[currentIndex + 1]; + + // the tag's offsetLeft after of nextTag + const afterNextTagOffsetLeft = + nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing; + + // the tag's offsetLeft before of prevTag + const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing; + + if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) { + $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth; + } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) { + $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft; + } + } +} +defineExpose({ + moveToTarget, +}); +</script> <template> - <el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.prevent="handleScroll"> + <el-scrollbar + ref="scrollContainer" + :vertical="false" + class="scroll-container" + > + <!-- @wheel.prevent="handleScroll" --> <slot /> </el-scrollbar> </template> - -<script> -import { defineComponent } from 'vue'; - -const tagAndTagSpacing = 4; // tagAndTagSpacing - -export default defineComponent({ - name: 'ScrollPane', - data() { - return { - left: 0 - }; - }, - computed: { - scrollWrapper() { - return this.$refs.scrollContainer.$refs.wrapRef; - } - }, - mounted() { - if (this.scrollWrapper) { - this.scrollWrapper.addEventListener('scroll', this.emitScroll, true); - } - }, - beforeUnmount() { - if (this.scrollWrapper) { - this.scrollWrapper.removeEventListener('scroll', this.emitScroll); - } - }, - methods: { - handleScroll(e) { - const eventDelta = e.wheelDelta || -e.deltaY * 40; - const $scrollWrapper = this.scrollWrapper; - $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4; - }, - emitScroll() { - this.$emit('scroll'); - }, - moveToTarget(currentTag) { - const $container = this.$refs.scrollContainer.$el; - const $containerWidth = $container.offsetWidth; - const $scrollWrapper = this.scrollWrapper; - const tagList = this.$parent.$refs.tag; - - let firstTag = null; - let lastTag = null; - - // find first tag and last tag - if (tagList.length > 0) { - firstTag = tagList[0]; - lastTag = tagList[tagList.length - 1]; - } - - if (firstTag === currentTag) { - $scrollWrapper.scrollLeft = 0; - } else if (lastTag === currentTag) { - $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth; - } else { - // find preTag and nextTag - const currentIndex = tagList.findIndex(item => item === currentTag); - const prevTag = tagList[currentIndex - 1]; - const nextTag = tagList[currentIndex + 1]; - - // the tag's offsetLeft after of nextTag - const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing; - - // the tag's offsetLeft before of prevTag - const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing; - - if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) { - $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth; - } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) { - $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft; - } - } - } - } -}); -</script> <style lang="less" scoped> .scroll-container { @@ -88,13 +86,28 @@ position: relative; overflow: hidden; width: 100%; - :deep(.el-scrollbar__bar) { bottom: 0px; } - :deep(.el-scrollbar__wrap) { - height: 49px; + overflow-x: hidden; } } + +.scroll-container::-webkit-scrollbar { + height: 0; +} + +.scroll-container::-webkit-scrollbar-thumb { + /* 婊氬姩鏉¢噷闈㈠皬鏂瑰潡 */ + border-radius: 10px; + -webkit-box-shadow: none; + background: none; +} +.scroll-container::-webkit-scrollbar-track { + /* 婊氬姩鏉¢噷闈㈣建閬� */ + -webkit-box-shadow: none; + border-radius: 10px; + background: none; +} </style> -- Gitblit v1.9.1