
A marquee is content that scrolls continuously in one direction and never stops: no arrows, no dots, no slide boundaries. The old <marquee> HTML tag has been dead for years, but the effect came back around 2021 and it’s now on half the agency sites you’ll visit.
Three ways to build one in Elementor: the free Logo Slider widget for logos, the News Ticker for text, or about twelve lines of CSS if you want it on something the widgets don’t cover. A marquee is really a carousel widget with the stops removed, which is why two of the three methods start from one. All three below, with the detail that decides whether yours loops cleanly or visibly snaps.
Start here, because it’s the reason most hand-built marquees look wrong.
A marquee is a strip of content that slides left until it’s off-screen, then jumps back to the start. If there’s only one copy of the content, you get a gap. The tail leaves, and there’s empty space until the head comes round again.
The fix is to duplicate the track. Two identical copies side by side, animated across the width of exactly one copy. When the animation resets, copy two is sitting precisely where copy one was, and the jump is invisible.
That’s it. That’s the whole technique. Every marquee you’ve seen that loops smoothly is doing this, and every one that stutters isn’t.
If you’re scrolling client logos, which is what most marquees are for, the Logo Slider widget does it without CSS. It’s in the free plugin.


Slides-per-view controls density. Six on desktop, three on tablet, two on mobile keeps the logos legible. Don’t drop to one, because a marquee showing a single logo at a time stops reading as a strip.
More on styling logo strips, including the grayscale hover treatment: the free carousel widget breakdown.
For scrolling text (announcements, headlines, a stock-ticker strip) the News Ticker widget is the purpose-built option. It’s a Pro widget.
It handles the things a hand-rolled text marquee gets wrong: it can pull from a post query rather than a static list, so a “latest news” ticker updates itself, and it has a fixed label block on the left that stays put while the content scrolls past it. That label is the detail that makes a ticker read as a ticker rather than as drifting text.
Set the direction, speed and pause behaviour in the widget’s settings. Two things worth doing:
If what you actually want is moving text without the scroll, one headline where words rotate or highlight in place, the Animated Headlines widget is the closer fit than any marquee.
For anything the widgets don’t cover (a strip of testimonial quotes, a row of icons, mixed content) a marquee is twelve lines of CSS. Put the markup in an HTML widget and the CSS in Elementor’s custom CSS field or your child theme.
<div class="ma-marquee">
<div class="ma-marquee__track">
<span>Item one</span><span>Item two</span><span>Item three</span>
<span>Item one</span><span>Item two</span><span>Item three</span>
</div>
</div>Note the content appears twice. That’s the duplicate track from earlier, not a copy-paste mistake.
.ma-marquee {
overflow: hidden;
}
.ma-marquee__track {
display: flex;
gap: 3rem;
width: max-content;
animation: ma-scroll 30s linear infinite;
}
.ma-marquee:hover .ma-marquee__track {
animation-play-state: paused;
}
@keyframes ma-scroll {
to { transform: translateX(-50%); }
}
@media (prefers-reduced-motion: reduce) {
.ma-marquee__track { animation: none; }
}Four things in there matter:
translateX(-50%) moves the track by exactly one copy’s width, because the track is two copies. This is what makes the loop invisible.linear, not ease. An eased marquee speeds up and slows down every cycle, which looks like a bug.width: max-content stops the flex track wrapping.To reverse the direction, animate from translateX(-50%) to 0. For vertical, swap to translateY and set the container height.
Slower than instinct says. A good starting point is 30 seconds for one full cycle of a six-item track, which feels almost too slow in the editor and reads as confident on a live page.
The test: can a visitor read one item without tracking it with their eyes? If they have to follow the movement, it’s too fast, and the whole strip becomes something to look away from.
Logos can go faster than text, because a logo is recognised rather than read. Text needs roughly double the dwell time.
SEO, no. The content is real text in the DOM, crawlable and indexable. Duplicating the track means the text appears twice in the source, which is worth being aware of but isn’t a duplicate-content problem at this scale, because it’s a handful of words inside one element. If it bothers you, mark the second copy aria-hidden="true", which you should do anyway.
Accessibility is the real consideration, and there are three genuine issues:
None of that makes a marquee a bad idea. It makes an unconfigured one a bad idea.
Not in core. Elementor has no dedicated marquee or ticker widget in either the free or Pro plugin. You get the effect from an addon (the free Logo Slider with autoplay delay set to zero, or the News Ticker for scrolling text) or by writing the CSS yourself. Nothing here is sold as a marquee widget; the News Ticker (Pro) is the closest purpose-built thing, since scrolling continuously is what it’s for, but it’s shaped around headline strips rather than arbitrary content.
Two options. The News Ticker widget handles it with settings, including pulling headlines from a post query. Or add an HTML widget with a duplicated content track and a CSS keyframe animating translateX to -50% on a linear infinite loop.
The track isn’t duplicated, or the animation distance doesn’t match one copy’s width. A marquee needs two identical copies of the content and an animation that moves exactly 50% of the total track width. Any other distance and you’ll see a visible snap on every cycle.
With the Logo Slider widget it’s a toggle in Carousel Settings. In CSS it’s animation-play-state: paused on hover of the container. Add :focus-within alongside :hover so keyboard users get the same pause.
Yes. Animate translateY instead of translateX, set a fixed container height, and stack the duplicated track in a column instead of a row. Vertical marquees suit testimonial strips and notification feeds better than logos.
Browsers still render <marquee>, but it’s been deprecated for years, it’s not in the HTML spec, and it gives you no control over easing, pausing or reduced-motion. Use CSS animation instead: same effect, better behaviour, and it won’t disappear in a future browser release.
Logos: the free Logo Slider, autoplay delay zero. Done in two minutes and it handles responsive density for you.
None of the twenty Widget Builder designs is a marquee, so the Logo Slider stays the tool for this job. The pricing page shows where News Ticker sits if you want the purpose-built version.
Scrolling headlines: News Ticker, because the query source and the fixed label are worth the licence on their own.
Anything else: the CSS. It’s short, it’s yours, and nothing can deprecate it.
All the carousel and slider widgets, including the ones that do marquee duty, are collected on the Elementor Carousel Widgets page, along with 20 importable carousel and slider designs, 8 of them free. If your marquee is misbehaving after a caching plugin update, the fixes in the Swiper slider troubleshooting guide apply here too.
Get all the premium widgets and templates you desire, built with clean code that keeps your site fast. Ditch the bloat, not the features.

110+ Premium Widgets & Lifetime Updates – Build Beyond Limits. An Exclusive Creation by Pixar Labs