Embla Carousel Auto-Scroll Logo Marquee — Free Logo Strip Snippet

Embla Carousel Auto-Scroll Logo Marquee · Carousels · Plain HTML, CSS & JS · Live preview

What's included

Features

Auto Scroll plugin
Continuous pixel-per-frame motion.
Opposite-direction rows
direction: 'backward' on the second row.
Draggable with momentum
loop plus dragFree.
Hover pause
stopOnMouseEnter for reading.
Pause button
Stops both rows for motion-sensitive users.
Speed control
Re-initialises with a new plugin instance.
Edge fade mask
Soft appear and disappear at both sides.
Muted until hovered
Logos lift to full opacity on hover.

About this UI Snippet

Embla Auto Scroll — A Logo Marquee You Can Also Grab

Screenshot of the Embla Carousel Auto-Scroll Logo Marquee snippet rendered live

Logo marquees are usually pure CSS animations: cheap, smooth, and impossible to interact with. Embla's Auto Scroll plugin gives the same continuous motion while keeping a real carousel underneath, so visitors can grab the strip, throw it, and let it carry on.

Continuous motion, not slide steps

EmblaCarouselAutoScroll({ speed }) moves the track a fixed number of pixels per frame instead of snapping between slides. Combined with loop: true and dragFree: true, the strip becomes an endless belt that can be dragged with momentum. direction: 'backward' on the second row makes the rows drift past each other.

Enough content to loop

Embla's loop needs slides that cover more than the viewport, otherwise it can't reposition slides out of sight. Ten logos might be too few on a wide screen, so each row renders its set twice.

Interaction settings

stopOnMouseEnter pauses while the pointer is over a row, so visitors can read a logo. stopOnInteraction: false resumes scrolling after a drag instead of stopping forever.

Pause and speed controls

A visible pause button (WCAG 2.2.2 requires one for motion longer than five seconds) calls plugin.stop() and plugin.play() on both rows. Speed is a plugin option, not a method, so the slider destroys each carousel and re-creates it with a fresh plugin, which is the documented way to change plugin options.

Soft edges

A horizontal mask-image gradient fades logos in and out at both ends, avoiding a hard cut at the container edge. Logos sit slightly muted and lift to full strength on hover.

Build with AI

Build, Understand, Optimize, and Extend It With AI

Paste this snippet into an AI assistant like Claude and ask it to explain why the logo list is duplicated and why changing speed requires re-initialising. Ask it to use real SVG logos with alt text, link each logo to a case study, or slow the strip down while a logo is focused. It can also compare this with a pure CSS marquee for performance.

Prompt to recreate it

Copy this into your AI assistant of choice to build the effect from scratch, or as a jumping-off point for your own variant:

text
Build a two-row "trusted by" logo marquee with Embla Carousel v8 and its Auto Scroll plugin (loaded from a CDN as UMD) in plain HTML, CSS and JavaScript.

Requirements:
- Ten brand logos (a coloured mark and name), rendered twice per row so the loop never shows a gap.
- The top row scrolls forward and the bottom row backward, continuously, looping and draggable with momentum.
- Pause while hovered, resume after a drag, and don't autoplay when the user prefers reduced motion.
- A pause/play button with aria-pressed that stops or starts both rows.
- A speed slider that re-creates both carousels with a new plugin instance at the chosen speed.
- Fade logos in and out at both edges with a CSS mask, and show logos slightly muted until hovered.

Want to tighten it up first? Run this prompt through the AI Prompt Studio to score it across 8 quality dimensions, catch anti-patterns, and tune the wording for Claude, ChatGPT, or Gemini before you paste it in.

Source Code

<section class="eal">
  <p class="eal-kicker">Trusted by 4,000+ teams</p>
  <div class="eal-row">
    <div class="eal-viewport" id="ealTop"><div class="eal-container" id="ealTopList"></div></div>
    <div class="eal-viewport" id="ealBottom"><div class="eal-container" id="ealBottomList"></div></div>
  </div>
  <div class="eal-controls">
    <button type="button" id="ealToggle" aria-pressed="false">Pause</button>
    <label>Speed <input type="range" id="ealSpeed" min="0.4" max="3" step="0.2" value="1.2"></label>
  </div>
</section>

Step by step

How to Use

  1. 1
    Load Embla and Auto ScrollInclude the core and embla-carousel-auto-scroll UMD builds.
  2. 2
    Paste the snippetTwo logo rows drift in opposite directions.
  3. 3
    Grab a rowDrag and release; it glides, then keeps scrolling.
  4. 4
    Pause or change speedUse the button and slider below the rows.
  5. 5
    Add your logosReplace BRANDS with names and colours, or use img tags in the slides.

Real-world uses

Common Use Cases

SaaS landing pages
"Trusted by" customer logos.
Partner and sponsor strips
Event and conference pages.
Press mentions
Publications that featured you.
Tech stack showcases
Tools and integrations.
Portfolio clients
Agencies and freelancers.
Related: Swiper Infinite Logo Marquee
Related: Logo Marquee (CSS)
A pure CSS animation: Logo Marquee.

Got questions?

Frequently Asked Questions

Use the embla-carousel-auto-scroll plugin with loop: true. It moves the carousel by a set speed each frame. Add dragFree: true so users can throw the strip and it keeps gliding.

Pass direction: 'backward' to the Auto Scroll plugin.

Embla's loop needs enough slides to fill more than the viewport so slides can be moved out of sight before they reappear. Repeating a short list prevents a gap on wide screens.

Speed is a plugin option, so destroy the carousel and re-create it with a new plugin instance using the new speed.

Motion that lasts more than five seconds should be pausable (WCAG 2.2.2). Provide a pause button, pause on hover, and don't autoplay for users who prefer reduced motion. Logos should have text alternatives when they are images.