实现JavaScript驱动的平滑粘性滚动效果

实现JavaScript驱动的平滑粘性滚动效果

本教程将深入探讨如何利用javascriptcss创建类似weltio网站的平滑粘性滚动动画。我们将通过禁用原生滚动、监听用户输入、利用`requestanimationframe`进行动画插值以及应用css `transform`属性,构建一个高度可控且流畅的自定义滚动系统。文章将详细介绍如何处理滚动边界、实现弹性回弹效果,并为实现复杂交互如全屏粘性水平滑块提供核心技术基础。

引言:超越原生滚动的限制

在现代网页设计中,平滑且具有交互性的滚动体验已成为提升用户体验的关键。许多开发者尝试使用纯CSS解决方案,如scroll-snap-type或position: sticky来创建粘性或分段滚动效果。然而,这些原生CSS属性虽然方便,但在实现如Weltio网站那种高度定制化、流畅且带有物理感的“粘性平滑滚动”动画时,往往力不从心。原生滚动行为的平滑度受浏览器限制,且难以进行精细的动画控制。

要实现这种高级的滚动效果,我们需要绕过浏览器的原生滚动机制,转而使用JavaScript来完全控制页面的滚动行为。核心思想是禁用原生滚动,然后通过监听用户的滚动输入,利用JavaScript计算并平滑地过渡到目标滚动位置,并通过CSS transform: translate3d()(或translateY())来移动页面内容,从而实现GPU加速的流畅动画。

核心机制:自定义滚动系统的构建

构建自定义平滑滚动系统需要以下几个关键步骤:

1. 禁用原生滚动

首先,我们需要阻止浏览器自身的滚动行为,以确保JavaScript可以完全接管滚动控制。这通常通过在body元素上设置overflow: hidden来实现。

立即学习“Java免费学习笔记(深入)”;

