Zoeken...  ⌘K GitHub

MarqueeTicker Social Proof

Oneindige scrollende ticker. Pauzeert bij hover. Puur CSS.

/marquee-ticker
src/components/social-proof/MarqueeTicker.astro
---
/**
 * MarqueeTicker
 * Oneindige scrollende ticker/marquee. Tekst of logo's.
 *
 * Props:
 * - items: string[] — teksten of items
 * - speed?: number — animatieduur in seconden (default: 30)
 * - direction?: 'left' | 'right'
 * - separator?: string — scheidingsteken tussen items (default: "·")
 * - bg?: string — achtergrondkleur (CSS value)
 * - color?: string — tekstkleur (CSS value)
 */
interface Props {
  items: string[];
  speed?: number;
  direction?: 'left' | 'right';
  separator?: string;
  bg?: string;
  color?: string;
}

const {
  items,
  speed = 30,
  direction = 'left',
  separator = '·',
  bg,
  color,
} = Astro.props;

// Dupliceer voor naadloze loop
const allItems = [...items, ...items, ...items];
---

<div
  class="marquee"
  style={`--marquee-speed: ${speed}s; --marquee-dir: ${direction === 'right' ? 'reverse' : 'normal'}; ${bg ? `background: ${bg};` : ''} ${color ? `color: ${color};` : ''}`}
  aria-hidden="true"
>
  <div class="marquee__track">
    {allItems.map((item, i) => (
      <>
        <span class="marquee__item">{item}</span>
        <span class="marquee__sep">{separator}</span>
      </>
    ))}
  </div>
</div>

<style>
  .marquee {
    overflow: hidden;
    white-space: nowrap;
    padding: 1rem 0;
    background: var(--color-primary);
    color: #fff;
    user-select: none;
  }
  .marquee__track {
    display: inline-flex;
    gap: 0;
    animation: marquee var(--marquee-speed, 30s) linear infinite;
    animation-direction: var(--marquee-dir, normal);
  }
  .marquee:hover .marquee__track { animation-play-state: paused; }
  .marquee__item {
    font-weight: 600;
    font-size: 0.9375rem;
    letter-spacing: 0.02em;
    padding: 0 0.75rem;
  }
  .marquee__sep {
    opacity: 0.4;
    font-size: 0.875rem;
  }
  @keyframes marquee {
    from { transform: translateX(0); }
    to { transform: translateX(-33.333%); }
  }
</style>

Props

Prop Type Default Beschrijving
items * string[] Teksten in de ticker
speed number 30 Animatieduur in seconden
direction 'left' | 'right' 'left' Scrollrichting
separator string '·' Scheidingsteken
bg string Achtergrondkleur (CSS waarde)
color string Tekstkleur (CSS waarde)

* = verplicht