Practical CSS Scroll Snapping | CSS-Tricks – CSS-Tricks

Video Ie website scroll snap back to top of page

CSS scroll snapping means that you can lock the viewport to sure components or places after a consumer has completed scrolling. It’s nice for constructing interactions like this one:

scroll snap demo
Dwell Demo

Browser help and fundamental utilization

Browser help for CSS scroll snapping has improved considerably because it was launched in 2016, with Google Chrome (69+), Firefox, Edge, and Safari all supporting some model of it.

See more: Ie website scroll snap back to top of page

Scroll snapping is utilized by setting the scroll-snap-type property on a container factor and the scroll-snap-align property on components inside it. When the container factor is scrolled, it’ll snap to the kid components you’ve outlined. In its most elementary type, it seems like this:

<div class=”container”> <part class=”little one”></part> <part class=”little one”></part> <part class=”little one”></part> <p>…</p> </div> .container { scroll-snap-type: y obligatory; } .little one { scroll-snap-align: begin; }

That is completely different to the primary model of the spec, which allowed you to set snap-points manually utilizing the repeat key phrase:

.container { /* OLD */ scroll-snap-points-y: repeat(300px); }

This technique is fairly restricted. Because it solely permits evenly-spaced snap factors, you’ll be able to’t actually construct an interface that snaps to different-sized components. If components change their form throughout completely different display sizes, you’re additionally certain to run into points.

On the time of this writing, Firefox, Web Explorer, and Edge help the older model of the spec, whereas Chrome (69+) and Safari help the newer, element-based technique.

You should use each strategies alongside one another (in case your format permits it) to help each teams of browsers:

.container { scroll-snap-type: obligatory; scroll-snap-points-y: repeat(300px); scroll-snap-type: y obligatory; } .little one { scroll-snap-align: begin; }

I’d argue a extra versatile choice is to make use of the element-based syntax completely and loading a polyfill to help browsers that don’t but help it. That is the tactic I’m utilizing within the examples beneath.

Sadly, the polyfill doesn’t include a browser bundle, so it’s a bit difficult to make use of if you happen to’re not utilizing a construct course of. The simplest means round this I’ve discovered is to hyperlink to the script on and initializing it utilizing cssScrollSnapPolyfill() as soon as the DOM is loaded. It’s additionally price stating that this polyfill solely helps the element-based syntax, not the repeat-method.

Dad or mum container properties

As with every property, it’s a good suggestion to get aware of the values they settle for. Scroll snap properties are utilized to each mum or dad and little one components, with particular values for every. Type of the identical means flexbox and grid do, the place the mum or dad turns into a “flex” or “grid” container. On this case, the mum or dad turns into a snap container, if you’ll.

Listed below are the properties and values for the mum or dad container and the way they work.

scroll-snap-type “obligatory” vs. “proximity”

The obligatory worth means the browser has to snap to a snap level at any time when the consumer stops scrolling. The proximity property is much less strict—it means the browser might snap to a snap level if it appears acceptable. In my expertise, this tends to kick in while you cease scrolling inside just a few hundred pixels of a snap level.

In my very own work, I’ve discovered that obligatory makes for a extra constant consumer expertise, nevertheless it can be harmful, because the spec factors out. Image a situation the place a component inside a scrolling container is taller than the viewport:

scroll snap overflow

Editor’s Choice: 5 Best Assignment Writing Services in UK – Top Assignment Help – The European Business Review

If that container is about to scroll-snap-type: obligatory, it’ll all the time snap both to the highest of the factor or the highest of the one beneath, making the center a part of the tall factor not possible to scroll to.


By default, content material will snap to the very edges of the container. You may change that by setting the scroll-padding property on the container. It follows the identical syntax because the common padding property.

This may be helpful in case your format has components that might get in the best way of the content material, like a hard and fast header.

Properties on the kids

Now let’s transfer on over to the properties for little one components.


This allows you to specify which a part of the factor is meant to snap to the container. It has three doable values: begin, heart, and finish.

scroll snap align

These are relative to the scroll route. If you happen to’re scrolling vertically, begin refers back to the prime fringe of the factor. If you happen to’re scrolling horizontally, it refers back to the left edge. heart and finish comply with the identical precept. You may set a special worth for every scroll route separated by an area.

