当前位置:首页 > 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实现sso

vue实现sso

Vue 实现 SSO(单点登录)方案 单点登录(SSO)允许用户通过一次登录访问多个相关系统。以下是基于 Vue 的实现方案: 使用 OAuth2/OpenID Connect 协议 OAuth2…

vue实现闪烁

vue实现闪烁

Vue实现元素闪烁效果 使用CSS动画实现 通过Vue绑定class结合CSS动画实现闪烁效果,代码简洁且性能较好。 <template> <div :class="{ 'bl…

vue实现微云

vue实现微云

Vue 实现微云功能 使用 Vue 实现类似微云的网盘功能需要结合前端框架、后端存储及文件处理技术。以下是关键实现步骤和代码示例: 前端框架搭建 使用 Vue CLI 创建项目基础结构,安装必要依赖…

node vue实现

node vue实现

Node.js 与 Vue.js 实现方案 环境搭建 安装 Node.js(建议 LTS 版本),通过 npm 或 yarn 初始化项目。Vue.js 可通过 Vue CLI 快速搭建: npm…

vue实现弹照片

vue实现弹照片

Vue 实现图片弹窗展示 方法一:使用原生 HTML 和 Vue 指令 创建基础的图片弹窗组件,通过 v-if 或 v-show 控制显示状态。点击图片时触发弹窗展示。 <template&…

vue前端怎么实现

vue前端怎么实现

Vue 前端实现方法 Vue 是一款流行的前端框架,用于构建用户界面。以下是一些常见的实现方法和步骤: 安装 Vue 通过 npm 或 yarn 安装 Vue: npm install vue 或…