html, body {  margin: 0;  padding: 0;}body {  overflow: hidden; /* 禁用原生滚动 */  min-height: 100vh; /* 确保内容有足够的空间 */}/* 示例内容元素样式 */.element {  height: 300px;  background-color: #112233;  margin: 20px;  border-radius: 20px;}

2. 捕获用户输入

接下来,我们需要监听用户的滚动输入。对于桌面设备,这主要是通过window对象的wheel事件来实现。event.deltaY属性提供了滚轮滚动的垂直距离。

let desiredScroll = 0; // 目标滚动位置let actualScroll = 0;  // 当前实际滚动位置// 监听滚轮事件,更新目标滚动位置window.addEventListener("wheel", event => {  desiredScroll += event.deltaY;});

注意:对于触摸设备,需要额外处理touchstart、touchmove和touchend事件来模拟滚动输入。

3. 平滑动画循环

为了实现平滑过渡,我们不能直接将actualScroll设置为desiredScroll。相反,我们需要一个动画循环,让actualScroll逐步趋近desiredScroll。requestAnimationFrame是实现浏览器优化动画的最佳选择。

function updateScroll() {  const delay = 10; // 控制平滑度的延迟因子,值越大越平滑  // 插值计算,使actualScroll平滑地趋近desiredScroll  actualScroll = actualScroll + (desiredScroll - actualScroll) / delay;  updateTransform(); // 更新页面元素的transform  window.requestAnimationFrame(updateScroll); // 循环调用}// 应用transform来移动所有需要滚动的元素function updateTransform() {  // 可以选择移动所有元素,或者只移动所有内容的父容器  // 这里以移动所有具有'element'类的元素为例  const elements = [...document.getElementsByClassName('element')];  elements.forEach(element => element.style.transform = `translateY(${-actualScroll}px)`);  // 如果所有内容都在一个父div中,可以直接移动该父div  // document.getElementById('content-wrapper').style.transform = `translateY(${-actualScroll}px)`;}// 启动动画循环window.requestAnimationFrame(updateScroll);

代码示例 1:基础平滑滚动实现

以下是一个结合HTML、CSS和JavaScript的基础平滑滚动实现:

基础平滑滚动  html, body {    margin: 0;    padding: 0;    font-family: sans-serif;    color: #fff;  }  html {    background-color: #334499;  }  body {    overflow: hidden; /* 禁用原生滚动 */    min-height: 100vh; /* 确保内容有足够的空间 */    /* 注意:实际内容高度会影响滚动范围,这里只是示例 */  }  .element {    height: 300px;    background-color: #112233;    margin: 20px;    border-radius: 20px;    display: flex;    justify-content: center;    align-items: center;    font-size: 2em;  }  
内容块 1
内容块 2
内容块 3
内容块 4
内容块 5
内容块 6
let desiredScroll = 0; let actualScroll = 0; function updateScroll() { const delay = 10; // 平滑度因子 actualScroll = actualScroll + (desiredScroll - actualScroll) / delay; updateTransform(); window.requestAnimationFrame(updateScroll); } const elements = [...document.getElementsByClassName('element')]; function updateTransform() { // 移动所有内容块的父容器,这里我们假定body是所有内容的直接父容器 // 实际上,最好将所有内容包裹在一个div中,然后移动那个div document.body.style.transform = `translateY(${-actualScroll}px)`; } window.addEventListener("wheel", event => { desiredScroll += event.deltaY; }); window.requestAnimationFrame(updateScroll);

高级优化:滚动边界与弹性回弹

上述基础系统已经实现了平滑滚动,但还需要进一步完善,例如限制滚动范围以及添加“橡皮筋”般的弹性回弹效果。

1. 设置滚动边界

滚动不应无限进行。我们需要计算页面的最大可滚动高度,并限制desiredScroll在这个范围内。

maxScrollHeight = document.body.clientHeight – window.innerHeight;

document.body.clientHeight:所有内容的总高度。window.innerHeight:视口的高度。两者的差值即为内容可滚动的最大距离。

2. 实现弹性回弹效果

类似于iPhone的滚动效果,当用户尝试滚动超出内容边界时,滚动速度会减慢,并在用户停止滚动后自动回弹。

当desiredScroll小于0(向上超出顶部)或大于maxScrollHeight(向下超出底部)时,减缓desiredScroll的增加/减少速度。当actualScroll非常接近desiredScroll时,直接将其设置为desiredScroll,防止微小的抖动。

代码示例 2:带边界和弹性回弹的平滑滚动

平滑滚动与弹性回弹  html, body {    margin: 0;    padding: 0;    font-family: sans-serif;    color: #fff;  }  html {    background-color: #334499;  }  body {    overflow: hidden; /* 禁用原生滚动 */    min-height: 100vh;    padding: 20px 0; /* 为内容添加一些垂直内边距 */  }  .element {    height: 300px;    background-color: #112233;    margin: 20px;    border-radius: 20px;    display: flex;    justify-content: center;    align-items: center;    font-size: 2em;  }  
内容块 1
内容块 2
内容块 3
内容块 4
内容块 5
内容块 6
内容块 7
内容块 8
内容块 9
内容块 10
let desiredScroll = 0; let actualScroll = 0; function updateScroll() { const delay = 10; // 平滑度因子 const maxScrollHeight = document.body.clientHeight - window.innerHeight; // 最大可滚动高度 // 处理超出边界时的desiredScroll(弹性回弹效果) if (desiredScroll < 0) { desiredScroll -= desiredScroll / (delay / 2

以上就是实现JavaScript驱动的平滑粘性滚动效果的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1596137.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
响应式两列表单布局:解决动态内容溢出问题
上一篇 2025年12月23日 10:54:57
HTML邮件签名兼容性指南:解决图片缩放与文本错位问题
下一篇 2025年12月23日 10:55:11

相关推荐

  • 夸克app如何设置听书人 夸克看小说设置听书模式教程

    夸克app如何设置听书人 夸克看小说设置听书模式教程夸克app如何设置听书人 夸克看小说设置听书模式教程夸克app如何设置听书人 夸克看小说设置听书模式教程夸克app如何设置听书人 夸克看小说设置听书模式教程

    打开夸克浏览器,找到并点击“小说”图标。 进入小说页面后,点击“免费”选项。 挑选喜欢的小说,点击“免费阅读”。 开始阅读小说时,点击“耳机”图标即可开启听书功能。 以上就是夸克app如何设置听书人 夸克看小说设置听书模式教程的详细内容,更多请关注创想鸟其它相关文章!

    2026年8月31日 用户投稿
    100
  • 机构:BOE已建立每年1亿片苹果iPhone OLED生产能力

    cnmo从韩媒获悉,中国显示面板厂商京东方(boe)已经构建起每年可供应1亿片用于苹果iphone的oled屏幕生产能力。根据市场研究机构ubi research于6月27日发布的报告,boe通过专门的b11生产线达成了这一成就。该报告指出:“若b11产线以90%的运行率和85%的良品率专门生产ip…

    2026年8月31日
    100
  • win10系统如何使用cmd命令强制删除文件

    win10系统如何使用cmd命令强制删除文件win10系统如何使用cmd命令强制删除文件win10系统如何使用cmd命令强制删除文件win10系统如何使用cmd命令强制删除文件

    在使用windows 10的过程中,我们常常需要清理一些不再需要的文件以保持系统的整洁。然而,有时会遇到一些顽固的文件,这些文件用常规方法根本无法删除。这时,我们可以通过cmd命令行工具来实现强制删除操作。那么,如何在windows 10中利用cmd命令实现文件的强制删除呢?以下是具体的操作步骤: …

    2026年8月31日 用户投稿
    100
  • 京东双11国补APP上怎么找_京东双11国补APP查找入口教程

    首先通过搜索“家电900”或“数码900”口令进入京东国补会场,享受商品立减优惠;其次利用历史记录一键直达活动页面;最后输入“红包900”领取最高1888元全品类叠加红包,每日可领一次,与国补优惠叠加使用。 如果您想在京东APP上参与双11国补活动,但找不到领取入口,可能是由于搜索口令变更或未保存历…

    2026年8月31日
    000
  • Linux规划、安装、远程管理

    在进行linux系统的硬盘规划时,必须根据服务项目来决定分区的大小和分配。 例如,如果系统是邮件主机,通常需要为/var分配几个GB的空间,以确保邮件存储空间充足。另一方面,如果是多用户多终端主机,/home分区通常需要更大的空间。这些规划都与预期的主机服务类型密切相关。 我的VMware中的Cen…

    2026年8月31日
    000
  • 网页底部光标样式失效了?如何排查及解决?

    网页底部光标样式失效了?如何排查及解决?网页底部光标样式失效了?如何排查及解决?网页底部光标样式失效了?如何排查及解决?网页底部光标样式失效了?如何排查及解决?

    网页底部鼠标指针样式异常:诊断与修复 在网页设计中,自定义鼠标指针样式能显著提升用户体验。然而,有时会出现底部区域鼠标指针样式失效的情况,即使该区域没有被其他元素遮挡。本文将分析此问题,并提供有效的解决方法。 问题表现为:开发者已正确设置cursor样式,但网页底部区域仍显示默认指针,且排查后确认无…

    2026年8月31日 用户投稿
    000
  • qq浏览器如何把多个文件压缩成一个文件 具体操作方法介绍

    qq浏览器如何把多个文件压缩成一个文件 具体操作方法介绍qq浏览器如何把多个文件压缩成一个文件 具体操作方法介绍qq浏览器如何把多个文件压缩成一个文件 具体操作方法介绍qq浏览器如何把多个文件压缩成一个文件 具体操作方法介绍

    点击文件选项 启动手机上的QQ浏览器,进入应用主界面后选择底部菜单里的文件功能。 选择查看更多选项 在文件浏览界面中找到并点击查看更多按钮。 进入文件夹列表 在查看更多内容的页面中,点击文件夹选项以进入文件夹列表。 选中目标文件 长按需要压缩的文件,在出现的操作界面中勾选这些文件,随后点击右下角的更…

    2026年8月31日 用户投稿
    100
  • 开发中如何选择合适的Emoji表情库?

    寻找合适的emoji表情库? 在开发过程中,我们常常需要用到Emoji表情来增强用户体验,提升应用的趣味性。那么,有哪些好用的Emoji表情库可以选择呢?本文将介绍几个常用的库,帮助你找到合适的工具。 Emoji Mart:这是一个功能强大的Emoji表情库,它提供了丰富的表情符号,并且支持多种编程…

    用户投稿 2026年8月31日
    100
  • iPhone14pro灵动岛功能介绍

    灵动岛坐落于屏幕顶端中央,每当有新通知、正在进行的活动或用户交互时,它都会以一种极具创意且生动的方式进行展示。例如,当你收到音乐播放提醒时,灵动岛会呈现出当前播放歌曲的专辑封面、演唱者名称以及播放进度条等核心信息,你可直接在灵动岛区域完成播放、暂停或切歌等操作,无需跳转至音乐应用,极大提升了使用效率…

    2026年8月31日
    100
  • 铁路12306怎么给残疾人买票_铁路12306残疾人票购买流程

    必须使用残疾人本人账号在12306 App或车站窗口购票,系统自动识别资格并分配无障碍席位。线上购票需绑定证件、勾选“残疾人专用票”和“需要轮椅席位”,确认票面带“专”字;人工窗口购票须携带身份证和残疾证原件,现场申请专用票额及无障碍服务;首次购票前需完成优惠资质核验,通过自助机或人工窗口绑定证件信…

    2026年8月31日
    000
  • 千万不要装LTSC版Win10 LTSC版Win10优缺点分析

    windows 10 ltsc 是企业版的一种,称为 windows 10 企业版长期支持版,它不会强制性地进行更新。相信不少朋友已经有所耳闻,这款系统的优点不少,比如它没有任何预装的 uwp 应用,甚至连应用商店也没有。与普通版本每半年一次的大更新(如 1903 版、1909 版、2004 版)不…

    2026年8月31日
    300
  • 还在 SSH + Vim?VS Code 都支持远程开发了

    还在 SSH + Vim?VS Code 都支持远程开发了还在 SSH + Vim?VS Code 都支持远程开发了还在 SSH + Vim?VS Code 都支持远程开发了还在 SSH + Vim?VS Code 都支持远程开发了

    一.趋势 随着容器化和深度学习等技术在生产中的应用,越来越多的场景需要“远程”开发。例如: 服务器虚拟机容器等远程环境往往难以或无法在本地完全重建,比如: 特定配置:例如曾经遇到的 .Net Framework 4.0 + MSSQL 2000 ,以及安装了特定版本补丁的历史项目,几乎无法重现其环境…

    2026年8月31日 用户投稿
    100
  • 360浏览器如何截图 具体操作步骤

    360浏览器如何截图 具体操作步骤360浏览器如何截图 具体操作步骤360浏览器如何截图 具体操作步骤360浏览器如何截图 具体操作步骤

    启动360浏览器,进入首页后,在右上角可以看到一个由四个小方块组成的图标,点击该图标展开菜单 在弹出的扩展面板中,选择“管理”选项 进入扩展管理页面后,我们需要查找截图类工具并添加至浏览器扩展。点击页面右上角的“添加更多扩展”按钮 在扩展应用市场界面,右侧设有搜索框,在此输入“截图”关键词进行查找,…

    2026年8月31日 用户投稿
    100
  • Copilot怎么集成到Edge浏览器_Edge侧边栏Copilot使用攻略

    答案是Copilot集成在Edge浏览器侧边栏中,用户只需更新浏览器并开启侧边栏功能即可使用。通过设置启用Copilot后,可实现网页内容总结、智能提问、内容创作辅助和图像生成等功能,提升浏览效率。尽管可能遇到响应异常、内容准确性或隐私顾虑等问题,但多数可通过刷新、验证信息或关闭功能解决。结合提示词…

    2026年8月31日
    000
  • VSCode的Vue怎么打开_VSCode运行和调试Vue项目的环境配置教程

    首先确保Node.js、Vue CLI和VSCode插件(如Volar、ESLint、Prettier)已安装,接着通过终端运行npm run serve启动项目,然后配置launch.json文件并安装Debugger for Chrome扩展,最后启动调试会话即可在VSCode中调试Vue应用。…

    2026年8月31日
    000
  • 苹果14设置教程

    近日,苹果官方推出了全新的苹果14设置教程,php小编苹果在第一时间为大家整理了详细的内容,帮助大家快速了解设备的新功能和操作技巧。该教程涵盖了设备的基本介绍、系统设置、应用使用、数据备份等方面的内容,适合广大苹果14用户学习使用。无论是初次使用苹果设备还是老用户,都可以通过这份教程轻松掌握苹果14…

    2026年8月31日
    000
  • 多多视频号怎么开通直播?直播注意事项有哪些?

    想要在多多视频上通过直播带货提升销量,却不清楚如何开启直播功能?其实流程并不复杂,只要符合平台要求,并按步骤操作,就能顺利开播。 一、如何开通多多视频号直播? 需要注意的是,多多视频的直播功能主要面向拼多多商家开放,属于店铺营销的一部分。因此,开通直播的前提是拥有一个合规运营的拼多多店铺。具体操作如…

    2026年8月31日
    000
  • Win7鼠标左右键互换怎么还原?

    Win7鼠标左右键互换怎么还原?Win7鼠标左右键互换怎么还原?Win7鼠标左右键互换怎么还原?Win7鼠标左右键互换怎么还原?

    有网友提问说,在win7系统下如何解决鼠标左右键互换的问题呢?所谓鼠标左右键互换,就是原本的左键变成了右键,而右键变成了左键,这种操作方式会让用户的使用变得非常不适应。那么,该如何恢复到原来的设置呢?接下来,就由小编为大家详细介绍具体的操作步骤。 具体操作步骤如下: 在win7系统中,设置鼠标的选项…

    2026年8月31日 用户投稿
    200
  • 俄罗斯搜索引擎入口网址https 俄罗斯yandex首页入口https

    如果您正在寻找俄罗斯最主流的搜索引擎入口,那么Yandex无疑是首选。本文将直接为您提供Yandex的官方首页网址,并详细介绍如何访问及进行基本操作,帮助您轻松开始使用这个强大的俄语区搜索引擎。 Yandex 官方入口网址 1、立即进入“俄罗斯搜索引擎入口网址https☜☜☜☜☜点击进入”; 2、立…

    2026年8月31日
    000
  • yandex入口入口地址https yandex浏览器登录入口免登录

    这篇文章将为您介绍被誉为“俄罗斯谷歌”的强大搜索引擎Yandex的直接访问入口。无论您是想体验不同于主流的搜索服务,还是寻找特定资源,本指南都将教您如何快速、免登录地进入和使用Yandex,发掘其独特价值。 1、立即进入“yandex入口入口地址https☜☜☜☜☜点击进入”; 2、立即进入“yan…

    2026年8月31日
    000

发表回复

登录后才能评论
关注微信