讲师中心 微信公众号
AI工具推荐 视频效率加速

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

夜涛同学_9059

夜涛同学_9059

发布时间:2025-11-17 12:39:45

|

801人浏览过

|

来源于php中文网

原创

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

本教程将深入探讨如何利用javascript和css创建类似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是实现浏览器优化动画的最佳选择。

html-ppt-to-pdf
html-ppt-to-pdf

将使用 `

` 约定的 HTML 幻灯片转换为高保真、矢量文本 PDF(使用 Playwright + Chromium 原生 PDF 功能)。

下载
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的基础平滑滚动实现:

<!DOCTYPE html>
<html>
<head>
<title>基础平滑滚动</title>
<style>
  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;
  }
</style>
</head>
<body>
  <div class="element">内容块 1</div>
  <div class="element">内容块 2</div>
  <div class="element">内容块 3</div>
  <div class="element">内容块 4</div>
  <div class="element">内容块 5</div>
  <div class="element">内容块 6</div>

  <script>
    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);
  </script>
</body>
</html>

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

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

1. 设置滚动边界

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

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

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

2. 实现弹性回弹效果

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

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

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

<!DOCTYPE html>
<html>
<head>
<title>平滑滚动与弹性回弹</title>
<style>
  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;
  }
</style>
</head>
<body>
  <div class="element">内容块 1</div>
  <div class="element">内容块 2</div>
  <div class="element">内容块 3</div>
  <div class="element">内容块 4</div>
  <div class="element">内容块 5</div>
  <div class="element">内容块 6</div>
  <div class="element">内容块 7</div>
  <div class="element">内容块 8</div>
  <div class="element">内容块 9</div>
  <div class="element">内容块 10</div>

  <script>
    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

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
CSS position定位有几种方式
CSS position定位有几种方式

有4种,分别是静态定位、相对定位、绝对定位和固定定位。更多关于CSS position定位有几种方式的内容,可以访问下面的文章。

332

2023.11.23

overflow什么意思
overflow什么意思

overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3120

2024.08.15

iPhone文本消息乱序错误如何解决?
iPhone文本消息乱序错误如何解决?

解决办法:1、强制关闭消息应用程序;2、重启你的iPhone;3、自动禁用设置并再次启用;4、关闭iMessage并重新打开;5、重置所有设置;6、使用ReiBoot修复iOS。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2418

2024.11.19

删除iPhone上所有照片的方法
删除iPhone上所有照片的方法

删除iPhone上所有照片的方法;1、删除整个照片库;2、从相册中删除所有照片;3、仅从图库中删除照片;4、仅删除视频,屏幕截图,自拍,实时或人像照片;5、删除某人的所有照片;6、永久删除已删除的照片等等。想了解更多相关的内容,请阅读专题下面的文章。

5050

2024.12.11

iPhone静音开关不起作用
iPhone静音开关不起作用

若 iPhone 静音开关失效,先检查硬件,看开关状态、清洁缝隙。接着重启手机,查看静音及勿扰模式设置,更新系统。若都不行,可恢复出厂设置(提前备份)。若仍无效,可能是严重硬件问题,需联系苹果客服或去授权维修中心。

360

2025.03.20

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

120

2026.09.16

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

40

2026.09.16

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

40

2026.09.16

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

40

2026.09.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 5.5万人学习

CSS教程
CSS教程

共754课时 | 92.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn