当前位置: 首页 > news >正文

lenis滑动插件的笔记

官网

lenis - npm

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

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

const lenis = new Lenis()// 滚动事件监听
lenis.on('scroll', ({ scroll, limit }) => {const distanceToBottom = limit - scrollconst 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.clientHeightconst currentScroll = lenis.scrollreturn 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 > lastScrolllastScroll = scrollif (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 = lenisconst checkBottom = () => {const { scroll, limit } = lenisif (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 的含义和使用场景,可以更高效地开发与滚动相关的交互功能,同时避免手动计算滚动边界的繁琐操作。

http://www.xdnf.cn/news/402265.html

相关文章:

  • 【sqlmap需要掌握的参数】
  • Oracle 19c 静默安装
  • LeetCode[101]对称二叉树
  • 05_jdk8新特性
  • SpringAI框架中的RAG模块详解及应用示例
  • WebRTC:去中心化网络P2P框架解析
  • continue通过我们的开源 IDE 扩展和模型、规则、提示、文档和其他构建块中心,创建、共享和使用自定义 AI 代码助手
  • 白帽SEO与黑帽SEO差异
  • 24.(vue3.x+vite)引入组件并动态挂载(mount)
  • 蓝桥杯13届 卡牌
  • Docker私有仓库实战:官方registry镜像实战应用
  • ZYNQ笔记(二十一): VDMA HDMI 彩条显示
  • 当生产了~/qt-arm/bin/qmake,可以单独编译其他-源码的某个模块,如下,编译/qtmultimedia
  • openwrt目录结构(部分)
  • 【开源工具】深度解析:基于PyQt6的Windows时间校时同步工具开发全攻略
  • ZYNQ处理器在发热后功耗增加的原因分析及解决方案
  • Vue3 Echarts 3D饼图(3D环形图)实现讲解附带源码
  • springCloud/Alibaba常用中间件之Setinel实现熔断降级
  • Python动态渲染页面抓取之Selenium使用指南
  • springboot-web基础
  • 单片机学习Day08--相邻流水灯
  • 主流编程语言中ORM工具全解析
  • 对基于再生龙制作的Linux系统的硬盘进行扩容
  • 10. Spring AI PromptTemplate:从模板到高级技巧
  • Go 语言 slice(切片) 的使用
  • 智能停车场如何实现无缝通信?Canopen转 Profibus网关来解答
  • [高阶数据结构]二叉树经典面试题
  • 【秣厉科技】LabVIEW工具包——OpenCV 教程(21):CUDA 加速方案
  • 【生产实践】Linux中/usr/bin、/usr/sbin与/usr/local的关系解析(2025年技术规范)
  • 养生:拥抱健康生活的全方位指南