当前位置:首页 > VUE

vue实现滑动吸附

2026-01-16 23:09:18VUE

Vue 实现滑动吸附效果

滑动吸附效果常见于移动端或需要分步展示内容的场景,以下是几种实现方式:

基于 CSS Scroll Snap

现代浏览器支持的原生 CSS 方案,无需 JavaScript:

<template>
  <div class="snap-container">
    <div class="snap-item">Section 1</div>
    <div class="snap-item">Section 2</div>
    <div class="snap-item">Section 3</div>
  </div>
</template>

<style>
.snap-container {
  scroll-snap-type: y mandatory;
  overflow-y: scroll;
  height: 100vh;
}
.snap-item {
  scroll-snap-align: start;
  height: 100vh;
}
</style>

基于 IntersectionObserver API

动态检测元素位置实现精准控制:

export default {
  mounted() {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          // 当前激活项处理逻辑
          console.log(entry.target.id + ' is active');
        }
      });
    }, {
      threshold: 0.5,
      rootMargin: '0px'
    });

    document.querySelectorAll('.snap-item').forEach(el => {
      observer.observe(el);
    });
  }
}

结合第三方库(如 vue-use)

使用现成的 Vue 组合式 API:

import { useScroll } from '@vueuse/core'

export default {
  setup() {
    const { arrivedState, directions } = useScroll(document)

    watch(arrivedState, (val) => {
      if (val.bottom) {
        // 到达底部时执行吸附
        document.scrollTo({
          top: document.body.scrollHeight,
          behavior: 'smooth'
        })
      }
    })
  }
}

自定义滚动逻辑

手动实现滚动位置判断:

vue实现滑动吸附

methods: {
  handleScroll() {
    const container = this.$el;
    const children = container.children;
    const scrollTop = container.scrollTop;
    const containerHeight = container.clientHeight;

    Array.from(children).forEach((child, index) => {
      const childTop = child.offsetTop;
      const childHeight = child.clientHeight;

      if (scrollTop >= childTop - containerHeight/2 && 
          scrollTop < childTop + childHeight - containerHeight/2) {
        // 当前激活项处理
        this.activeIndex = index;
      }
    });
  }
}

注意事项

  • 移动端需添加 -webkit-overflow-scrolling: touch 增强滚动体验
  • 考虑添加防抖处理避免频繁触发滚动事件
  • 对于复杂场景可结合 CSS transform 实现平滑过渡
  • 浏览器兼容性需测试,特别是 Safari 对 scroll-snap 的支持情况

以上方案可根据具体需求选择,CSS 原生方案性能最佳,JavaScript 方案控制更灵活。

标签: vue
分享给朋友:

相关文章

vue懒加载实现难吗

vue懒加载实现难吗

vue懒加载的实现难度 Vue懒加载的实现并不复杂,核心逻辑是通过动态导入(Dynamic Imports)和路由配置或组件异步加载完成。以下是具体实现方法: 路由懒加载实现 在Vue Router…

vue筛选实现

vue筛选实现

Vue 筛选实现方法 使用计算属性实现筛选 计算属性是 Vue 中实现数据筛选的常用方式。通过定义一个计算属性,可以根据输入的条件动态过滤数据。 <template> <div…

vue实现curd

vue实现curd

Vue实现CRUD操作 初始化Vue项目 使用Vue CLI创建新项目,安装必要依赖如axios用于HTTP请求 vue create crud-demo cd crud-demo npm inst…

vue实现computed

vue实现computed

Vue 中 computed 的实现原理 computed 属性是 Vue 的一个核心特性,它基于响应式依赖进行缓存,仅在依赖发生变化时重新计算。以下是 computed 的实现方式: 基本用法 在…

vue实现动态禁用

vue实现动态禁用

动态禁用表单元素或按钮 在Vue中实现动态禁用功能通常通过v-bind:disabled(或简写为:disabled)绑定一个响应式变量实现。当变量值为true时,元素被禁用;为false时启用。…

vue实现切换隐藏

vue实现切换隐藏

使用 v-show 指令实现切换隐藏 在 Vue 中,v-show 是最简单的切换元素显示/隐藏的方法。它通过 CSS 的 display 属性控制元素可见性。 <template>…