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

纯JavaScript实现平滑滚动到指定位置

胖宇大大_2424

胖宇大大_2424

发布时间:2025-12-02 12:26:53

|

788人浏览过

|

来源于php中文网

原创

纯javascript实现平滑滚动到指定位置

本文详细介绍了如何使用纯JavaScript实现平滑滚动到页面指定位置的功能,以替代jQuery的`animate({ scrollTop: y }, duration)`方法。核心解决方案是利用现代浏览器原生支持的`window.scrollTo({ top: Y_COORDINATE, behavior: 'smooth' })` API,该方法简洁高效,并提供优秀的浏览器兼容性,是实现平滑滚动效果的首选方案。

纯JavaScript实现平滑滚动到指定位置

在现代Web开发中,实现页面平滑滚动到特定位置是一项常见需求。过去,开发者常依赖jQuery的animate()方法来实现这一效果,例如$('html, body').animate({ scrollTop: y }, 400);。然而,随着纯JavaScript能力的增强以及对性能优化的追求,许多项目开始寻求摆脱jQuery依赖的解决方案。本教程将介绍如何使用原生JavaScript实现与jQuery animate功能相同的平滑滚动效果。

核心解决方案:window.scrollTo()

现代浏览器提供了一个简单而强大的原生API来控制页面的滚动行为:window.scrollTo()。这个方法允许我们以编程方式将文档滚动到窗口中的特定坐标。更重要的是,它支持一个behavior选项,可以轻松实现平滑滚动。

语法

window.scrollTo({
  top: Y_COORDINATE, // 垂直方向的滚动位置(像素值)
  left: X_COORDINATE, // 水平方向的滚动位置(像素值,可选)
  behavior: 'smooth' // 滚动行为,可以是 'auto'(默认,瞬间滚动)或 'smooth'(平滑滚动)
});
  • top: 指定页面应滚动到的垂直像素位置。这是相对于文档顶部的距离。
  • left: 指定页面应滚动到的水平像素位置。如果不需要水平滚动,可以省略或设置为0。
  • behavior: 这是实现平滑滚动的关键选项。当设置为'smooth'时,浏览器将以动画形式平滑地滚动到目标位置;当设置为'auto'时,滚动将立即完成,没有任何动画效果。

示例代码

假设我们有一个页面,其中包含多个部分和一个导航菜单。当用户点击导航项时,我们希望页面平滑滚动到对应的部分。

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

HTML 结构:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>纯JS平滑滚动示例</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 0;
            padding: 0;
            height: 2000px; /* 制造可滚动内容 */
        }
        nav {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            background-color: #333;
            padding: 10px 0;
            z-index: 1000;
        }
        nav ul {
            list-style: none;
            margin: 0;
            padding: 0;
            text-align: center;
        }
        nav ul li {
            display: inline-block;
            margin: 0 15px;
        }
        nav ul li a {
            color: white;
            text-decoration: none;
            font-size: 18px;
            padding: 5px 10px;
        }
        .section {
            height: 600px; /* 每个部分的高度 */
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 2em;
            color: white;
            margin-top: 50px; /* 模拟内容起始位置 */
        }
        #section1 { background-color: #f44336; margin-top: 80px; } /* 留出固定导航的高度 */
        #section2 { background-color: #2196f3; }
        #section3 { background-color: #4CAF50; }
        #section4 { background-color: #ff9800; }
    </style>
</head>
<body>
    <nav>
        <ul>
            <li><a href="#section1" data-target-id="section1">部分一</a></li>
            <li><a href="#section2" data-target-id="section2">部分二</a></li>
            <li><a href="#section3" data-target-id="section3">部分三</a></li>
            <li><a href="#section4" data-target-id="section4">部分四</a></li>
        </ul>
    </nav>

    <div id="section1" class="section">部分一</div>
    <div id="section2" class="section">部分二</div>
    <div id="section3" class="section">部分三</div>
    <div id="section4" class="section">部分四</div>

    <script src="scroll.js"></script>
</body>
</html>

JavaScript (scroll.js):

Miller CSV TSV JSON 数据处理器
Miller CSV TSV JSON 数据处理器

Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。

下载
document.addEventListener('DOMContentLoaded', () => {
    const navLinks = document.querySelectorAll('nav a');
    const fixedNavHeight = document.querySelector('nav').offsetHeight; // 获取固定导航的高度

    navLinks.forEach(link => {
        link.addEventListener('click', (event) => {
            event.preventDefault(); // 阻止默认的锚点跳转行为

            const targetId = link.getAttribute('data-target-id');
            const targetElement = document.getElementById(targetId);

            if (targetElement) {
                // 计算目标元素的offsetTop,并减去固定导航的高度
                // 这样可以确保目标元素完全显示在固定导航下方
                const targetPosition = targetElement.offsetTop - fixedNavHeight;

                window.scrollTo({
                    top: targetPosition,
                    behavior: 'smooth'
                });
            }
        });
    });
});

