<template> 
 | 
  <el-scrollbar ref="scrollContainer" :vertical="false" class="scroll-container" @wheel.native.prevent="handleScroll"> 
 | 
    <slot /> 
 | 
  </el-scrollbar> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
const tagAndTagSpacing = 4 // tagAndTagSpacing 
 | 
  
 | 
export default { 
 | 
  name: 'ScrollPane', 
 | 
  data() { 
 | 
    return { 
 | 
      left: 0 
 | 
    } 
 | 
  }, 
 | 
  computed: { 
 | 
    scrollWrapper() { 
 | 
      return this.$refs.scrollContainer.$refs.wrap 
 | 
    } 
 | 
  }, 
 | 
  mounted() { 
 | 
    this.scrollWrapper.addEventListener('scroll', this.emitScroll, true) 
 | 
  }, 
 | 
  beforeDestroy() { 
 | 
    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="scss" scoped> 
 | 
.scroll-container { 
 | 
  white-space: nowrap; 
 | 
  position: relative; 
 | 
  overflow: hidden; 
 | 
  width: 100%; 
 | 
  ::v-deep { 
 | 
    .el-scrollbar__bar { 
 | 
      bottom: 0px; 
 | 
    } 
 | 
    .el-scrollbar__wrap { 
 | 
      height: 49px; 
 | 
    } 
 | 
  } 
 | 
} 
 | 
</style> 
 |