CSS-Only

Scroll Gallery

Horizontal or vertical scrolling gallery with CSS snap points. Native scroll performance with smooth snap-to-item behavior.

Example

<div class="scroll-gallery">
  <div class="track">
    <div class="item">Slide 1</div>
    <div class="item">Slide 2</div>
    <div class="item">Slide 3</div>
  </div>
</div>

Patterns

Full-Width Slides

Default behavior - each item fills 100% of the container width:

<div class="scroll-gallery">
  <div class="track">
    <div class="item">Full Width 1</div>
    <div class="item">Full Width 2</div>
    <div class="item">Full Width 3</div>
    <div class="item">Full Width 4</div>
  </div>
</div>

Variable Width Cards

Use item.variable for items with their own width:

<div class="scroll-gallery">
  <div class="track">
    <div class="item variable">
      <div class="card">Card 1</div>
    </div>
    <div class="item variable">
      <div class="card">Card 2</div>
    </div>
    <div class="item variable">
      <div class="card">Card 3</div>
    </div>
  </div>
</div>

Center-Aligned Items

Use item.center to snap items to the center:

<div class="scroll-gallery">
  <div class="track">
    <div class="item variable center">
      <img src="image1.jpg" alt="Image 1">
    </div>
    <div class="item variable center">
      <img src="image2.jpg" alt="Image 2">
    </div>
    <div class="item variable center">
      <img src="image3.jpg" alt="Image 3">
    </div>
  </div>
</div>

Hidden Scrollbar

Use scroll-gallery.no-scrollbar to hide the scrollbar while keeping scroll functionality:

<div class="scroll-gallery no-scrollbar">
  <div class="track">
    <div class="item variable">Card 1</div>
    <div class="item variable">Card 2</div>
    <div class="item variable">Card 3</div>
  </div>
</div>

Vertical Gallery

Use scroll-gallery.vertical for vertical scrolling:

<div class="scroll-gallery vertical" style="height: 400px;">
  <div class="track">
    <div class="item">Vertical 1</div>
    <div class="item">Vertical 2</div>
    <div class="item">Vertical 3</div>
    <div class="item">Vertical 4</div>
  </div>
</div>

API Reference

Container Classes

Class Description
.scroll-gallery Main container with horizontal scroll and snap behavior
.scroll-gallery.no-scrollbar Hides scrollbar while keeping scroll functionality
.scroll-gallery.vertical Vertical scrolling mode

Child Classes

Class Description
.track Flex container that holds all items (required)
.item Individual gallery item with snap behavior (default: 100% width)
.item.variable Item with auto width based on content
.item.center Snap to center instead of start

HTML Structure

<div class="scroll-gallery [no-scrollbar] [vertical]">
  <div class="track">
    <div class="item [variable] [center]">
      <!-- Your content -->
    </div>
    <!-- More items... -->
  </div>
</div>

Accessibility

  • Native scroll behavior ensures full keyboard navigation support
  • Works with arrow keys, Page Up/Down, Home/End
  • Respects prefers-reduced-motion - disables smooth scroll for users who prefer reduced motion
  • Touch-friendly with iOS momentum scrolling support
  • Screen readers can navigate through all items sequentially
  • No JavaScript required - works in all browsers with CSS support
  • Consider adding aria-label to the container for context (e.g., "Product gallery")
  • Ensure focusable elements within items are keyboard accessible

Recommended ARIA

<div class="scroll-gallery" aria-label="Product gallery">
  <div class="track">
    <div class="item" role="group" aria-label="Product 1">
      <!-- Content -->
    </div>
    <!-- More items... -->
  </div>
</div>

Best Practices

  • Set explicit heights/widths: For vertical galleries, set a height on the container. For variable-width items, ensure content has defined dimensions.
  • Don't overuse snap points: Mandatory snap points work best for distinct sections. For long scrollable content, consider using scroll-snap-type: x proximity instead.
  • Test on touch devices: Scroll galleries work differently on touch vs. mouse. Always test on mobile.
  • Provide visual indicators: Consider adding pagination dots or scroll indicators so users know there's more content.
  • Lazy load images: For image galleries, use loading="lazy" on images to improve performance.
  • Consider spacing: Add appropriate gaps between items (margin/padding) for better visual separation.