25% off ProSNIPC25OFF

Scrolling Text Marquee Bar

Continuous CSS-animated announcement ticker bar with configurable speed and pause-on-hover.

Module2 parts · by SnipCraft

PHPLogic

php
<?php
if ( ! function_exists( 'scseed_marquee_shortcode' ) ) {
    function scseed_marquee_shortcode( $atts, $content = '' ) {
        $atts = shortcode_atts( array(
            'speed'  => '25',
            'bg'     => '#1d4ed8',
            'color'  => '#ffffff',
            'items'  => '',
        ), $atts, 'marquee_bar' );

        $speed = absint( $atts['speed'] );
        $bg    = sanitize_hex_color( $atts['bg'] ) ?: '#1d4ed8';
        $color = sanitize_hex_color( $atts['color'] ) ?: '#ffffff';

        if ( ! empty( $atts['items'] ) ) {
            $raw = array_map( 'trim', explode( '|', $atts['items'] ) );
        } elseif ( ! empty( $content ) ) {
            $raw = array( strip_tags( $content ) );
        } else {
            $raw = array( 'Welcome to our website!', 'Check out our latest offers.', 'Subscribe to the newsletter.' );
        }

        $items_html = '';
        foreach ( $raw as $item ) {
            $items_html .= '<span class="scseed-marquee-item">' . esc_html( $item ) . '</span>';
        }
        // Duplicate for seamless loop
        $track = $items_html . $items_html;

        ob_start();
        ?>
        <div class="scseed-marquee-bar" style="--sc-mq-bg:<?php echo esc_attr( $bg ); ?>;--sc-mq-color:<?php echo esc_attr( $color ); ?>;--sc-mq-speed:<?php echo esc_attr( $speed ); ?>s">
            <div class="scseed-marquee-track"><?php echo $track; ?></div>
        </div>
        <?php
        return ob_get_clean();
    }
    add_shortcode( 'marquee_bar', 'scseed_marquee_shortcode' );
}

CSSStyles

css
@keyframes scseed-marquee-scroll {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}
.scseed-marquee-bar {
  background: var(--sc-mq-bg, #1d4ed8);
  color: var(--sc-mq-color, #fff);
  overflow: hidden;
  white-space: nowrap;
  padding: .55rem 0;
  font-size: .9rem;
  font-weight: 500;
}
.scseed-marquee-track {
  display: inline-block;
  white-space: nowrap;
  animation: scseed-marquee-scroll var(--sc-mq-speed, 25s) linear infinite;
}
.scseed-marquee-bar:hover .scseed-marquee-track {
  animation-play-state: paused;
}
.scseed-marquee-item {
  display: inline-block;
  padding: 0 2.5rem;
  position: relative;
}
.scseed-marquee-item::after {
  content: '\2022';
  position: absolute;
  right: -.3rem;
  opacity: .5;
}
@media (prefers-reduced-motion: reduce) {
  .scseed-marquee-track { animation: none; }
}
#frontend#shortcode#marquee#announcement#ticker