lenis滑动插件的笔记

官网

lenis - npm

方法一:基础判断(推荐)

通过 Lenis 自带的 scroll 和 limit 属性直接判断:

const lenis = new Lenis()

// 滚动事件监听
lenis.on('scroll', ({ scroll, limit }) => {
  const distanceToBottom = limit - scroll
  const threshold = 100 // 距离底部100px触发
  
  if (distanceToBottom < threshold) {
    console.log('接近底部')
    // 执行加载更多等操作
  }
})

方法二:动态内容适配

当页面内容动态增加时,需要 ​​重置 Lenis 的尺寸计算​​:

// 加载新内容后调用
function loadMoreData() {
  fetch('/api/data').then(() => {
    // 1. 插入新内容到DOM
    // 2. 通知Lenis重新计算
    lenis.resize() // 关键方法
  })
}

// 在滚动监听中
lenis.on('scroll', ({ scroll, limit }) => {
  if (limit - scroll < 100) {
    loadMoreData()
  }
})

方法三:精确计算模式

针对复杂布局(如存在浮动元素、position: sticky 等):

function isBottom() {
  // 获取 Lenis 的滚动容器
  const wrapper = lenis.wrapperElement || document.documentElement
  
  // 精确计算可滚动范围
  const actualLimit = wrapper.scrollHeight - wrapper.clientHeight
  const currentScroll = lenis.scroll
  
  return currentScroll >= actualLimit - 1 // 消除计算误差
}

// 使用示例
if (isBottom()) {
  console.log('精确到达底部')
}

⚠️ 注意事项

  1. ​性能优化​
    在滚动事件中使用防抖(建议直接使用 Lenis 的 RAF 机制):
     

    function checkBottom() {
      if (lenis.isScrolling) return // 滚动中不检测
      // 检测逻辑
    }

    移动端适配​
    兼容触摸屏惯性滚动
     

    lenis.on('scroll', ({ scroll, limit, velocity }) => {
      if (velocity > 0.1 && limit - scroll < 500) {
        // 快速滑动时提前加载
      }
    })

    方向判断​
    只在下滑时检测:
     

    let lastScroll = 0
    lenis.on('scroll', ({ scroll }) => {
      const isScrollingDown = scroll > lastScroll
      lastScroll = scroll
      
      if (isScrollingDown && isBottom()) {
        // 处理底部逻辑
      }
    })

    完整示例(React 版)
     

    import { useEffect, useRef } from 'react'
    import Lenis from '@studio-freight/lenis'
    
    function App() {
      const lenisRef = useRef()
    
      useEffect(() => {
        const lenis = new Lenis()
        lenisRef.current = lenis
    
        const checkBottom = () => {
          const { scroll, limit } = lenis
          if (limit - scroll < 100) {
            console.log('触发加载')
            // 此处执行加载逻辑
          }
        }
    
        const raf = (time) => {
          lenis.raf(time)
          checkBottom()
          requestAnimationFrame(raf)
        }
        requestAnimationFrame(raf)
    
        return () => lenis.destroy()
      }, [])
    
      return (
        <div>{/* 页面内容 */}</div>
      )
    }

    回调函数中的实参limit

关键特性
 
动态计算

Lenis 的阻尼效果会使实际滚动值略微超过 limit,但最终会回弹到 limit 值:

3. 边界缓冲
  • 当页面高度变化时(例如加载更多内容),需手动调用 lenis.resize() 更新:
    // 加载新内容后
    document.body.appendChild(newContent)
    lenis.resize() // 重新计算 limit
    方向差异
  • ​垂直滚动​​: limit = scrollHeight - innerHeight
  • ​水平滚动​​: limit = scrollWidth - innerWidth(需配置 Lenis 为横向滚动)
// 启用阻尼效果后
console.log(lenis.isScrolling) // 当滚动超过 limit 时为 true

应用场景

1. 无限滚动加载
lenis.on('scroll', ({ scroll, limit }) => {
  if (limit - scroll < 100) {
    loadMoreContent()
  }
})
返回顶部按钮
const showButton = scroll > 0.3 * limit

 进度指示器
 

const progress = Math.min(scroll / limit, 1)

对比原生属性

场景原生方法Lenis 方法优势
静态页面window.scrollY + scrollHeight 计算直接使用 limit无需手动计算
动态加载内容需监听 DOM 变化并重新计算调用 resize() 即可自动处理复合滚动容器
有 transform 的容器可能计算错误结果准确正确处理 CSS transform 和复杂布局
横向滚动需单独处理 scrollWidth统一使用 limit代码逻辑一致

六、特殊案例处理

存在 position: sticky 元素
// 手动补偿 sticky 元素高度
const stickyElement = document.querySelector('.sticky')
const adjustedLimit = limit - stickyElement.offsetHeight

 

多滚动容器

如果 Lenis 被配置为控制某个子容器:

const lenis = new Lenis({
  wrapper: document.getElementById('custom-scroll-container'),
  content: document.getElementById('custom-content')
})

// 此时 limit 对应的是容器内部的滚动极限

 通过理解 limit 的含义和使用场景,可以更高效地开发与滚动相关的交互功能,同时避免手动计算滚动边界的繁琐操作。

