You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3如何实现指定div内滚动时隐藏对应元素的功能?

解决方案
  • 首先确认滚动容器基础配置,想要触发div的scroll事件,必须给容器设置固定高度+overflow属性,示例模板写法如下:
<!-- 定义滚动容器,绑定ref -->
<div ref="scrollContainer" style="height: 600px; overflow-y: auto;">
  <!-- 需隐藏的目标元素 -->
  <div :class="{ 'is-hidden': isElementHidden }">要自动隐藏的元素</div>
  <!-- 其他长内容 -->
</div>
  • 修改事件绑定和滚动位置计算逻辑,你之前的写法有两个常见错误:this.$ref拼写错误,正确是复数形式this.$refs;容器滚动位置属性为scrollTop,而非window的pageYOffset,选项式API完整代码如下:
export default {
  data() {
    return {
      lastScrollPosition: 0,
      isElementHidden: false
    }
  },
  mounted() {
    // 获取滚动容器实例
    const scrollContainer = this.$refs.scrollContainer
    // 初始化滚动位置
    this.lastScrollPosition = scrollContainer.scrollTop
    // 给容器绑定滚动事件,passive参数可提升滚动性能
    scrollContainer.addEventListener('scroll', this.handleScroll, { passive: true })
  },
  beforeUnmount() {
    // 卸载时移除监听,避免内存泄漏
    this.$refs.scrollContainer?.removeEventListener('scroll', this.handleScroll)
  },
  methods: {
    handleScroll() {
      const currentScrollTop = this.$refs.scrollContainer.scrollTop
      // 向下滚动超过50px隐藏,向上滚动显示,阈值可自行调整
      if (currentScrollTop > this.lastScrollPosition && currentScrollTop > 50) {
        this.isElementHidden = true
      } else {
        this.isElementHidden = false
      }
      // 更新上一次滚动位置
      this.lastScrollPosition = currentScrollTop
    }
  }
}
  • 可添加过渡样式让显隐效果更顺滑:
.target-element {
  transition: all 0.3s ease;
}
.is-hidden {
  opacity: 0;
  transform: translateY(-100%);
  pointer-events: none;
}
  • 如果使用Vue3组合式API,参考写法如下:
import { ref, onMounted, onBeforeUnmount } from 'vue'

const scrollContainer = ref(null)
const lastScrollPosition = ref(0)
const isElementHidden = ref(false)

const handleScroll = () => {
  const currentScrollTop = scrollContainer.value.scrollTop
  if (currentScrollTop > lastScrollPosition.value && currentScrollTop > 50) {
    isElementHidden.value = true
  } else {
    isElementHidden.value = false
  }
  lastScrollPosition.value = currentScrollTop
}

onMounted(() => {
  scrollContainer.value.addEventListener('scroll', handleScroll, { passive: true })
})

onBeforeUnmount(() => {
  scrollContainer.value?.removeEventListener('scroll', handleScroll)
})

内容的提问来源于stack exchange,提问作者hexoyin10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:30:05