news 2026/9/19 23:08:52

Lenis 平滑滚动使用指南:3 步接好,让滚动和动画同频

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Lenis 平滑滚动使用指南:3 步接好,让滚动和动画同频

Lenis 平滑滚动使用指南:3 步接好,让滚动和动画同频

【免费下载链接】lenisSmooth scroll as it should be项目地址: https://gitcode.com/GitHub_Trending/le/lenis

Lenis 是一个零依赖的小体积平滑滚动库:接管浏览器原生滚动,让整页滚动变顺滑。如果你的站点要做视差、分节吸附或滚动驱动动画,它很合适。下面讲安装、调手感和常见坑。

先认识一下:几 KB,骑在原生滚动上

Lenis(拉丁语里"平滑"的意思)的做法很直接:它不伪造一层假滚动,而是监听 wheel 和 touch 事件,把浏览器真实的滚动位置朝目标"缓动"过去。因为滚动始终是浏览器在做,position: sticky、锚点链接、屏幕阅读器这些原生能力照常工作,这也是它和很多"替换滚动"方案最大的区别。

项目说明
定位轻量平滑滚动库,基于原生滚动,不破坏可访问性
核心能力滚轮与触摸平滑、scrollTo编程滚动、官方 snap 吸附插件、React / Vue 适配器
适用场景营销官网、WebGL 滚动场景、GSAP 视差、分节式站点

快速上手:3 步跑通

安装一行命令:npm i lenis

然后初始化并驱动动画循环,最短路径如下:

import Lenis from 'lenis' // 让 Lenis 自己跑 requestAnimationFrame 循环 const lenis = new Lenis({ autoRaf: true }) // 订阅滚动事件:e 上带着 scroll、velocity、progress lenis.on('scroll', (e) => { console.log(e.scroll, e.progress) })

第三步是 CSS:引入lenis/dist/lenis.css(源码在 packages/core/lenis.css)。它负责设置 html 高度、暂停滚动时锁住溢出,漏掉会出现页面高度异常。到这一步,页面已经能平滑滚动了。

实战场景:最常碰到的 3 个

让滚动驱动 GSAP 视差

场景是官网里随滚动移动的图片。关键点:把 Lenis 挂到 GSAP 的 ticker 上,两边共用同一个时钟,否则滚动位置和动画会各走各的。

const lenis = new Lenis() // Lenis 每变一次位置,就通知 ScrollTrigger 重算 lenis.on('scroll', ScrollTrigger.update) // 挂到 GSAP ticker;time 单位是秒,转成毫秒 gsap.ticker.add((time) => { lenis.raf(time * 1000) }) gsap.ticker.lagSmoothing(0) // 关掉滞后平滑,避免双重缓动

就这几行,不要再自己写一套 raf 循环,两个时钟必然打架。

给分节页面加吸附

希望滚动停下来时"咔哒"对齐到某一节,用官方插件 lenis/snap,它和平滑滚动协作而不是对抗:new Snap(lenis, { type: 'proximity' }),再对每个区块snap.addElement(section)。三种模式:proximity(靠近才吸)、mandatory(必落点)、lock(一次一步)。

页内锚点与编程滚动

有目录导航或"回到顶部"按钮时,不用自己算偏移。初始化传anchors: true,Lenis 会接管锚点点击并平滑到位;代码里直接lenis.scrollTo('#pricing', { offset: -80 })。目标可以是数字、选择器或元素。

参数速查:最常调的就是这几个

参数什么时候调
lerp(默认 0.1)手感太生硬就调大,太飘就调小;控制每帧向目标靠近的比例
duration/easing想精确控制滚轮和 scrollTo 的动画曲线;给其中一个就切换为按时间动画
syncTouch移动端也想平滑时开启;注意 iOS 16 以下可能不稳
wheelMultiplier/touchMultiplier滚轮、触摸速度与你的内容节奏不匹配时,默认都是 1
anchors页内有锚点链接需要保持可用时开启
allowNestedScroll页面存在内部滚动区(弹窗、轮播)时开启;追求性能建议改用元素的data-lenis-prevent属性