<think>好的,我现在需要帮助用户在Vue项目中集成和使用Lenis平滑滚动库。首先,我应该回顾一下用户的问题,确保我完全理解他们的需求。用户想在Vue项目中使用Lenis库,所以他们需要安装、配置以及基本的使用方法。 首先,我应该考虑安装步骤。Lenis是一个JavaScript库,通常可以通过npm或yarn安装。用户可能已经使用Vue CLI或者Vite创建了项目,所以需要确认正确的包管理器命令。根据引用[1],项目地址是https://gitcode.com/gh_mirrors/le/lenis,所以可能需要检查该仓库的安装说明。不过通常这类库可以通过npm install lenis来安装,但不确定是否有特定的镜像源或包名。可能需要确认正确的安装命令。 接下来是配置部分。在Vue项目中,通常会在主入口文件(如main.js)或组件中初始化和使用第三方库。Lenis的文档可能会建议在mounted生命周期钩子中初始化,以确保DOM已经加载。需要创建一个Lenis实例,并设置平滑滚动的配置选项,比如duration、smooth等。同时,需要确保在组件销毁时调用destroy方法,以防止内存泄漏。 然后是如何在组件中使用的问题。可能需要创建一个滚动容器,并确保Lenis正确绑定到该元素上。用户可能需要监听滚动事件,或者调用Lenis的方法,如scrollTo,来实现特定功能。需要提供示例代码,展示如何初始化Lenis,并在需要时调用其方法。 另外,用户可能遇到的一些常见问题,比如样式问题导致滚动不生效,或者需要与Vue的响应式系统集成。可能需要提醒用户检查CSS,确保滚动容器有正确的高度和溢出设置。此外,如果在Vue Router中使用,可能需要处理路由切换时的重新初始化问题。 还需要考虑引用用户提供的其他引用内容。比如引用[3]提到用户自己开发了公共组件,而没有使用第三方组件库,所以可能需要指导用户如何将Lenis作为独立库集成到现有组件结构中,而不是作为UI组件的一部分。 最后,生成相关问题。用户可能会问到如何自定义滚动效果,如何处理移动端兼容性,或者如何与Vue的过渡效果结合使用。需要确保这些问题覆盖常见的用例,并引导用户进一步探索Lenis的高级功能。 现在,我需要将这些思考整理成一个结构化的回答,确保步骤清晰,代码示例正确,并引用提供的参考文献。同时,验证安装命令是否正确,可能需要查阅Lenis的官方文档或提供的项目地址,确认安装包名称。例如,如果项目在gitcode上,可能安装命令是npm install @studio-freight/lenis,但需要确认。假设用户提供的引用[1]中的项目地址是正确的,可能需要使用特定的安装命令,比如npm install lenis或者从git仓库安装。 如果用户提供的引用[1]中的项目地址是镜像,可能需要指导用户正确安装官方或镜像源的包。例如,使用npm install git+https://gitcode.com/gh_mirrors/le/lenis.git,或者配置npm源。但通常这类库可能已经发布在npm上,所以可能直接通过npm install lenis安装。需要确认这一点,但根据用户提供的引用,可能直接建议使用npm install lenis。 总结步骤:安装依赖,在Vue中初始化和配置,使用示例,注意事项,以及相关问题。代码示例需要包括在Vue组件中的初始化和销毁逻辑,以及可能的滚动触发方法。同时,提醒用户处理SSR兼容性,如果项目使用Nuxt.js等服务端渲染框架,可能需要调整初始化时机。</think>### 在Vue项目中集成Lenis平滑滚动库的步骤 #### 1. 安装依赖 通过npm或yarn安装Lenis库: ```bash npm install lenis # 或 yarn add lenis ``` 注意:引用[1]中的项目地址为镜像仓库,若安装失败可尝试指定仓库地址安装[^1]。 #### 2. 初始化Lenis 在Vue组件中(如`App.vue`或独立组件)的`<script>`标签中初始化: ```javascript import Lenis from 'lenis' export default { mounted() { this.lenis = new Lenis({ lerp: 0.1, // 平滑系数(0-1) smoothWheel: true // 启用鼠标滚轮平滑 }) // 启动动画循环 function raf(time) { this.lenis.raf(time) requestAnimationFrame(raf) } requestAnimationFrame(raf) }, beforeDestroy() { // 销毁实例避免内存泄漏 this.lenis.destroy() } } ``` #### 3. 配置滚动容器 在模板中添加滚动容器(需确保容器有明确高度): ```vue <template> <div class="scroll-container"> <!-- 长内容 --> </div> </template> <style> .scroll-container { height: 100vh; overflow: auto; } </style> ``` #### 4. 高级用法示例 ```javascript // 自定义滚动行为 this.lenis.scrollTo('#target', { offset: -20, // 调整最终位置 duration: 2 // 滚动时长(秒) }) // 监听滚动事件 this.lenis.on('scroll', ({ scroll, limit }) => { console.log(`当前滚动位置:${scroll}/${limit}`) }) ``` #### 5. 注意事项 - 需禁用浏览器默认滚动行为: ```css html { overflow: hidden; } ``` - 若需要支持SSR(如Nuxt),应在`client-only`标签内初始化 - 引用[3]提到自研组件的情况,可将Lenis封装为独立组件复用[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值