当前位置:首页 > VUE

vue 实现滚动联动

2026-03-29 07:04:18VUE

滚动联动的实现方法

滚动联动通常指多个滚动容器(如多个div或页面区域)在滚动时保持同步。以下是基于Vue的实现方案:

基于事件监听的同步滚动

通过监听scroll事件并动态设置其他容器的滚动位置实现联动:

<template>
  <div class="container">
    <div ref="leftPanel" class="scroll-panel" @scroll="handleLeftScroll">
      <!-- 左侧内容 -->
    </div>
    <div ref="rightPanel" class="scroll-panel" @scroll="handleRightScroll">
      <!-- 右侧内容 -->
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isScrolling: false
    }
  },
  methods: {
    handleLeftScroll() {
      if (this.isScrolling) return
      this.isScrolling = true
      const leftScrollTop = this.$refs.leftPanel.scrollTop
      this.$refs.rightPanel.scrollTop = leftScrollTop
      requestAnimationFrame(() => {
        this.isScrolling = false
      })
    },
    handleRightScroll() {
      if (this.isScrolling) return
      this.isScrolling = true
      const rightScrollTop = this.$refs.rightPanel.scrollTop
      this.$refs.leftPanel.scrollTop = rightScrollTop
      requestAnimationFrame(() => {
        this.isScrolling = false
      })
    }
  }
}
</script>

使用自定义指令封装

将滚动逻辑封装为可复用的自定义指令:

Vue.directive('scroll-sync', {
  inserted(el, binding, vnode) {
    const targetEl = document.querySelector(binding.value)
    let sourceScrolling = false
    let targetScrolling = false

    el.addEventListener('scroll', () => {
      if (targetScrolling) return
      sourceScrolling = true
      targetEl.scrollTop = el.scrollTop
      requestAnimationFrame(() => {
        sourceScrolling = false
      })
    })

    targetEl.addEventListener('scroll', () => {
      if (sourceScrolling) return
      targetScrolling = true
      el.scrollTop = targetEl.scrollTop
      requestAnimationFrame(() => {
        targetScrolling = false
      })
    })
  }
})

使用方式:

<div v-scroll-sync="'#rightPanel'"></div>
<div id="rightPanel"></div>

性能优化建议

对于大量内容或高频滚动的场景,可采用节流技术减少计算负担:

import { throttle } from 'lodash'

methods: {
  handleScroll: throttle(function(scrollTop) {
    this.$refs.otherPanel.scrollTop = scrollTop
  }, 16) // 60fps的节流间隔
}

跨组件通信方案

当需要联动的组件位于不同层级时,可通过Vuex或事件总线实现:

vue 实现滚动联动

// 使用事件总线
const bus = new Vue()

// 组件A
this.$refs.scrollContainer.addEventListener('scroll', () => {
  bus.$emit('scroll', this.$refs.scrollContainer.scrollTop)
})

// 组件B
bus.$on('scroll', (scrollTop) => {
  this.$refs.scrollContainer.scrollTop = scrollTop
})

注意事项

  • 避免直接操作DOM时产生无限循环,需设置滚动标志位
  • 移动端需考虑touch事件的兼容性
  • 对于复杂布局,需计算不同容器的高度比例进行动态调整
  • 使用requestAnimationFrame确保滚动平滑性

标签: vue
分享给朋友:

相关文章

vue实现共享屏幕

vue实现共享屏幕

共享屏幕的基本实现 在Vue中实现共享屏幕功能通常需要结合浏览器的getDisplayMedia API。以下是一个基础实现示例: <template> <div>…

vue 实现复选

vue 实现复选

Vue 实现复选功能 在 Vue 中实现复选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动收集用户选择的复选框值。…

vue滚动实现

vue滚动实现

Vue 滚动实现方法 使用原生滚动 在 Vue 中可以通过 ref 获取 DOM 元素,调用原生滚动方法实现滚动效果。适用于简单场景。 <template> <div ref=…

vue实现心电图

vue实现心电图

Vue 实现心电图效果 在 Vue 中实现心电图效果通常需要结合 Canvas 或 SVG 进行动态绘图,模拟心电图数据的实时变化。以下是两种实现方式的核心思路和代码示例: 使用 Canvas 绘制…

vue 实现滑动

vue 实现滑动

Vue 实现滑动效果的方法 在Vue中实现滑动效果可以通过多种方式,以下是几种常见的方法: 使用CSS过渡和动画 通过Vue的<transition>组件结合CSS过渡或动画实现滑动效果…

vue ui实现创建vue项目

vue ui实现创建vue项目

使用 Vue UI 创建 Vue 项目 Vue UI 是 Vue CLI 提供的图形化界面工具,可以通过可视化操作创建和管理 Vue 项目。 安装 Vue CLI 确保已安装 Node.js(建议版…