parent
b4f2a4f7dd
commit
6a18e06339
@ -1,94 +1,94 @@ |
|||||||
<template> |
<template> |
||||||
<el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll"> |
<el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll"> |
||||||
<slot /> |
<slot /> |
||||||
</el-scrollbar> |
</el-scrollbar> |
||||||
</template> |
</template> |
||||||
|
|
||||||
<script> |
<script> |
||||||
const tagAndTagSpacing = 4 // tagAndTagSpacing |
const tagAndTagSpacing = 4 // tagAndTagSpacing |
||||||
|
|
||||||
export default { |
export default { |
||||||
name: 'ScrollPane', |
name: 'ScrollPane', |
||||||
data() { |
data() { |
||||||
return { |
return { |
||||||
left: 0 |
left: 0 |
||||||
} |
} |
||||||
}, |
}, |
||||||
computed: { |
computed: { |
||||||
scrollWrapper() { |
scrollWrapper() { |
||||||
return this.$refs.scrollContainer.$refs.wrap |
return this.$refs.scrollContainer.$refs.wrap |
||||||
} |
} |
||||||
}, |
}, |
||||||
mounted() { |
mounted() { |
||||||
this.scrollWrapper.addEventListener('scroll', this.emitScroll, true) |
this.scrollWrapper.addEventListener('scroll', this.emitScroll, true) |
||||||
}, |
}, |
||||||
beforeDestroy() { |
beforeDestroy() { |
||||||
this.scrollWrapper.removeEventListener('scroll', this.emitScroll) |
this.scrollWrapper.removeEventListener('scroll', this.emitScroll) |
||||||
}, |
}, |
||||||
methods: { |
methods: { |
||||||
handleScroll(e) { |
handleScroll(e) { |
||||||
const eventDelta = e.wheelDelta || -e.deltaY * 40 |
const eventDelta = e.wheelDelta || -e.deltaY * 40 |
||||||
const $scrollWrapper = this.scrollWrapper |
const $scrollWrapper = this.scrollWrapper |
||||||
$scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4 |
$scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4 |
||||||
}, |
}, |
||||||
emitScroll() { |
emitScroll() { |
||||||
this.$emit('scroll') |
this.$emit('scroll') |
||||||
}, |
}, |
||||||
moveToTarget(currentTag) { |
moveToTarget(currentTag) { |
||||||
const $container = this.$refs.scrollContainer.$el |
const $container = this.$refs.scrollContainer.$el |
||||||
const $containerWidth = $container.offsetWidth |
const $containerWidth = $container.offsetWidth |
||||||
const $scrollWrapper = this.scrollWrapper |
const $scrollWrapper = this.scrollWrapper |
||||||
const tagList = this.$parent.$refs.tag |
const tagList = this.$parent.$refs.tag |
||||||
|
|
||||||
let firstTag = null |
let firstTag = null |
||||||
let lastTag = null |
let lastTag = null |
||||||
|
|
||||||
// find first tag and last tag |
// find first tag and last tag |
||||||
if (tagList.length > 0) { |
if (tagList.length > 0) { |
||||||
firstTag = tagList[0] |
firstTag = tagList[0] |
||||||
lastTag = tagList[tagList.length - 1] |
lastTag = tagList[tagList.length - 1] |
||||||
} |
} |
||||||
|
|
||||||
if (firstTag === currentTag) { |
if (firstTag === currentTag) { |
||||||
$scrollWrapper.scrollLeft = 0 |
$scrollWrapper.scrollLeft = 0 |
||||||
} else if (lastTag === currentTag) { |
} else if (lastTag === currentTag) { |
||||||
$scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth |
$scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth |
||||||
} else { |
} else { |
||||||
// find preTag and nextTag |
// find preTag and nextTag |
||||||
const currentIndex = tagList.findIndex(item => item === currentTag) |
const currentIndex = tagList.findIndex(item => item === currentTag) |
||||||
const prevTag = tagList[currentIndex - 1] |
const prevTag = tagList[currentIndex - 1] |
||||||
const nextTag = tagList[currentIndex + 1] |
const nextTag = tagList[currentIndex + 1] |
||||||
|
|
||||||
// the tag's offsetLeft after of nextTag |
// the tag's offsetLeft after of nextTag |
||||||
const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing |
const afterNextTagOffsetLeft = nextTag.$el.offsetLeft + nextTag.$el.offsetWidth + tagAndTagSpacing |
||||||
|
|
||||||
// the tag's offsetLeft before of prevTag |
// the tag's offsetLeft before of prevTag |
||||||
const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing |
const beforePrevTagOffsetLeft = prevTag.$el.offsetLeft - tagAndTagSpacing |
||||||
|
|
||||||
if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) { |
if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) { |
||||||
$scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth |
$scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth |
||||||
} else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) { |
} else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) { |
||||||
$scrollWrapper.scrollLeft = beforePrevTagOffsetLeft |
$scrollWrapper.scrollLeft = beforePrevTagOffsetLeft |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
</script> |
</script> |
||||||
|
|
||||||
<style lang="scss" scoped> |
<style lang="scss" scoped> |
||||||
.scroll-container { |
.scroll-container { |
||||||
white-space: nowrap; |
white-space: nowrap; |
||||||
position: relative; |
position: relative; |
||||||
overflow: hidden; |
overflow: hidden; |
||||||
width: 100%; |
width: 100%; |
||||||
::v-deep { |
::v-deep { |
||||||
.el-scrollbar__bar { |
.el-scrollbar__bar { |
||||||
bottom: 0px; |
bottom: 0px; |
||||||
} |
} |
||||||
.el-scrollbar__wrap { |
.el-scrollbar__wrap { |
||||||
height: 49px; |
height: 39px; |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
</style> |
</style> |
||||||
|
|||||||
Loading…
Reference in new issue