scroll-snap-stop “regular” vs. “all the time”

By default, scroll snapping solely kicks in when the consumer stops scrolling, that means they’ll skip over a number of snap factors earlier than coming to a cease.

You may change this by setting scroll-snap-stop: all the time on any little one factor. This forces the scroll container to cease on that factor earlier than the consumer can proceed to scroll.

On the time of this writing, no browser helps scroll-snap-stop natively, although there’s a monitoring bug for Chrome.

Let’s have a look at some examples of scroll snap in use.

Instance 1: Vertical listing

To make a vertical listing snap to every listing factor solely takes just a few strains of CSS. First, we inform the container to snap alongside its vertical axis:

.container { scroll-snap-type: y obligatory; }

Then, we outline the snap factors. Right here, we’re specifying that the prime of every listing factor goes to be a snap level:

.little one { scroll-snap-align: begin; }

Instance 2: Horizontal slider

To make a horizontal slider, we inform the container to snap alongside its x-axis. We’re additionally utilizing scroll-padding to verify the kid components snap to the middle of the container.

.container { scroll-snap-type: x obligatory; scroll-padding: 50%; }

Editor’s Choice: Free NFL Live Streams: 12 Best NFL Streaming Sites for 2022

Then, we inform the container which factors to snap to. To heart the gallery, we outline the middle level of every factor as a snap level.

.little one { scroll-snap-align: heart; }

Instance 3: Vertical full display

We will set the snap factors immediately on the factor:

html { /* physique will not work ¯_(ツ)_/¯ */ scroll-snap-type: y obligatory; } /* Though I am instructed that html does not work in Safari and physique does, so possibly use each? */

Then, we make every part the dimensions of the viewport and outline the highest edge as a snap level:

part { top: 100vh; width: 100vw; scroll-snap-align: begin; }

Instance 4: Horizontal full display

This is similar type of idea because the vertical model, however with the snap level on the x-axis as an alternative.

physique { scroll-snap-type: x obligatory; } part { top: 100vh; width: 100vw; scroll-snap-align: begin; }

Instance 5: 2D picture grid

Scroll snapping can work in two instructions on the identical time. Once more, we are able to set scroll-snap-type immediately on the factor:

.container { scroll-snap-type: each obligatory; }

Then, we outline the top-left nook of every tile as a snap level:

.tile { scroll-snap-align: begin; }

Some ideas on consumer expertise

Messing with scrolling is dangerous enterprise. Because it’s such a elementary a part of interacting with the online, altering it in any means can really feel jarring—the time period scrolljacking used to get thrown round to explain that type of expertise.

The beauty of CSS-based scroll snapping is that you simply’re not taking direct management over the scroll place. As a substitute, you’re simply giving the browser an inventory of positions to snap in a means that’s acceptable to the platform, enter technique, and consumer preferences. This implies a scrolling interface you construct goes to really feel identical to the native interface (i.e utilizing the identical animations, and many others.) on no matter platform it’s seen on.

To me, that is the important thing benefit of CSS scroll snapping over JavaScript libraries that supply comparable performance.

This works pretty properly in my expertise, particularly on cellular. Perhaps it is because scroll snapping is already a part of the native UI on cellular platforms. (Image the house screens on iOS and Android—they’re basically horizontal sliders with snap factors.) The interplay on Chrome on Android is especially good as a result of it appears like common scrolling, however the viewport all the time occurs to come back to a cease at a snap level:

There’s undoubtedly some fancy maths occurring to make this occur. Due to CSS scroll snapping, we’re getting it totally free.

After all, we shouldn’t begin throwing snap factors onto the whole lot. Issues like article pages do exactly high-quality with out them. However I believe they could be a good enhancement in the correct scenario—picture galleries, slideshows appear to be good candidates, however possibly there’s potential past that.


If accomplished thoughtfully, scroll snapping could be a helpful design software. CSS snap factors mean you can hook into the browser’s native scrolling interplay, so your interface really feel seamless and clean. With a JavaScript API doubtlessly on the horizon, these are going to develop into much more highly effective. Nonetheless, a lightweight contact might be the best way to go.

Editor’s Choice: Die 14 besten Webdesign-Inspirationen | OMR Reviews

Related Posts

Leave a Reply

Your email address will not be published. Required fields are marked *