ZetCode

JavaScript window.scrollBy

最后修改于 2025 年 4 月 2 日

在本文中,我们将探讨 JavaScript 中的 window.scrollBy 方法。此方法对于以编程方式控制页面滚动至关重要,可实现平滑的导航体验。

基本定义

window.scrollBy 方法会按给定量滚动窗口中的文档。它接受 x 和 y 坐标作为参数,以确定水平和垂直滚动的距离。

与滚动到绝对位置的 window.scrollTo 不同,scrollBy 是相对于当前位置滚动的。这使其成为增量滚动效果的理想选择。

基本 scrollBy 示例

此示例演示了 window.scrollBy 的最简单用法,即在单击按钮时将页面向下滚动 100 像素。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Basic scrollBy</title>
    <style>
        body { height: 2000px; }
        button { position: fixed; }
    </style>
</head>
<body>

<button onclick="scrollDown()">Scroll Down</button>

<script>
    function scrollDown() {
        window.scrollBy(0, 100);
    }
</script>

</body>
</html>

在此基本示例中,我们有一个很长的页面和一个固定位置的按钮。单击该按钮会调用 scrollDown,后者使用 window.scrollBy 在垂直方向(y 轴)上向下滚动 100 像素。

第一个参数 (0) 控制水平滚动,第二个参数 (100) 控制垂直滚动。负值将向相反方向滚动。

平滑滚动行为

此示例展示了如何使用选项参数通过 window.scrollBy 启用平滑滚动行为。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Smooth Scrolling</title>
    <style>
        body { height: 2000px; }
        button { position: fixed; top: 20px; }
    </style>
</head>
<body>

<button onclick="smoothScroll()">Smooth Scroll</button>

<script>
    function smoothScroll() {
        window.scrollBy({
            top: 300,
            left: 0,
            behavior: 'smooth'
        });
    }
</script>

</body>
</html>

在这里,我们使用了 scrollBy 的对象参数版本,它允许更多配置选项。behavior: 'smooth' 属性启用动画滚动,而不是默认的即时跳转。

这提供了更精致的用户体验,尤其是在滚动距离较大时。动画持续时间和缓动函数取决于浏览器。

水平滚动

此示例演示了使用 window.scrollBy 和水平容器进行水平滚动。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Horizontal Scrolling</title>
    <style>
        .container {
            display: flex;
            width: 3000px;
            height: 200px;
            background-color: #f0f0f0;
        }
        .item {
            width: 300px;
            height: 200px;
            margin: 10px;
            background-color: #ccc;
        }
    </style>
</head>
<body>

<div class="container">
    <div class="item">Item 1</div>
    <div class="item">Item 2</div>
    <div class="item">Item 3</div>
    <div class="item">Item 4</div>
    <div class="item">Item 5</div>
</div>
<button onclick="scrollRight()">Scroll Right</button>
<button onclick="scrollLeft()">Scroll Left</button>

<script>
    function scrollRight() {
        window.scrollBy(300, 0);
    }
    function scrollLeft() {
        window.scrollBy(-300, 0);
    }
</script>

</body>
</html>

在此示例中,我们有一个带有多个项目的宽容器和两个按钮。这些按钮使用 scrollBy 在任一方向上水平滚动 300 像素。

正 x 值向右滚动,负值向左滚动。此技术对于创建带有自定义导航控件的水平图库或轮播非常有用。

按视口高度滚动

此示例展示了如何使用 window.innerHeightscrollBy 按完整的视口高度滚动。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Page Height Scrolling</title>
    <style>
        section {
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 2rem;
        }
        section:nth-child(odd) { background: #f0f0f0; }
        section:nth-child(even) { background: #e0e0e0; }
    </style>
</head>
<body>

<section>Section 1</section>
<section>Section 2</section>
<section>Section 3</section>
<button onclick="scrollPageDown()">Next Section</button>

<script>
    function scrollPageDown() {
        window.scrollBy({
            top: window.innerHeight,
            behavior: 'smooth'
        });
    }
</script>

</body>
</html>

在这里,我们有一个具有完整视口高度部分的页面。按钮通过使用 window.innerHeight 作为滚动量来滚动到下一部分。

这创建了现代单页应用程序中常见的“滚动吸附”效果。平滑的行为增强了用户在各部分之间的体验。

条件滚动

此示例演示了在达到特定边界时停止的条件滚动。

index.html
<!DOCTYPE html>
<html>
<head>
    <title>Conditional Scrolling</title>
    <style>
        body { height: 2000px; }
        #progress {
            position: fixed;
            top: 10px;
            right: 10px;
        }
    </style>
</head>
<body>

<button onclick="smartScroll()">Smart Scroll</button>
<div id="progress">Scroll Progress: 0%</div>

<script>
    function smartScroll() {
        const scrollAmount = 100;
        const maxScroll = document.body.scrollHeight - window.innerHeight;
        
        if (window.scrollY + scrollAmount <= maxScroll) {
            window.scrollBy(0, scrollAmount);
        } else {
            window.scrollTo(0, maxScroll);
            alert("Reached bottom of page!");
        }
        
        // Update progress indicator
        const progress = Math.round((window.scrollY / maxScroll) * 100);
        document.getElementById('progress').textContent = 
            `Scroll Progress: ${progress}%`;
    }
</script>

</body>
</html>

此示例实现了一个“智能”滚动,它会检查是否还有足够的内容可供滚动。它还会更新一个进度指示器,显示用户已滚动到页面的哪个位置。

代码计算了最大可能的滚动位置并阻止了超出该位置的滚动。当接近底部时,它使用 scrollTo 进行精确的定位并显示一个警报。

来源

MDN scrollBy 文档

在本文中,我们通过各种实际示例探讨了 window.scrollBy 方法。此方法对于创建自定义滚动行为和增强用户导航体验非常强大。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 JS DOM 教程