Kombai Logo

Tailwind CSS Scroll Snap Type

Scroll Snap Type is a property in CSS that allows developers to control the scroll behavior of a container, snapping child elements into place at defined scroll positions. It’s widely used for creating smooth, engaging user experiences, especially in carousels, galleries, and content scrolling containers.

In this guide, we will learn how to use Tailwind CSS to apply scroll snap properties easily without writing custom CSS manually.

ClassPropertiesExample
snap-nonescroll-snap-type: none;<div className="snap-none"></div>
snap-xscroll-snap-type: x var(--tw-scroll-snap-strictness);<div className="snap-x"></div>
snap-yscroll-snap-type: y var(--tw-scroll-snap-strictness);<div className="snap-y"></div>
snap-bothscroll-snap-type: both var(--tw-scroll-snap-strictness);<div className="snap-both"></div>
snap-mandatory--tw-scroll-snap-strictness: mandatory;<div className="snap-mandatory"></div>
snap-proximity--tw-scroll-snap-strictness: proximity;<div className="snap-proximity"></div>

Overview of Scroll Snap Type

Adding the Horizontal Scroll Snap

To define scroll snapping, Tailwind provides scroll-snap utilities like snap-none, snap-x, snap-y, and snap-both. These classes describe the direction of the scroll snapping behavior.

Here's an example of horizontal scroll snap:

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Adding the Mandatory Scroll Snap

The snap-mandatory utility strictly enforces the scroll snap behavior and ensures that the viewport strictly adheres to snap points.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Adding the Proximity Scrolling Snap

You can achieve a more lenient snapping behavior using snap-proximity. It snaps elements only when the scroll end position is close enough to a snap point.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

States and Responsiveness

Tailwind’s utility classes allow you to conditionally apply the scroll snapping using hover, focus states, and breakpoints. This section walks through how to integrate this flexibility into your projects.

Hover and Focus States

Tailwind’s scroll snap utilities also work on states like hover and focus. Use hover and modifiers while adding these utilities to make them work on these states.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Breakpoint Modifiers

Different scroll snap types can be used for different screens with responsive modifiers like sm, md, lg, etc.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Real World Examples

A horizontal product showcase with mandatory snap points, perfect for e-commerce featured items.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Vertical Story Viewer

A vertical story viewer with smooth snapping, similar to social media stories.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

A grid-based portfolio with both horizontal and vertical snapping.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Timeline Scroll Experience

A vertical timeline with snap points for each major event.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

A fullscreen image gallery with diagonal snapping for an unique viewing experience.

This is a live editor. Play around with it!
export default function App() {
  return <h1>Hello world</h1>
}

Best Practices

Maintain Design Consistency

Design consistency is essential when leveraging Tailwind CSS’s Scroll Snap Type utilities. To maintain uniformity, ensure that all scrollable containers and their child elements use the same snapping logic throughout your project.

For example, if a gallery or carousel uses snap-x snap-mandatory, apply the same utility classes to similar components. This approach strengthens the visual flow and ensures all components behave predictably.

Leverage Utility Combinations

Combining Scroll Snap Type utilities with complementary Tailwind classes can introduce advanced designs optimized for functionality and style. For example, pairing snap-x with flex or grid classes ensures seamless snapping alongside sophisticated layout arrangements.

Add spacing utilities like gap-4 or padding classes such as p-4 to maintain aesthetic spacing between snap elements.

Accessibility Considerations

Enhance Readability and Navigability

Scroll Snap Type improves navigability by creating predictable stopping points for scrolling containers. However, to better serve users with visual impairments or motor difficulties, content within snapping sections must remain clear and easy to explore. Maintain sufficient spacing, consistent alignment, and readable fonts.

Support content contextually by including visible or semantic indicators for scrollable components. For example, in a horizontal carousel using snap-x, add clear scroll instructions (e.g., aria-label attributes or visible scroll icons) to help users unfamiliar with snap-based navigation.

Ensure Keyboard Accessibility

Keyboard accessibility relies on two main factors: an intuitive focus order and visible indicators. Any content that can be snapped or interacted with should support tabindex to become focusable, so keyboard users can navigate through each snap point with the tab key. Additionally, combine it with outline utilities to provide visual feedback once an element is in focus.

This not only helps users understand their position on the page but also enhances usability by ensuring they know which snapable item is currently selected. In carousel layouts or horizontally scrolling sections, these principles become even more critical, as keyboard navigation without proper focus styling often leads to confusion or lost context.