Fuzzy Scroll

Improved scroll-to behavior

Demo

Use one of these scroll-to links to see the fuzzyScroll() function in action. Their scroll-to target is the heading, but the desired effect is for the window to scroll-to a position where the blue border above the heading is still visible on the page.

Scroll to:

  1. Favorites
  2. Messages
  3. Settings

Favorites

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aspernatur at cupiditate est et, fugiat illum modi quisquam quo rerum voluptatum! Architecto consequuntur culpa delectus numquam quisquam? Alias consectetur libero sed?Aspernatur eligendi error facere inventore iste reiciendis. Autem id iure, porro quisquam quos tenetur totam? Amet consequuntur deleniti, distinctio molestiae necessitatibus obcaecati pariatur quo repudiandae sapiente totam veniam vero vitae!Accusantium adipisci aliquid animi assumenda culpa dolores doloribus fuga fugit ipsa nulla odio officiis pariatur praesentium provident, quam qui quos rerum sit suscipit, tempora tempore, unde velit voluptates! Neque, vel.Ab cum nisi nulla ratione rem tenetur? Consequuntur cupiditate deleniti eaque eveniet ex in placeat porro quibusdam quo quod? Accusamus fuga ipsa quia! Accusantium eligendi laboriosam minus neque repudiandae voluptas?

Return to top of demo

Messages

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusantium aspernatur autem beatae consequatur debitis dolore, eaque facere harum incidunt labore maxime minus modi mollitia natus odio provident quibusdam veniam voluptatem!Ab aliquam animi cumque illo minus optio quis voluptates? At atque, eum exercitationem explicabo in nulla qui ullam unde. Explicabo inventore odit placeat quae rem suscipit veritatis! Aperiam, ratione, repellendus!Aliquid corporis culpa distinctio est, expedita explicabo hic ipsa ipsum nam necessitatibus nemo, nesciunt quidem quos rerum saepe tempore veritatis voluptatum! Distinctio dolor eaque enim ipsa quae similique ut vel.Accusantium ad asperiores blanditiis culpa ipsam provident sit, voluptatum. Alias aut cumque dicta dignissimos dolorum enim et exercitationem fuga ipsa nobis praesentium, quam recusandae, reprehenderit sint temporibus voluptatem, voluptatum? Commodi.

Return to top of demo

Settings

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis iste nesciunt quasi sit! A eum inventore laudantium maiores omnis pariatur, repellat vero. Ad architecto doloremque eaque enim, labore officiis sint!Ad adipisci asperiores at deserunt, ipsa, minima, molestiae molestias nobis odit perferendis perspiciatis quasi repellat sint veritatis voluptatem! Blanditiis cum ea facilis impedit, incidunt pariatur tempora tempore ullam veritatis voluptatem?Necessitatibus omnis optio porro saepe temporibus. Accusantium alias aliquam animi asperiores at atque consectetur culpa cum cumque eveniet ipsa molestias odit, officia, optio, placeat quas repellat similique sunt totam vitae.Adipisci, culpa, obcaecati? Animi aperiam assumenda consequatur consequuntur cupiditate, dignissimos doloremque ducimus ea enim error, excepturi exercitationem ipsum iure labore laborum natus optio praesentium recusandae soluta veritatis. Amet, nisi, voluptates!

Return to top of demo

How to:

HTML, CSS, and Javascript

The following code samples are implemented on this site using Laravel Blade, Tailwind, Daisy UI, and Font Awesome.

Let's start with function to handle the scroll:

Javascript

/**
 * Scroll the window to a specified (X, Y) location, where 'Y' is some number
 * of pixels above a target element. Use a negative 'Y' to scroll below the element.
 *
 * @param {String} el CSS query selector for the target element to be scrolled to.
 * @param {Number} fuzz Vertical padding for scrollTo().
 * @param {Number} [x] Horizontal coordinate for scrollTo(). default is 0.
 *
 * @return {undefined}
 */
function fuzzyScroll(el, fuzz, x = 0)
{
    // get the bounding box of the target element
    const rect = document.querySelector(el).getBoundingClientRect();

    // get the location of the target element on the page
    const distanceToScrollY = rect.top + window.scrollY;

    // scroll the window, above or below the target element
    window.scrollTo(x, distanceToScrollY - fuzz);
}

If you are so inclined, you can add attach this function to the window object. Perhaps in your app.js file.

Javascript

document.addEventListener("DOMContentLoaded", () =>
{
    window.fuzzyScroll = fuzzyScroll;
});

Then we need a button or some text for the user to click on:

HTML

<p>
    <span class="link link-primary" onclick="window.fuzzyScroll('#targetHeading', 50)">Target Heading</span>
</p>

<div class="mt-12 py-12 border-t-2 border-sky-400>
    <h3 id="targetHeading">Target Heading</h3>
    <p>...</p>
</div>

In the example above we are using a value of 50 for the fuzz because Tailwind is providing 48px of top margin and a border that is 2px wide.

If you have questions about how to use fuzzyScroll() to implement improved scroll-to behavior on your website, hit me up on LinkedIn or Github.

Project Galleries

Tool

Color Average

Blend two colors to get their linear and logarithmic mid-point.

Tool

Multi Tab Opener

Like bookmarks on steroids: time released links with options and storage.

App

Jitter Bug

Simulated page traffic and product sales for marketing.

App

Shopping Cart

Originally made for use on Unbounce with Checkout Champ.

Tool

Public Library

A nifty little reading lens for classic novels using the Spritz SDK.