manual-scroll.vue 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <template>
  2. <el-scrollbar ref="scrollbarRef" height="400px" always @scroll="scroll">
  3. <div ref="innerRef">
  4. <p v-for="item in 20" :key="item" class="scrollbar-demo-item">
  5. {{ item }}
  6. </p>
  7. </div>
  8. </el-scrollbar>
  9. <el-slider
  10. v-model="value"
  11. :max="max"
  12. :format-tooltip="formatTooltip"
  13. @input="inputSlider"
  14. />
  15. </template>
  16. <script lang="ts" setup>
  17. import { onMounted, ref } from 'vue'
  18. import { ElScrollbar } from 'element-plus'
  19. const max = ref(0)
  20. const value = ref(0)
  21. const innerRef = ref<HTMLDivElement>()
  22. const scrollbarRef = ref<InstanceType<typeof ElScrollbar>>()
  23. onMounted(() => {
  24. max.value = innerRef.value!.clientHeight - 380
  25. })
  26. const inputSlider = (value: number) => {
  27. scrollbarRef.value!.setScrollTop(value)
  28. }
  29. const scroll = ({ scrollTop }) => {
  30. value.value = scrollTop
  31. }
  32. const formatTooltip = (value: number) => {
  33. return `${value} px`
  34. }
  35. </script>
  36. <style scoped>
  37. .scrollbar-demo-item {
  38. display: flex;
  39. align-items: center;
  40. justify-content: center;
  41. height: 50px;
  42. margin: 10px;
  43. text-align: center;
  44. border-radius: 4px;
  45. background: var(--el-color-primary-light-9);
  46. color: var(--el-color-primary);
  47. }
  48. .el-slider {
  49. margin-top: 20px;
  50. }
  51. </style>