在这个示例中:

  1. 我们监听了所有导航链接的点击事件。
  2. event.preventDefault()阻止了浏览器默认的锚点跳转(它会导致瞬间滚动)。
  3. 我们获取了目标元素的offsetTop,这是元素相对于其offsetParent(通常是<body>)顶部的距离。
  4. 重要提示: 由于导航栏是position: fixed,它会覆盖页面顶部的内容。为了让目标部分完全显示在导航栏下方,我们需要从targetElement.offsetTop中减去固定导航栏的高度(fixedNavHeight)。
  5. 最后,调用window.scrollTo()并设置behavior: 'smooth'来实现平滑滚动。

浏览器兼容性

window.scrollTo()方法本身在所有主流浏览器中都得到了广泛支持。而behavior: 'smooth'选项在现代浏览器中也具有非常好的兼容性:

  • Chrome (所有版本)
  • Firefox (所有版本)
  • Safari (所有版本)
  • Edge (所有版本)
  • Opera (所有版本)

对于一些非常老旧的浏览器(如IE,但现代Web开发通常不再考虑),behavior: 'smooth'可能不被支持,此时它会优雅降级为'auto'行为(即瞬间滚动),不会导致脚本错误。因此,在大多数情况下,可以放心地使用此API。

替代方案与高级用法

尽管window.scrollTo({ behavior: 'smooth' })是实现平滑滚动的最佳原生方案,但在某些特定场景下,你可能需要考虑其他方法:

  1. element.scrollIntoView(): 如果你想将某个特定的DOM元素滚动到视口中,而不是滚动到精确的像素坐标,element.scrollIntoView()是一个更好的选择。它也支持behavior: 'smooth'选项。

    document.getElementById('myElement').scrollIntoView({
        behavior: 'smooth',
        block: 'start' // 或 'center', 'end', 'nearest'
    });

    block选项定义了元素在垂直方向上如何与视口对齐。

  2. 手动实现动画 (requestAnimationFrame): 如果需要更精细地控制滚动动画的持续时间、缓动函数(easing function)或在滚动过程中执行其他操作,你可以使用window.requestAnimationFrame()手动实现一个滚动动画循环。这会涉及更多的数学计算来插值滚动位置,但提供了最大的灵活性。

    function smoothScrollTo(targetY, duration) {
        const startY = window.scrollY;
        const distance = targetY - startY;
        let startTime = null;
    
        function animation(currentTime) {
            if (startTime === null) startTime = currentTime;
            const timeElapsed = currentTime - startTime;
            const progress = Math.min(timeElapsed / duration, 1);
            // 可以使用不同的缓动函数,这里是简单的线性插值
            const easeProgress = progress; // 线性
            // 例如,使用ease-out-quad: const easeProgress = progress * (2 - progress);
    
            window.scrollTo(0, startY + distance * easeProgress);
    
            if (timeElapsed < duration) {
                requestAnimationFrame(animation);
            }
        }
        requestAnimationFrame(animation);
    }
    
    // 调用示例: 滚动到Y轴1000px位置,持续800毫秒
    // smoothScrollTo(1000, 800);

    这种方法虽然更复杂,但允许你完全自定义动画的每一个细节。

总结

对于大多数平滑滚动到指定位置的需求,window.scrollTo({ top: Y_COORDINATE, behavior: 'smooth' })是纯JavaScript中最简洁、性能最优且兼容性良好的解决方案。它直接利用了浏览器原生的滚动优化,避免了手动计算动画帧的复杂性。当需要将特定元素滚动到视口时,element.scrollIntoView({ behavior: 'smooth' })是其优秀的补充。只有在需要高度定制的滚动动画(如自定义缓动曲线、滚动中途暂停等)时,才需要考虑使用requestAnimationFrame手动实现。通过采用这些原生API,可以有效地移除jQuery等库的依赖,使项目更加轻量和高效。

热门AI工具

更多
DeepSeek

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

VibeKnow
VibeKnow Hot

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

Lovart
Lovart Hot

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

WorkBuddy

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

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

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

相关专题

更多
jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

561

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

936

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2102

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

2108

2023.12.04

jquery实现分页方法
jquery实现分页方法

在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

473

2023.12.06

jquery中隐藏元素是什么
jquery中隐藏元素是什么

jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

317

2024.02.23

jquery中什么是高亮显示
jquery中什么是高亮显示

jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

526

2024.02.23

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

249

2026.01.13

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习

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

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