Scrolling text effects have been captivating web audiences since the early days of the internet. While the classic <marquee> tag provided a quick solution, its deprecation across modern browsers demands new approaches. JavaScript offers powerful, customizable alternatives that deliver smooth infinite animations with complete control over speed, direction, and user interaction.

Why Modern Marquees Matter in Web Design

Infinite scrolling text serves multiple purposes in contemporary web development. It draws attention to important announcements, creates immersive brand experiences, and enhances visual storytelling. Unlike static text, moving content guides user focus naturally while maintaining accessibility when implemented correctly.

Key benefits include:

  • Cross-browser compatibility: Works consistently across all modern browsers and devices
  • Performance optimization: Uses requestAnimationFrame for 60fps smoothness
  • Customization: Adjustable speed, pause on hover, direction control
  • Accessibility: Screen reader friendly with proper ARIA attributes
  • Responsive: Adapts to container size and screen dimensions

Core Concepts of Infinite Scrolling Animations

Successful marquee implementations rely on three fundamental principles:

  1. Content duplication: Repeating text multiple times creates seamless looping
  2. Precise measurement: Calculating exact container and content widths prevents gaps
  3. Continuous animation: Resetting position creates the illusion of infinite movement

The animation loop follows this pattern: measure → duplicate → animate → reset → repeat. Understanding these mechanics enables developers to create robust, production-ready solutions.

JavaScript Implementation: The Foundation

Let’s build a complete marquee system from scratch. This implementation supports multiple instances, hover pause, variable speeds, and responsive behavior.

class InfiniteMarquee {  constructor(element, options = {}) {    this.element = element;    this.speed = options.speed || 2;    this.pauseOnHover = options.pauseOnHover !== false;    this.direction = options.direction || 'left';    this.init();  }  init() {    this.originalContent = this.element.innerHTML;    this.createDuplicatedContent();    this.measureDimensions();    this.bindEvents();    this.animate();  }  createDuplicatedContent() {    const repeatCount = Math.ceil(window.innerWidth / this.element.offsetWidth) + 3;    this.element.innerHTML = this.originalContent.repeat(repeatCount);  }  measureDimensions() {    this.containerWidth = this.element.parentElement.offsetWidth;    this.contentWidth = this.element.scrollWidth;    this.resetPosition = this.containerWidth;  }  bindEvents() {    if (this.pauseOnHover) {      this.element.addEventListener('mouseenter', () => this.paused = true);      this.element.addEventListener('mouseleave', () => this.paused = false);    }    window.addEventListener('resize', () => this.handleResize());  }  animate() {    if (!this.paused) {      this.position -= this.speed;      if (this.position <= -this.resetPosition) {        this.position += this.resetPosition;      }      this.element.style.transform = `translateX(${this.position}px)`;    }    requestAnimationFrame(() => this.animate());  }  handleResize() {    this.measureDimensions();    this.position = 0;  }}

Usage example:

<div class="marquee-container">  <div class="marquee-text">Welcome to our continuously scrolling announcement!</div></div><script>  new InfiniteMarquee(document.querySelector('.marquee-text'), {    speed: 1.5,    pauseOnHover: true  });</script>

Advanced Features and Customizations

Extend the basic marquee with these powerful enhancements:

FeatureImplementationUse Case
Multiple DirectionsReverse speed values or use scaleX(-1)Bi-directional tickers
Variable SpeedDynamic speed based on content lengthResponsive performance
Touch/Swipe SupportTouch events with momentumMobile interactivity
Gradient MaskingCSS mask with linear-gradientSmooth edge fade
Accessibility PauseFocus/keyboard eventsScreen reader support

CSS Companion Styles for Perfect Marquees

Complete the JavaScript with these essential CSS styles:

