You are currently viewing CSS: Scroll-Snap-Stop – Specifying Snap Point Inclusion

CSS: Scroll-Snap-Stop – Specifying Snap Point Inclusion

The scroll-snap-stop property is part of the CSS Scroll Snap module, designed to enhance the control over scrollable areas by specifying whether a snap point is mandatory. This property allows developers to create interfaces where certain elements always snap into place, regardless of the user’s scroll momentum. By using scroll-snap-stop, you can ensure that critical elements in a scrollable container are always fully visible, providing a more consistent and user-friendly experience.

Scroll snapping is especially useful in applications such as image galleries, carousels, and other interfaces where precise control over element positioning is essential. The scroll-snap-stop property complements the existing scroll snap properties by giving developers the ability to enforce snap points more strictly.

Basic Setup

To demonstrate the scroll-snap-stop property, we will set up a simple HTML structure with internal CSS. This setup will help us visualize how the property affects the layout and scrolling behavior of elements.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS Scroll Snap Stop Example</title>

    <style>

        html {
            scroll-behavior: smooth;
        }

        body {
            font-family: Arial, sans-serif;
            display: flex;
            flex-direction: row;
            overflow-x: scroll;
            scroll-snap-type: x mandatory;
        }

        .section {
            width: 100vw;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            border: 1px solid #ccc;
            scroll-snap-align: start;
            scroll-snap-stop: normal;
        }

        nav {
            position: fixed;
            top: 10px;
            left: 10px;
            background-color: rgba(255, 255, 255, 0.8);
            padding: 10px;
            border-radius: 5px;
        }

        nav a {
            display: block;
            margin-bottom: 5px;
            color: blue;
            text-decoration: none;
        }

    </style>

</head>
<body>

    <nav>
        <a href="#section1">Section 1</a>
        <a href="#section2">Section 2</a>
        <a href="#section3">Section 3</a>
    </nav>

    <div id="section1" class="section">Section 1</div>
    <div id="section2" class="section">Section 2</div>
    <div id="section3" class="section">Section 3</div>

</body>
</html>

In this setup, we have a simple horizontal scrollable layout with three sections. Each section uses the scroll-snap-align property set to start, ensuring the section snaps to the start of the viewport. The scroll-snap-stop property is set to normal, which is the default behavior where snapping is influenced by scroll momentum.

Understanding the scroll-snap-stop Property

The scroll-snap-stop property is used to control whether a snap point is mandatory or not. It accepts two values: normal and always.

  • normal: This is the default value. It allows the snap point to be skipped if the scroll momentum is high.
  • always: This value makes the snap point mandatory, ensuring the element always snaps into place regardless of the scroll momentum.

By using scroll-snap-stop: always, you can ensure that specific elements are always fully visible when scrolled into view, providing a more controlled and predictable scrolling experience.

Practical Examples of scroll-snap-stop

Let’s explore practical examples of using the scroll-snap-stop property with different values.

Example: Setting scroll-snap-stop to always

In this example, we will set the scroll-snap-stop property to always for the first section, ensuring it always snaps into place.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS Scroll Snap Stop Example</title>

    <style>

        html {
            scroll-behavior: smooth;
        }

        body {
            font-family: Arial, sans-serif;
            display: flex;
            flex-direction: row;
            overflow-x: scroll;
            scroll-snap-type: x mandatory;
        }

        .section {
            width: 100vw;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            border: 1px solid #ccc;
            scroll-snap-align: start;
            scroll-snap-stop: normal;
        }

        .section:first-of-type {
            scroll-snap-stop: always;
        }

        nav {
            position: fixed;
            top: 10px;
            left: 10px;
            background-color: rgba(255, 255, 255, 0.8);
            padding: 10px;
            border-radius: 5px;
        }

        nav a {
            display: block;
            margin-bottom: 5px;
            color: blue;
            text-decoration: none;
        }

    </style>

</head>
<body>

    <nav>
        <a href="#section1">Section 1</a>
        <a href="#section2">Section 2</a>
        <a href="#section3">Section 3</a>
    </nav>

    <div id="section1" class="section">Section 1</div>
    <div id="section2" class="section">Section 2</div>
    <div id="section3" class="section">Section 3</div>

</body>
</html>

In this example, the first section has the scroll-snap-stop property set to always. This ensures that the first section always snaps into place, regardless of the scroll momentum. The other sections use the default normal value, allowing them to be skipped if the scroll momentum is high.

This setup ensures that the first section is always fully visible when scrolled into view, providing a consistent and controlled scrolling experience for important content.

Combining scroll-snap-stop with Other CSS Properties

The scroll-snap-stop property can be combined with other CSS properties to create more advanced scrolling effects and improve the overall layout. Let’s see an example where we combine scroll-snap-stop with scroll-snap-align and scroll-padding to enhance the scrolling experience.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS Scroll Snap Stop and Padding Example</title>

    <style>

        html {
            scroll-behavior: smooth;
        }

        body {
            font-family: Arial, sans-serif;
            display: flex;
            flex-direction: row;
            overflow-x: scroll;
            scroll-snap-type: x mandatory;
            scroll-padding: 0 20px;
        }

        .section {
            width: calc(100vw - 40px);
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            border: 1px solid #ccc;
            scroll-snap-align: center;
            scroll-snap-stop: normal;
        }

        .section:nth-of-type(2) {
            scroll-snap-stop: always;
        }

        nav {
            position: fixed;
            top: 10px;
            left: 10px;
            background-color: rgba(255, 255, 255, 0.8);
            padding: 10px;
            border-radius: 5px;
        }

        nav a {
            display: block;
            margin-bottom: 5px;
            color: blue;
            text-decoration: none;
        }

    </style>

</head>
<body>

    <nav>
        <a href="#section1">Section 1</a>
        <a href="#section2">Section 2</a>
        <a href="#section3">Section 3</a>
    </nav>

    <div id="section1" class="section">Section 1</div>
    <div id="section2" class="section">Section 2</div>
    <div id="section3" class="section">Section 3</div>

</body>
</html>

In this example, the second section has the scroll-snap-stop property set to always, ensuring it always snaps into place. The body selector sets the scroll-padding property to 0 20px, adding 20 pixels of padding on the left and right of the viewport. The section class sets the scroll-snap-align property to center and adjusts the width of each section to calc(100vw - 40px) to account for the padding.

This combination ensures that the second section always snaps into place, while the scroll padding provides a more comfortable and visually appealing scrolling experience by centering each section in the viewport.

Conclusion

The scroll-snap-stop property is a powerful tool in the CSS Scroll Snap module that allows developers to control the snapping behavior of elements in a scrollable container. By specifying whether a snap point is mandatory or not, you can create more predictable and user-friendly interfaces.

In this article, we explored the basics of the scroll-snap-stop property, demonstrated practical examples, and combined it with other CSS properties to enhance the scrolling experience. By leveraging the power of scroll-snap-stop, you can ensure that critical content is always fully visible, providing a consistent and engaging user experience. Experiment with the scroll-snap-stop property in your projects to see how it can improve the usability and aesthetics of your scrollable interfaces.

Leave a Reply