集成与避坑:框架接入和三个坑

React用官方适配器:<ReactLenis root>包住页面,实例的创建和销毁由 provider 接管,任何组件里用useLenis拿到最新滚动状态:

import { ReactLenis, useLenis } from 'lenis/react' function App() { useLenis((lenis) => { // 随滚动把页头淡出,progress 是 0~1 的进度 headerRef.current.style.opacity = 1 - lenis.progress }) return ( <ReactLenis root> <Header /> <Main /> </ReactLenis> ) }

Vue / Nuxt同理:<vue-lenis root :options="{ autoRaf: true }">useLenis();Nuxt 项目可直接装官方模块,见 packages/vue/nuxt。适配器都在客户端初始化实例,SSR 渲染阶段不会碰window,无需额外处理。

三个高频坑:

  • 滚轮完全没反应。原因:忘了驱动动画循环。解法:传autoRaf: true,或自己在每帧调lenis.raf(time)
  • 页面顶部高度异常、暂停滚动时出现错位。原因:没引入推荐 CSS。解法:import 'lenis/dist/lenis.css'
  • 滚动中锚点链接失效。原因:Lenis 默认拦截锚点默认跳转,避免和平滑滚动冲突。解法:传anchors: true;只想豁免个别元素就给它加data-lenis-prevent属性。

收尾

记住一句话就够:Lenis 是"原生滚动 + 缓动",不是假滚动,多数坑都源于忘了这一点。完整参数和方法表看 官方 README,更多玩法参考 playground/ 里的示例。

【免费下载链接】lenisSmooth scroll as it should be项目地址: https://gitcode.com/GitHub_Trending/le/lenis

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 23:06:25

3 步解密并导出微信聊天记录:PyWxDump 快速上手指南

3 步解密并导出微信聊天记录&#xff1a;PyWxDump 快速上手指南 【免费下载链接】PyWxDump 删库 项目地址: https://gitcode.com/GitHub_Trending/py/PyWxDump 还在为换电脑就丢了微信聊天记录、客服对话没处长期存档而头疼&#xff1f;微信的数据库天生就是加密的&…

作者头像 李华
网站建设 2026/9/19 23:02:05

Claude破解30年难题与果蝇全脑上传:AI科研协作者时代来临

1. 从一条日报说起&#xff1a;为什么"Claude破解30年难题"和"果蝇全脑上传"值得单独拎出来聊3月10日这条AI日报里塞了两件事&#xff0c;一件是Claude在某个悬置了三十年的科学问题上给出了突破性结果&#xff0c;另一件是果蝇全脑被完整上传。乍一看像是…

作者头像 李华
网站建设 2026/9/19 23:00:34

告别命令行混乱:BrewUI让Homebrew依赖管理一目了然

1. 为什么我最终放弃纯命令行&#xff0c;开始用 BrewUI 管 Homebrew事情得从一次把开发环境搞崩的经历说起。当时我正在同时维护三个项目&#xff0c;一个基于 PHP 8.1&#xff0c;一个基于 Node 18&#xff0c;还有一个跑着老版本的 Python 3.9。Homebrew 作为 macOS 上最核心…

作者头像 李华
网站建设 2026/9/19 22:57:47

PhysX 5源码尽调:从架构演进到Omniverse集成的物理引擎深度解析

1. 项目概述与源码尽调目标1.1 为什么在这个时间点做PhysX源码尽调先说点背景。PhysX从2008年被NVIDIA收购算起&#xff0c;在物理引擎这个圈子里已经跑了十五年以上。游戏开发者对它不陌生&#xff0c;Unity、Unreal都在用&#xff0c;但大部分人是把它当黑盒用——调几个参数…

作者头像 李华