JSFiddle - React, Tailwind, and code Playground

by Константин Дралюк

HTML

<div class='news-ticker'>
  <div class="news-ticker__inner">
    <div class="news-ticker__list" data-js='news-ticker'>
      <div class='news-ticker__item'>Lorem ipsum dolor sit amet!</div>
      <div class='news-ticker__item'>Quibusdam voluptas dolorum dolorem</div>
      <div class='news-ticker__item'>Consectetur adipisicing elit</div>
      <div class='news-ticker__item'>Omnis vitae vero expedita</div>
      <div class='news-ticker__item'>Molestiae odio praesentium tempora</div>
      <div class='news-ticker__item'>Sint nisi eaque, magnam debitis quasi!</div>
    </div>
  </div>
</div>

SCSS

body {
  margin: 0;
  font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
}

.news-ticker {
  background: #ccc;
  &, * {
    box-sizing: border-box;
  }
  &__inner {
    padding: 0 1rem;
  }
  &__list {
    display: flex;
    align-items: flex-start;
    overflow: hidden;
  }
  &__item {
    white-space: nowrap;
    padding: 1.5rem .75rem;
    display: block;
    user-select: none;
  }
}

JavaScript

const $js = (selector) => document.querySelector(`[data-js='${selector}']`)
const $nt = $js('news-ticker')

let isStopped = false

$nt.onmouseover = () => isStopped = true
$nt.onmouseout = () => isStopped = true

const move = () => {
	const scrollViewWidth = $nt.scrollWidth - $nt.offsetWidth
  const isScrollable = scrollViewWidth > 0
  
  if (!isScrollable) {
  	$nt.scrollLeft = 0
  }

  if (isStopped || !isScrollable) {
  	return false
  }
  
  if ($nt.scrollLeft < scrollViewWidth) {
		$nt.scrollLeft += 1
  } else {
  	const firstChild = $nt.firstElementChild
    $nt.scrollLeft -= firstChild.offsetWidth
    $nt.appendChild(firstChild)
  }
}

setInterval(move, 10)