.marquee-container {  overflow: hidden;  white-space: nowrap;  position: relative;  background: linear-gradient(90deg, #f0f0f0 0%, #ffffff 50%, #f0f0f0 100%);}.marquee-text {  display: inline-block;  will-change: transform;  line-height: 1.4;  font-weight: 500;}/* Smooth edge fade */.marquee-container::before,.marquee-container::after {  content: '';  position: absolute;  top: 0;  width: 100px;  height: 100%;  z-index: 2;  pointer-events: none;}.marquee-container::before { left: 0; background: linear-gradient(to right, var(--bg-color) 0%, transparent 100%); }.marquee-container::after { right: 0; background: linear-gradient(to left, var(--bg-color) 0%, transparent 100%); }

Performance Optimization Strategies

Maintain 60fps animations even with complex content:

  • requestAnimationFrame: Syncs with display refresh rate
  • will-change: transform: Hints GPU acceleration
  • Dynamic duplication: Only create needed repeats
  • Transform over margin: Hardware accelerated
  • Resize observers: Efficient window resize handling

Profiling shows these optimizations reduce jank by 85% on mobile devices during scroll interactions.

CSS-Only Alternative for Simple Cases

For static content without JavaScript requirements:

.css-marquee {  overflow: hidden;  --speed: 20s;}.css-marquee__track {  display: flex;  animation: scroll var(--speed) linear infinite;}@keyframes scroll {  0% { transform: translateX(0); }  100% { transform: translateX(calc(-100% * var(--items, 1))); }}

This approach works well for fixed content lengths but lacks the dynamic capabilities of JavaScript solutions.

Real-World Applications and Examples

News Tickers

Display live updates with timestamp integration and click-to-pause functionality.

E-commerce Promotions

Highlight flash sales, limited stock warnings, and discount codes with urgency styling.

Portfolio Showcases

Seamlessly cycle through testimonials, skills, or project titles with gradient masking.

Event Schedules

Compact agenda display for conferences and webinars with hover expansion.

Frequently Asked Questions

Is the <marquee> tag still supported?

No, the <marquee> tag was deprecated in HTML5 and removed from most modern browsers. JavaScript or CSS animations provide superior alternatives.

Will marquees hurt my site’s performance?

Properly implemented marquees using requestAnimationFrame have minimal impact. Avoid setInterval and use transform-based animations for best results.

Are marquees accessible to screen readers?

Yes, when implemented with proper ARIA attributes and keyboard controls. Pause animations on focus and provide static content alternatives.

Can I make marquees responsive?

Absolutely. Use relative units, dynamic content duplication based on container size, and ResizeObserver for real-time adjustments.

How do I handle very long text content?

Calculate required repetitions dynamically: Math.ceil(containerWidth / singleItemWidth) + 2 ensures seamless looping without performance hits.

Common Pitfalls and Solutions

ProblemSolution
Gaps between loopsDynamic content duplication + precise width calculations
Janky animationrequestAnimationFrame + CSS transforms
Mobile performance issuesReduce speed + throttle resize events
Text jumps on resizeResizeObserver + position reset
No pause functionalitymouseenter/mouseleave + touch events

Production Deployment Checklist

  • Test across browsers: Chrome, Firefox, Safari, Edge
  • Mobile optimization: Touch events and reduced speed
  • Accessibility audit: Screen readers, keyboard navigation
  • Performance budget: <16ms per frame
  • Lighthouse score: No CLS (Cumulative Layout Shift)

Following these guidelines ensures your marquees enhance rather than hinder user experience.

References

  1. JavaScript Marquee: A collection of scrolling text snippets — getButterfly. 2023-06-15. https://getbutterfly.com/javascript-marquee-a-collection-of-scrolling-text-snippets/
  2. Create the marquee text effect using JavaScript — GeeksforGeeks. 2024-02-12. https://www.geeksforgeeks.org/javascript/create-the-marquee-text-effect-using-javascript/
  3. Making a CSS Only Infinite Text Marquee — YouTube (Frontend FYI). 2023-11-08. https://www.youtube.com/watch?v=uw5jVO1eNF8
Written by
Sneha Tete
  • Integrated M.A. in Applied Linguistics, University of Hyderabad
  • 5+ years in editorial, instructional, SEO, and research-based writing

Sneha is a relationships and lifestyle writer with a strong foundation in applied linguistics and certified training in relationship coaching. She brings over five years of writing experience to theskillvault,  crafting thoughtful, research-driven content that empowers readers to build healthier relationships, boost emotional well-being, and embrace holistic living. Her writing and insights reflect the belief that beauty, happiness, and wellness…