index.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <template>
  2. <div class="scroll-container" ref="scrollContainer" @wheel.prevent="handleScroll" >
  3. <div class="scroll-wrapper" ref="scrollWrapper" :style="{top: top + 'px'}">
  4. <slot></slot>
  5. </div>
  6. </div>
  7. </template>
  8. <script>
  9. const delta = 15
  10. export default {
  11. name: 'scrollBar',
  12. data() {
  13. return {
  14. top: 0
  15. }
  16. },
  17. methods: {
  18. handleScroll(e) {
  19. const eventDelta = e.wheelDelta || -e.deltaY * 3
  20. const $container = this.$refs.scrollContainer
  21. const $containerHeight = $container.offsetHeight
  22. const $wrapper = this.$refs.scrollWrapper
  23. const $wrapperHeight = $wrapper.offsetHeight
  24. if (eventDelta > 0) {
  25. this.top = Math.min(0, this.top + eventDelta)
  26. } else {
  27. if ($containerHeight - delta < $wrapperHeight) {
  28. if (this.top < -($wrapperHeight - $containerHeight + delta)) {
  29. this.top = this.top
  30. } else {
  31. this.top = Math.max(this.top + eventDelta, $containerHeight - $wrapperHeight - delta)
  32. }
  33. } else {
  34. this.top = 0
  35. }
  36. }
  37. }
  38. }
  39. }
  40. </script>
  41. <style rel="stylesheet/scss" lang="scss" scoped>
  42. @import '../../styles/variables.scss';
  43. .scroll-container {
  44. position: relative;
  45. width: 100%;
  46. height: 100%;
  47. background-color: $menuBg;
  48. .scroll-wrapper {
  49. position: absolute;
  50. width: 100%!important;
  51. }
  52. }
  53. </style>