Window: scrollBy() method

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

The scrollBy() method of the Window interface scrolls the document in the window by the given amount.

Syntax

js
scrollBy(xCoord, yCoord)
scrollBy(options)

Parameters

xCoord

The horizontal pixel value that you want to scroll by.

yCoord

The vertical pixel value that you want to scroll by.

options

An object containing the following properties:

top Optional

Specifies the number of pixels along the Y axis to scroll the window or element.

left Optional

Specifies the number of pixels along the X axis to scroll the window or element.

behavior Optional

Determines whether scrolling is instant or animates smoothly. This option is a string that must take one of the following values:

  • smooth: The scrolling animates smoothly.
  • instant: The scrolling happens instantly in a single jump.
  • auto: The scroll behavior is determined by the computed value of the scroll-behavior CSS property on the element.

If omitted, behavior defaults to auto.

Return value

A Promise that fulfills with an object containing the following property:

interrupted

A boolean value indicating whether the scrolling operation was interrupted (true) or not (false). Such an interruption typically happens when a programmatic scroll is ongoing, and another programmatic scroll is initiated on the window before the first one finishes.

Examples

Basic usage

To scroll down one page:

js
window.scrollBy(0, window.innerHeight);

To scroll up:

js
window.scrollBy(0, -window.innerHeight);

Using options:

js
window.scrollBy({
  top: 100,
  left: 100,
  behavior: "smooth",
});

Responding to the end of the scroll

Our window methods demo (see source code) demonstrates how the promise return value of scrollBy() can be used to respond to the end of a scrolling operation. This technique is mostly useful in cases where the scrolling occurs smoothly over time (achieved by setting the behavior option to smooth, or by setting the scrolling element's scroll-behavior property to smooth).

HTML

Our HTML includes several paragraphs of content and a <div> element toolbar containing <button> elements that trigger various scrolling operations on the window.

html
<div>
  <button class="scroll">scroll() to 1000</button>
  <button class="scrollto">scrollTo() top</button>
  <button class="scrollby">scrollBy() 200</button>
</div>

<p>...</p>

<p>...</p>

...

CSS

We give the :root element a scroll-behavior property value of smooth so that any scroll operations are animated smoothly over time rather than instantly.

css
:root {
  scroll-behavior: smooth;
}

We also create two class selectors; when a fade-out or fade-in class is applied to an element, an animation is applied so that it smoothly fades out or in, respectively. We also define @keyframes blocks to define the required opacity changes for those animations.

css
.fade-out {
  animation: fade-out 0.3s linear both;
}

.fade-in {
  animation: fade-in 0.3s linear both;
}

@keyframes fade-out {
  from {
    opacity: 1;
  }

  to {
    opacity: 0;
  }
}

@keyframes fade-in {
  from {
    opacity: 0;
  }

  to {
    opacity: 1;
  }
}

The rest of the CSS is not shown, for brevity.

JavaScript

We start by grabbing references to the <button> that runs the scrollBy() operation and the toolbar <div>:

js
const scrollByBtn = document.querySelector(".scrollby");
const toolbar = document.querySelector("div");

When the button is clicked, we immediately apply the fade-out class to the toolbar, causing it to fade out. We then run scrollBy(0, 200) on the window to scroll its content down by 200 pixels, awaiting its promise resolution as we do so and storing the result in a constant. When the promise has resolved, we log a message to say that the scroll operation has finished and whether it was interrupted. Finally, we apply the fade-in class to the toolbar, causing it to fade back in again.

js
scrollByBtn.addEventListener("click", async () => {
  toolbar.className = "fade-out";
  const result = await window.scrollBy(0, 200);
  console.log(
    `Scroll finished;${result.interrupted ? " " : " not "}interrupted`,
  );
  toolbar.className = "fade-in";
});

The code not relevant to scrollBy() is not shown, for brevity.

Result

Load our window methods demo (see source code) in a new tab and click the buttons to see the scrolling behavior. Note how the toolbar fades out when a button is pressed, and fades in again once the smooth scrolling is finished.

Try pressing one button and then quickly pressing another button before the first scrolling operation has finished. Open your browser's JavaScript console and note how, in these cases, the scrolling is reported as interrupted.

Specifications

Specification
CSSOM View Module
# dom-window-scrollby

Browser compatibility

See also